systemdを使用して多数のサービスを開始したい(例:256)。幸いなことに、systemdはスライスを提供し、サービスの説明を非常に簡単に再利用できます。ただし、複数のプロセスを同時に開始すると、各プロセスはいくつかの開始計算を実行し、負荷が50を超えるため、システムはシャットダウンします。
スライスを使用して、すべてのサービス (After=service@%(i-1).service Wants=service@%(i-1).service) の依存関係チェーンを定義できますか?または、サービスプールのようなものを定義してから、システムでサービスの開始を管理できますか?つまり、すべてのサービスを一度に実行するのではなく、次のチャンクを開始する前に一度に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
次の構文を使用して、実行時にリソース制御パラメータを設定できます。systemctl --runtime set-property foobar.service CPUShares=777
したがって、起動中に各デバイスがより少ないCPUを使用するようにデバイスを制限し、状況が落ち着いたらより多くのCPUを使用できるようにすることができます。これは必要以上に難しいようで、次のオプションに移動します。
- では、optionsとは異なるオプションが
man systemd.resource-control
あることがわかります。 CPUを調整して、目的の結果が出ていることを確認します。StartupCPUShares=
CPUShares=
StartupCPUShares=
個人的には、私はこのような問題を解決するために非常に低いレベルの技術を使用しています。サービス開始の間に「休止」を置き、一連のサービスを一度に開始します。代わりにいくつかの bash スクリプトを使用しますsystem
が、うまく動作します。ありがたいことに、できるだけ早くすべてをオンラインにするように頼むわけではありません。
私はおそらくシステムの次の繰り返しを設計し、これが問題を解決するためのより良い方法であるかどうかを調べるために直接systemd
試してみます。StartupCPUShares=