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があることがわかります。 を使用して CPU を調整し、希望する結果が得られるかどうか実験してみます。StartupCPUShares=CPUShares=StartupCPUShares=

個人的に、私はこのような問題を解決するために非常にローテクな方法を使用しました。一連のサービスを 1 つずつ開始し、サービスの開始の間に「スリープ」を置きました。これは の代わりに小さな bash スクリプトを使用しましたsystemが、十分に機能しました。ありがたいことに、すべてのサービスをできるだけ早くオンラインにする必要もありません。

システムの次の反復では、おそらくそれを中心に設計し、自分で使用してみて、それが問題を解決するより良い方法であるかどうかを確認するsystemdつもりです。StartupCPUShares=

関連情報