
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
があることがわかります。 を使用して CPU を調整し、希望する結果が得られるかどうか実験してみます。StartupCPUShares=
CPUShares=
StartupCPUShares=
個人的に、私はこのような問題を解決するために非常にローテクな方法を使用しました。一連のサービスを 1 つずつ開始し、サービスの開始の間に「スリープ」を置きました。これは の代わりに小さな bash スクリプトを使用しましたsystem
が、十分に機能しました。ありがたいことに、すべてのサービスをできるだけ早くオンラインにする必要もありません。
システムの次の反復では、おそらくそれを中心に設計し、自分で使用してみて、それが問題を解決するより良い方法であるかどうかを確認するsystemd
つもりです。StartupCPUShares=