应用混部场景如何基于 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 管理多个负载时。

相关推荐
oak隔壁找我2 分钟前
Spring Boot MongoDB 使用技巧
java·后端
倚栏听风雨10 分钟前
RAG检索增强生成(Retrieval Augmented Generation)
后端
倚栏听风雨22 分钟前
召回率 精准率 F1 概念解释
后端
间彧24 分钟前
消息队列在流量削峰场景下如何设置合理的队列长度和消费速率?
后端
程序员爱钓鱼37 分钟前
Python编程实战 · 基础入门篇 | 数据类型简介:数字、字符串、布尔值
后端·python
间彧37 分钟前
在微服务架构下,wait/notify是否还适用?有哪些替代方案?
后端
间彧43 分钟前
消息队列和事件驱动如何实现流量削峰
后端
间彧44 分钟前
Java Object对象wait()、notify()、notifyAll()函数详解与项目实战
后端
Moment1 小时前
Node.js v25.0.0 发布——性能、Web 标准与安全性全面升级 🚀🚀🚀
前端·javascript·后端