
我想使用 systemd 啟動大量(例如 256 個)服務。幸運的是,systemd 提供了切片,這使得重用服務描述變得非常容易。但同時啟動多個進程會殺死系統,因為每個進程都會進行一些啟動計算,這會將負載推至 50 以上。
是否可以使用切片為所有服務定義依賴鏈,After=service@%(i-1).service Wants=service@%(i-1).service?或者是否可以定義類似服務池之類的東西,然後 systemd 管理服務的啟動,即不是一次全部運行,而是一次啟動 10 個服務,然後再啟動下一個區塊?
答案1
我使用 找到了一個很好的解決方案ExecStartPost
。
% systemctl --user cat example@
# /home/joerg/.config/systemd/user/[email protected]
[Unit]
Description=Example of service farm; instance %i
[Service]
Type=simple
ExecStart=/bin/sleep 99999
ExecStartPost=/bin/sh -c 'test %i -gt 0 || exit 0 ; systemctl --no-block --user start %p@$((%i - 1))'
% systemctl --user start example@2
% systemctl --user status example.slice
● example.slice
Loaded: loaded
Active: active since Thu 2017-04-27 11:04:43 CEST; 27min ago
CGroup: /user.slice/user-1000.slice/[email protected]/example.slice
├─[email protected]
│ └─19423 /bin/sleep 99999
├─[email protected]
│ └─19420 /bin/sleep 99999
└─[email protected]
└─19417 /bin/sleep 99999
答案2
不,systemd 不支援類似Wants=service@%(i-1).service?
.
但是,您可以編寫一個簡單的腳本來寫出 256 個類似的 systemd 單元文件,其中包含明確依賴鏈。以下是一些需要考慮的其他模式:
systemd
允許您在執行時設定資源控制參數,語法如下:systemctl --runtime set-property foobar.service CPUShares=777
因此,您可以在啟動期間限制您的設備,使每個設備使用較少的 CPU,然後一旦事情平靜下來,就允許它們使用更多的 CPU。這似乎比需要的更難,這讓我想到了下一個選擇...
- 在 中
man systemd.resource-control
,您會發現有一個StartupCPUShares=
與 選項不同的選項CPUShares=
。我會嘗試對 CPU 進行節流,StartupCPUShares=
看看是否能產生您想要的結果。
就我個人而言,我使用了技術含量非常低的路線來解決這樣的問題。我一次開始了一系列服務,在服務開始之間有一個「睡眠」。這使用了一些 bash 腳本而不是system
,但效果很好。值得慶幸的是,我也沒有要求絕對盡快將所有服務上線。
我可能會圍繞系統的下一個迭代進行設計systemd
,並且會嘗試使用StartupCPUShares=
自己來看看這是否是解決問題的更好方法。