我有一台配备 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_us
和cpu.cfs_period_us
。来自内核的 CFS 文档:
使用配额和期限来指定组允许的带宽。在每个给定的“周期”(微秒)内,一个组最多只能消耗“配额”微秒的 CPU 时间。当某个组的 CPU 带宽消耗超过此限制(在该时间段内)时,属于其层次结构的任务将受到限制,并且在下一个时间段之前不允许再次运行。
但是,这两个选项都不允许您在不同的 CPU 之间移植组,而无需更改 cgroups 配置。