使用systemd啟動大量服務

使用systemd啟動大量服務

我想使用 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 單元文件,其中包含明確依賴鏈。以下是一些需要考慮的其他模式:

  1. systemd允許您在執行時設定資源控制參數,語法如下:

    systemctl --runtime set-property foobar.service CPUShares=777

因此,您可以在啟動期間限制您的設備,使每個設備使用較少的 CPU,然後一旦事情平靜下來,就允許它們使用更多的 CPU。這似乎比需要的更難,這讓我想到了下一個選擇...

  1. 在 中man systemd.resource-control,您會發現有一個StartupCPUShares=與 選項不同的選項CPUShares=。我會嘗試對 CPU 進行節流,StartupCPUShares=看看是否能產生您想要的結果。

就我個人而言,我使用了技術含量非常低的路線來解決這樣的問題。我一次開始了一系列服務,在服務開始之間有一個「睡眠」。這使用了一些 bash 腳本而不是system,但效果很好。值得慶幸的是,我也沒有要求絕對盡快將所有服務上線。

我可能會圍繞系統的下一個迭代進行設計systemd,並且會嘗試使用StartupCPUShares=自己來看看這是否是解決問題的更好方法。

相關內容