我有一个 systemd 服务(一个 CI 运行程序),它往往会因 CPU 密集型作业而使系统陷入困境。我刚刚发现平均负载超过 100,并想停止这种胡说八道。
系统上的任何其他内容都不受任何限制,因此我希望其他所有内容都像现在一样继续运行,但要么:
- (a) 作为 CI 作业运行的唯一用户的每个进程,或
- (b) systemd 服务守护进程实例化的任何子进程
... 对系统上的所有其他内容起到次要作用。事实上,即使系统上没有其他东西需要剩余 10% 的 CPU 周期,我也希望他们有 90% 的绝对上限,但如果有其他任何东西都需要 CPU 时间,我希望他们获得尽可能多的 CPU 时间他们想先。
配置它的最佳方法是什么?我在 EC2 上运行 Arch Linux,并且有可用的 cgroup(包括 cgmanager),但从未使用过它们。
首先,网络搜索中出现的大部分内容已被弃用。例如
cgmanager
,新的 systemd 版本不再支持。cuplimit
就使用、或其他工具来完成这项工作而言nice
,不要遵循网络搜索中 99% 的内容。cgset
它们要么根本无法像宣传的那样工作(就像 cgroup 管理工具希望您创建自己的层次结构一样),要么如果不采取大量黑客措施就无法完成工作(例如使用 '很好的级别来管理整个流程组)。好消息是,随着这些弃用(并追求 systemd 传统的吞噬一切的章鱼怪物 的作案方式),系统上的所有内容都已存在默认配置,并且为 systemd 服务调整它是微不足道的。只需将覆盖配置添加到您要限制的服务:
添加一个包含您想要覆盖的任何资源控制值的部分。就我而言,我想出了这个:
这些值并非都是必需的,但前两个回答了所提出的问题:
CPUWeight
系统上所有进程的默认值为 100。如果没有其他方法可以有效地保持系统对其他任务的响应,同时又不会大大降低结果的速度,那么设置一个较低的值仍然可以让进程使用 CPU。这是一个任意权重整数。CPUQuota
是对授予多少 CPU 时间的绝对限制,即使没有其他任何事情发生。这是一个百分比值。在我的情况下,没有必要设置它来解决资源占用问题。当大量 CI 工作堆积起来时,我最终还是设置了它以降低 CPU 温度。IOWeight
与 非常相似CPUWeight
,在这种情况下,用于为系统任务保持磁盘空闲,并且仅在没有其他事情发生时让它们忙于 CI 作业。MemorySwapMax
也不在问题的范围内,就我而言,我最终添加了它,因为povray
在某些 CI 作业中运行的光线遍历器 (这个系统是个好主意,因为它就在那里。如果您根本不让它使用它,它会运行得更快。这可能是在 povray 中配置得更好的东西,但这样我就不必监管 CI 作业内部发生的事情,也不必禁用系统交换。最后,这些值可以即时更改,而无需通过运行重新启动服务
systemctl daemon-reload
。这对于立即查看更改的效果非常方便。