私の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;
}