systemd:複数のサービスを再起動するときのスタンピード効果の解決策は何ですか?

systemd:複数のサービスを再起動するときのスタンピード効果の解決策は何ですか?

私のsystemd目標は約100の子供サービスを提供することです。単一のサブサービスを再起動すると、数秒で開始されます。

ただし、100個のサブサービスをすべて一度に再起動すると、すべてのCPUコアがクラッシュし、負荷が最大50に上昇し、すべてのサブサービスが起動するためにCPUリソースを配置して競合するため、サービスは30秒以上オフラインのままになります。

この問題に対する1つの解決策は、ローリング再起動スクリプトを作成することです。つまり、すべてのサブサービスを見つけて、3秒間隔で1つずつ再起動します。これにより、すべてのサブアイテムがすばやく表示されますが、新しいサブサービスが追加されるにつれて徐々に遅くなります。

systemdのスタンピード効果を防ぐ他の方法はありますか?適切なCPU調整により、1つのサブプロセスがCPUを使用するのを防ぎ、深刻なダウンタイムや人為的な一時停止なしにサービスを効率的に再起動できると考えました。

また、systemdを使用して依存関係チェーンを設定したくありません。現在、すべてのサブサービスは同じsystemdテンプレートを共有します。

答え1

私のテンプレートサービスにディレクティブを追加してみましCPUWeight=80たが、何の変更もないようです。どのように機能するかは、big-restartall.service単純なローリングを再開するためのロジックを含む単純なbashスクリプトを作成することです。私の場合、各サービス間の1秒間の一時停止は殺到効果を防ぐのに十分であり、プロセスの開始時間と負荷を低く保つことがわかりました。

# Restart the children of "big.target". 
for service in $(systemctl list-dependencies --plain big.target | grep -v target); {
  systemctl restart $service;
  # Give those processes a chance to start-- avoid a stampede effect.
  sleep 1;
}

関連情報