Pacemaker におけるスロットリング (Throttle) の仕組み

Pacemaker を運用していると、次のようなログを目にすることがあります。

notice: High CPU load detected
info: New throttle mode
debug: New job limit is 1

このログを初めて見たとき、「クラスタに異常が発生したのではないか」と不安に感じる方もいるかもしれません。しかし結論から言うと、これらのログは障害ではありません。クラスタノードの負荷が高くなったため、Pacemaker の 負荷保護機構 (スロットリング) が正常に動作したことを示すログです。

本記事では、Pacemaker の運用で頻繁に遭遇する負荷スロットリングについて、ログの意味を読み解きながら分かりやすく解説します。なお、本記事は Pacemaker 3.0.1 を前提としています。

負荷スロットリングとは何か

Pacemaker の負荷スロットリングとは、ノードの負荷が高くなった際にリソースアクション (start / stop / monitor など) の同時実行数を自動的に減らす安全機構です。Pacemaker はクラスタの状態を維持するために、リソースの起動や停止、監視など多くの処理を常に実行しています。これらは通常、並列に実行されることで迅速なフェイルオーバーや復旧を実現しています。

しかし、ノードがすでに高負荷状態のときに大量のリソース操作を同時実行すると、状況がさらに悪化する可能性があります。monitor のタイムアウトやフェイルオーバーの誤発生、さらには STONITH の誤発動などが連鎖的に発生し、クラスタ全体が不安定な状態に陥ることがあります。

このような事態を防ぐために、Pacemaker は自らの動作を意図的に減速させます。これがスロットリングです。

通常時の並列制御の仕組み

Pacemaker のリソースアクションは、通常時でも無制限に並列実行されるわけではありません。次の 2 つのパラメータで制御されています。

  • node-action-limit(ノード単位)
  • batch-limit(クラスタ全体)

node-action-limit

node-action-limit は、ノード単位で同時実行できるアクション数の上限を決めるパラメータです。デフォルト値は 0 (自動) であり、次の式で自動計算されます。

node-action-limit = CPUコア数 × 2

たとえば 4 コアのサーバであれば、最大 8 個のリソース操作を同時に実行できます。この設計により、通常時は効率よくリソース操作を処理できるようになっています。

batch-limit

batch-limit はクラスタ全体での同時実行数を制御します。node-action-limit が「各ノード単位の上限」であるのに対し、batch-limit は「クラスタ全体で同時に実行できるアクション数の上限」です。デフォルト値は 0(自動)で、Pacemaker がクラスタの状態や負荷状況を見ながら動的に調整します。

では、ノードが高負荷になった場合はどうなるのでしょうか。ここから動的スロットリングについて見ていきます。

代表的な負荷制御ログ

Pacemaker は、ノード負荷に応じたスロットリングが発生すると、次のようなログを出力します。

ここでは debug ログを有効化した場合の出力例を示します。

debug: Current load is 1.110000 across 4 core(s)
notice: High CPU load detected: 8.040000
info: New throttle mode: high load (was medium)
debug: Node node1 has high load and supports at most 8 jobs; new job limit 1

以降では、これらのログがそれぞれ何を意味しているのかを順番に解説していきます。

Current load (現在のノード負荷)

debug: Current load is 1.110000 across 4 core(s)

このログは、Pacemaker が現在のノード負荷をどのように認識しているかを示しています。

Pacemaker が負荷判定に使用している指標は load average です。ここで表示されている「Current load」は、/proc/loadavg の先頭フィールドである 1 分平均の load average を示しています。

High CPU load detected (高負荷の検出)

notice: High CPU load detected: 8.040000

このメッセージは、load average が Pacemaker の定義するしきい値を超えたことを示しています。

しきい値は load-threshold (デフォルト 80%) を基準に、CPU コア数から自動的に計算されます。Pacemaker は load average に対して、low / medium / high の 3 段階のしきい値を次の式で算出します。

low    = load-threshold × CPUコア数 × 1.2
medium = load-threshold × CPUコア数 × 1.6
high   = load-threshold × CPUコア数 × 2.0

