Linux cgroups:以绝对值限制 CPU 使用率,不依赖于 CPU 速度

Ant*_*ich 6 linux cpu limit cgroups quota

我有一台带有 2.4GHz 处理器的服务器。并且有多个 cgroup,每个允许使用 25% 的 CPU。这等于 600MHz。

然后我用更快的 CPU 替换了 CPU,比如说 3.0GHz。如果我使用cpu.shares,我的容器将继续获得 3.0GHz 的 25%,现在等于 750MHz。

这意味着在更换 CPU 后,我必须重新配置我的 cgroup,使它们消耗不超过 20% 的 CPU。

有没有办法在CPU升级过程中避免这种麻烦?

ivo*_*ron 2

群体之间的份额是相对的。例如,分配 25% 的 CPU 意味着 cgroup 将“至少”观察到那么多的 CPU,但它可以使用更多。来自cgroups 上的红帽文档

请注意,CPU 时间份额分布在多核系统上的所有 CPU 核心上。即使 cgroup 在多核系统上限制为低于 100% 的 CPU,它也可以使用每个单独 CPU 核心的 100%。

...

cgroup 可用的实际 CPU 时间量可能会有所不同,具体取决于系统上存在的 cgroup 数量。如果一个 cgroup 的相对份额为 1000,而其他两个 cgroup 的相对份额为 500,则当所有 cgroup 中的进程尝试使用 100% 的 CPU 时,第一个 cgroup 将获得所有 CPU 时间的 50%。但是,如果添加另一个相对份额为 1000 的 cgroup,则第一个 cgroup 只允许使用 33% 的 CPU(其余 cgroup 获得 16.5%、16.5% 和 33% 的 CPU)。

如果您想对 CPU 带宽进行硬限制,可以使用cpu.cfs_quota_uscpu.cfs_period_us。来自内核的 CFS 文档

使用配额和期限来指定组允许的带宽。在每个给定的“周期”(微秒)内,一个组最多只能消耗“配额”微秒的 CPU 时间。当某个组的 CPU 带宽消耗超过此限制(在该时间段内)时,属于其层次结构的任务将受到限制,并且在下一个时间段之前不允许再次运行。

但是,这两个选项都不允许您在不同的 CPU 之间移植组,而无需更改 cgroups 配置。