应用混部场景如何基于 cgroup v2 控制

cgroup v2 如何控制应用 cpu 抢占优先级

在 cgroup v2 中,资源控制策略进一步改进以提供更好的资源管理和资源优先级设置。要控制应用在 CPU 和内存上抢占计算资源的优先级,可以使用以下几个 cgroup v2 的属性:

1. CPU 控制

在 cgroup v2 中,CPU 资源管理主要使用 cpu.maxcpu.weight 来实现:

  • cpu.max : 定义 cgroup 可以使用的 CPU 时间限制。它允许您设置 CPU 限制,通过设置时间和周期来控制 cgroup 的可用 CPU 资源。例如,您可以将 cpu.max 设置为 200ms 1000ms,这意味着该 cgroup 每 1000 毫秒(1 秒)可使用 200 毫秒的 CPU 时间。

    bash 复制代码
    # 为 cgroup 设置 CPU 时间限制
    echo "200000 1000000" | sudo tee /sys/fs/cgroup/cpu/cgroup_name/cpu.max
  • cpu.weight : 提供了一种相对优先级的设置机制。cpu.weight 的值范围是 1 到 9999,数值越大则优先级越高。通过设置不同的权重值,可以控制不同 cgroup 之间的抢占优先级。

    bash 复制代码
    # 为 cgroup 设置 CPU 权重
    echo "500" | sudo tee /sys/fs/cgroup/cpu/cgroup_name/cpu.weight  # 中等优先级
    echo "1000" | sudo tee /sys/fs/cgroup/cpu/cgroup_name/cpu.weight  # 较高优先级

2. 内存控制

在 cgroup v2 中,您可以使用以下属性来管理内存资源并控制优先级:

  • memory.max: 限制 cgroup 使用的最大内存量,如果超出限制,则可能会杀死该 cgroup 内的进程。

    bash 复制代码
    # 设置 cgroup 最大内存限制
    echo "1G" | sudo tee /sys/fs/cgroup/memory/cgroup_name/memory.max
  • memory.high: 提供一个较高的内存使用阈值。当 cgroup 使用的内存超过该值时,内核会考虑限制该 cgroup 的行为,可以通过此属性来策略性地安排内存使用。

    bash 复制代码
    # 设置内存高阈值
    echo "900M" | sudo tee /sys/fs/cgroup/memory/cgroup_name/memory.high
  • memory.low: 为该 cgroup 设置一个建议的最低内存使用量。如果系统资源紧张,内核会尽量保证该 cgroup 不会低于这个阈值。

    bash 复制代码
    # 设置内存低阈值
    echo "800M" | sudo tee /sys/fs/cgroup/memory/cgroup_name/memory.low

3. I/O 控制

虽然提问中主要关注 CPU 和内存,通过 I/O 控制也可以间接影响应用的优先级:

  • io.max: 设置 I/O 设备的最大使用限制,可以限制应用程序对 I/O 资源的使用优先级。

    bash 复制代码
    # 设置 I/O 限制
    echo "blkio:device_name 1000" | sudo tee /sys/fs/cgroup/io/cgroup_name/io.max

4. 综述

通过合理使用 cgroup v2 中的 cpu.max, cpu.weight, memory.max, memory.high, 和 memory.low ,您可以在混合部署场景中优先考虑某些应用程序的资源使用,同时有效控制其他应用的资源抢占:

  • 设定 CPU 权重 :通过 cpu.weight 来相对定义每个应用的优先级。
  • 限制最大资源使用 :通过 cpu.maxmemory.max 设置硬限制,确保资源不被某个进程过度占用。
  • 控制内存的使用策略 :使用 memory.highmemory.low 为重要任务设置优先策略,并在资源紧张时做出相应调整。

cpu.weightnice 是 Linux 系统中用于管理进程 CPU 调度和资源分配的重要概念,但它们存在一些关键区别和关联。

cpu.weight 和 cpu 的 nice 指标有什么关系?

1. cpu.weight

cpu.weight 是 cgroup v2 中用于控制资源分配的一个属性。它允许您为不同的控制组(cgroups)分配相对的 CPU 调度权重。

  • 范围cpu.weight 的值范围从 1 到 9999。值越高,优先级越高。一个 cgroup 如果设置 cpu.weight 为 1000,而另一个 cgroup 设置为 5000,那么后者将获得更多的 CPU 时间。
  • 用途 :在多任务场景中,您可以使用 cpu.weight 来调整不同失控 CGroup 之间的调度优先级,从而实现更细粒度的资源管理。

2. nice

nice 是 Linux 中用于调整进程调度优先级的一个属性。它通过设置调度级别影响进程的 CPU 时间分配。

  • 范围nice 值范围从 -20(最高优先级)到 19(最低优先级)。默认值是 0,使用nice 命令可以更改进程的优先级。例如,nice -n 10 your_command 会将该命令的 nice 值设置为 10。
  • 用途nice 影响的是进程的内核调度器如何分配 CPU 时间。优先级高的进程会相对频繁地获得对 CPU 的访问。

3. 关系和区别

  • 作用层面

    • cpu.weight 主要用于 cgroup 层面,影响整个控制组的 CPU 调度,能用于整合管理多个进程。
    • nice 则是在进程层面设置的,直接影响单个进程的调度优先级。
  • 整合管理

    • 当您针对 cgroup 中的进程设置一个 cpu.weight 值时,这会与进程的 nice 值一起影响该 cgroup 中进程的 CPU 时间分配。
    • 实际上,cpu.weightnice 两者共同作用:在相同的 cgroup 下,nice 值较低的进程会扮演更高的角色,但 cgroup 的 cpu.weight 也会整体影响该组进程的调度优先级。

4. 调度器的工作方式

Linux 调度器在决定如何分配 CPU 时间时,会考虑到所有运行中的进程的 nice 值和 cgroups 的 cpu.weight 值。因此,不同的 cpu.weight 设置和 nice 值组合将直接影响资源的分配和调度:

  • 如果一个进程的 nice 值很低(比如 -20),而它的 cgroup 中的权重值也高,那么即使在高负载下,这个进程也会优先获得更多的 CPU 资源。
  • 反之,如果一个进程的 nice 值高(比如 19),无论其所属 cgroup 的权重值如何,它会得到相对较少的 CPU 资源。

5. 总结

通过cpu.weightnice,用户可以灵活地管理和优化进程的 CPU 使用优先级。这使得在复杂系统中优化资源分配成为可能,尤其是在使用 cgroups 管理多个负载时。

相关推荐
uhakadotcom3 分钟前
Mypy入门:Python静态类型检查工具
后端·面试·github
喵个咪8 分钟前
开箱即用的GO后台管理系统 Kratos Admin - 定时任务
后端·微服务·消息队列
Asthenia041210 分钟前
ArrayList与LinkedList源码分析及面试应对策略
后端
Asthenia041240 分钟前
由浅入深解析Redis事务机制及其业务应用-电商场景解决超卖
后端
Asthenia041241 分钟前
Redis详解:从内存一致性到持久化策略的思维链条
后端
Asthenia041241 分钟前
深入剖析 Redis 持久化:RDB 与 AOF 的全景解析
后端
Apifox1 小时前
如何在 Apifox 中通过 CLI 运行包含云端数据库连接配置的测试场景
前端·后端·程序员
掘金一周1 小时前
金石焕新程 >> 瓜分万元现金大奖征文活动即将回归 | 掘金一周 4.3
前端·人工智能·后端
uhakadotcom1 小时前
构建高效自动翻译工作流:技术与实践
后端·面试·github
Asthenia04121 小时前
深入分析Java中的AQS:从应用到原理的思维链条
后端