例えば CPU 4 コア、load-threshold = 80% の場合、各段階のしきい値は次のようになります。

low    = 0.8 × 4 × 1.2 = 3.84
medium = 0.8 × 4 × 1.6 = 5.12
high   = 0.8 × 4 × 2.0 = 6.40

4 コア環境では、load average が 6.4 を超えた時点で High 判定となります。そのため、ログに表示されている 8.04 は、Pacemaker が明確に「高負荷」と判断した状態であることを意味します。

New throttle mode (スロットルモードの遷移)

高負荷が検出されると、Pacemaker はスロットルモードを変更します。

info: New throttle mode: high load (was medium)

このログは、CPU 負荷の段階に応じて、Pacemaker が並列実行数を制御するスロットルモードを medium から high に変更したことを示しています。Pacemaker は高負荷時に自らのアクション発行がさらに負荷を悪化させることを防ぐため、ジョブの同時実行数を段階的に制限します。

なお、古いバージョンではスロットルモードがビット表記で表示されることがあります。

ビット値 スロットルモード
0000 なし
0001 low
0010 medium
0100 high
1000 extreme

スロットルモードが頻繁に変動している場合は、CPU 負荷が継続的に高い状態にある可能性があります。その場合は ps や top などを用いて高負荷の原因となっているプロセスを特定する必要があります。

New job limit is 1 の意味

debug: Node node1 has high load and supports at most 8 jobs; new job limit 1

このログは、ノードの高負荷を検知した結果、Pacemaker が同時実行できるジョブ数を制限したことを示しています。

通常時、Pacemaker は CPU コア数 × 2 のジョブを同時に実行できます。例えば 4 コアのノードであれば、デフォルトでは最大 8 ジョブを並列実行できます。負荷の上昇に応じて同時実行数は段階的に引き下げられ、high モード に到達すると最終的に 1 まで縮小されます。

つまりこのログは、Pacemaker がクラスタの安定性を優先し、意図的に並列処理を最小化した状態を示しています。

動作検証

stress-ng を使用して CPU 負荷を段階的に上げると、スロットルモードがどのように遷移するかを確認できます。ここでは、その挙動をログから読み取ります。

以下のログから分かるように、負荷の上昇に伴いスロットルモードは low → medium → high と段階的に遷移し、それに合わせて job limit が 8 → 4 → 2 → 1 と減少していきます。
これは Pacemaker が想定どおりに負荷保護を実施していることを示しています。

debug: Current load is 0.020000 across 4 core(s)
debug: Current load is 0.070000 across 4 core(s)
debug: Current load is 0.240000 across 4 core(s)
debug: Current load is 1.110000 across 4 core(s)
debug: Noticeable CPU load detected: 4.750000
debug: Current load is 4.750000 across 4 core(s)
info: New throttle mode: low load (was negligible)
debug: Node node1 has low load and supports at most 8 jobs; new job limit 4
info: Moderate CPU load detected: 6.060000
debug: Current load is 6.060000 across 4 core(s)
info: New throttle mode: medium load (was low)
debug: Node node1 has medium load and supports at most 8 jobs; new job limit 2
notice: High CPU load detected: 8.040000
debug: Current load is 8.040000 across 4 core(s)
info: New throttle mode: high load (was medium)
debug: Node node1 has high load and supports at most 8 jobs; new job limit 1
notice: High CPU load detected: 9.860000
debug: Current load is 9.860000 across 4 core(s)
notice: High CPU load detected: 11.480000
debug: Current load is 11.480000 across 4 core(s)

おわりに

今回は、Pacemaker の負荷スロットリングの動作について、ログの意味や挙動を中心に解説しました。

「High CPU load detected」や「New throttle mode」といったメッセージは、障害ではなく、クラスタを安定させるための自己防衛機構が正常に動作していることを示しています。ただし、この状態が頻繁に発生する場合は、ノードに継続的な高負荷が発生している可能性があります。CPU 使用率や実行中プロセスを確認し、負荷の原因を特定・改善することが重要です。