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

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

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

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

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

CPU升级时有没有办法避免这个问题呢?

答案1

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

请注意,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 配置。

相关内容