如何限制 systemd 服务与 CPU“友好相处”?

如何限制 systemd 服务与 CPU“友好相处”?

我有一个 systemd 服务(一个 CI 运行程序),它往往会因 CPU 密集型作业而使系统陷入困境。我刚刚发现平均负载超过 100,我想制止这种胡言乱语。

系统上的其他任何内容都不受任何方式的限制,因此我希望其他一切都像现在一样继续运行,但是:

  • (a) 每个进程以 CI 作业运行的唯一用户身份运行,或者
  • (b) 由 systemd 服务守护进程实例化的任何子进程

...对系统上的其他一切都起着次要作用。事实上,我希望它们有 90% 的绝对上限,即使系统上没有其他东西需要剩余 10% 的 CPU 周期,但如果有其他任何东西需要 CPU 时间,我希望它们获得尽可能多的 CPU 时间。他们想要第一。

配置此功能的最佳方法是什么?我在 EC2 上运行 Arch Linux,并且有可用的 cgroup(包括 cgmanager),但从未使用过它们。

答案1

首先,网络搜索中出现的大部分内容已被弃用。例如,cgmanager新的 systemd 版本不再支持。就使用cpulimitnicecgset其他工具来完成这项工作而言,不要遵循网络搜索中 99% 的内容。它们要么根本无法像宣传的那样工作(就像 cgroup 管理工具期望您创建自己的层次结构一样),或者在不诉诸大量 hack 的情况下无法完成工作(就像使用 '很好的级别来管理整个进程组)。

好消息是,除了这些反对意见(以及追求传统的吞噬一切的章鱼怪物 作案手法systemd)系统上的所有内容都有默认配置,并且针对 systemd 服务调整它是微不足道的。只需向要限制的服务添加覆盖配置即可:

$ sudo systemctl edit <servicename>

添加一个包含任何内容的部分资源控制值你想覆盖。就我而言,我想出了这个:

[Service]
CPUWeight=20
CPUQuota=85%
IOWeight=20
MemorySwapMax=0

这些值并非都是必需的,但前两个值回答了所提出的问题:

  • CPUWeight对于系统上的所有进程,默认值为 100。如果没有其他方法可以有效地保持系统对其他任务的响应,同时又不会大幅减慢结果,那么设置较低的值仍然可以让进程使用 CPU。这是一个任意权重整数。
  • CPUQuota即使没有发生其他事情,也是授予多少 CPU 时间的绝对限制。这是一个百分比值。就我而言,实际上没有必要设置它来解决资源占用问题。无论如何,我最终还是将其设置为在大量 CI 作业堆积时降低 CPU 温度。
  • IOWeight与 非常相似CPUWeight,在本例中用于使磁盘空闲以用于系统任务,并且仅在没有其他事情发生时让它们忙于 CI 作业。
  • MemorySwapMax也不在问题的范围内,在我的例子中,我最终添加了它,因为povray在某些 CI 作业中运行的光线遍历器 () 似乎认为除了 30+ Gigs 的 RAM 之外还使用 30+ Gigs 的交换这个系统是个好主意,因为它就在那里。如果你根本不让它使用它,它会运行得更快。这可能是 povray 中更好的配置,但这样我就不必监视 CI 作业内部发生的情况,也不必禁用系统交换。

最后,这些值可以即时更改,无需通过运行重新启动服务systemctl daemon-reload。这对于立即观察更改的效果非常方便。

相关内容