Systemd
如何限制 systemd 服務與 CPU “玩得很好”?
我有一個 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 服務調整它是微不足道的。只需將覆蓋配置添加到您要限制的服務:
$ 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 作業中執行的光線遍歷器 (這個系統是個好主意,因為它就在那裡。如果您根本不讓它使用它,它會執行得更快。這可能是在 povray 中配置得更好的東西,但這樣我就不必監管 CI 作業內部發生的事情,也不必禁用系統交換。最後,這些值可以即時更改,而無需通過執行重新啟動服務
systemctl daemon-reload
。這對於立即查看更改的效果非常方便。