壊れたクラスタを診断する
目標
壊れたSlurmの設定とログを受け取り、4つの原因をそれぞれ特定して修正し、復旧手順とRCAレポートを残します。
なぜ重要なのか
Slurmの障害の特徴は、ログの1行が原因をすべて語っていることです。問題は、その1行を探す順序を知らないと何日もかかる点です。順序は決まっています。sinfoで範囲を絞り、slurmctld.logで理由を読み、設定ファイルでその行を確認します。
特にmungeエラーの2種類を区別することが重要です。Expired credentialは時計の問題なのでNTPを確認し、Invalid credentialはキーの問題なのでキーファイルを比較します。まったく異なる対応です。
フィクスチャは/opt/fixtures/slurm/broken/にあります。slurm.conf、gres.conf、slurmctld.log、sinfo.txtの4つのファイルです。
ステップ
/root/rcaディレクトリを作成し、sinfo.txtから正常(idle/alloc/mix)ではない状態の、異なるノード名を1行に1つずつ/root/rca/bad-nodes.txtに書いてください。- ノード定義の不一致を見つけて、
/root/rca/node.txtに2行で書いてください。NODE=<문제 노드 이름>/KEY=<불일치가 난 설정 키 이름>(プレースホルダーは、問題のノード名と、不一致が起きた設定キーの名前です) - mungeの認証失敗を特定して、
/root/rca/munge.txtに2行で書いてください。KIND=<expired|invalid>/CAUSE=<clock|key> - パーティションが参照しているのに定義されていないノード名を、1行で
/root/rca/partition.txtに書いてください。 - GRESの個数の不一致を、
/root/rca/gres.txtに2行で書いてください。CONFIGURED=<slurm.conf 가 선언한 그 노드의 GPU 수>/REPORTED=<gres.conf 가 실제로 가리키는 장치 수>(プレースホルダーは、slurm.confが宣言したそのノードのGPU数と、gres.confが実際に指すデバイス数です) - 4つの問題をすべて直した
/root/rca/slurm.confと/root/rca/gres.confを提出してください。問題のノードのCPUsを実際の値に合わせ、パーティションのノード一覧から存在しないノードを外し、GRESの個数を一致させてください。(mungeは設定ファイルではなく運用上の問題なので、これらのファイルでは扱いません。) /root/rca/recovery.shを作成してください。次の2種類のコマンドが、順番どおりに入っている必要があります。- 設定の変更を反映するコマンド(
scontrol reconfigure) - 外れたノードを復帰させるコマンド(
scontrol update NodeName=... State=RESUME)
- 設定の変更を反映するコマンド(
/root/rca/report.txtを次の6行で作成してください。CAUSE1=cpus-mismatch/CAUSE2=munge-<3번의 CAUSE 값>/CAUSE3=unknown-node/CAUSE4=gres-count/BAD_NODES=<1번 파일의 줄 수>/FIXED=yes(プレースホルダーは、ステップ3のCAUSEの値と、ステップ1のファイルの行数です)
参考
- ログからエラーだけを見るなら、
grep -i error /opt/fixtures/slurm/broken/slurmctld.logが便利です。 - 範囲表記
gpu-node[01-04]はノード4台を意味します。展開して比較してください。 - ステップ6のファイルは、前のラボの
validate.shで検査してみるとよいです。 - よくある間違い1: ステップ1で同じノードが複数のパーティションに出てきて、重複して数える場合です。異なるノード名だけを書いてください。
- よくある間違い2: ステップ6でGRESの個数をgres.conf側に増やす場合です。実際のデバイスは4個なので、slurm.conf側を4に合わせるのが正しいです。
症状を整理する
/root/rcaディレクトリを作成し、sinfo.txtから正常(idle/alloc/mix)ではない状態の、異なるノード名を1行に1つずつ/root/rca/bad-nodes.txtに書いてください。
sinfoの出力から、正常ではない状態のノードを数えてみてください。状態の文字列を正確に書きます。
ノード定義の不一致を見つける
ノード定義の不一致を見つけて、/root/rca/node.txtに2行で書いてください。
NODE=<문제 노드 이름> / KEY=<불일치가 난 설정 키 이름>(プレースホルダーは、問題のノード名と、不一致が起きた設定キーの名前です)
ログに、どのノードがどんな理由で外れたかが書かれています。設定ファイルで、そのノードの行を確認してください。
認証失敗を特定する
mungeの認証失敗を特定して、/root/rca/munge.txtに2行で書いてください。
KIND=<expired|invalid> / CAUSE=<clock|key>
mungeのエラーには2種類あります。ログの文言をそのまま見て、どちらかを判定してください。
定義されていないノードの参照
パーティションが参照しているのに定義されていないノード名を、1行で/root/rca/partition.txtに書いてください。
パーティションのノード一覧と、実際に定義されているノードを比較してください。範囲表記を展開する必要があります。
GRESの個数の不一致
GRESの個数の不一致を、/root/rca/gres.txtに2行で書いてください。
CONFIGURED=<slurm.conf 가 선언한 그 노드의 GPU 수> / REPORTED=<gres.conf 가 실제로 가리키는 장치 수>(プレースホルダーは、slurm.confが宣言したそのノードのGPU数と、gres.confが実際に指すデバイス数です)
2つの設定ファイルの個数をそれぞれ数えて比較します。ログにも数字が出ています。
修正版を提出する
4つの問題をすべて直した/root/rca/slurm.confと/root/rca/gres.confを提出してください。問題のノードのCPUsを実際の値に合わせ、パーティションのノード一覧から存在しないノードを外し、GRESの個数を一致させてください。(mungeは設定ファイルではなく運用上の問題なので、これらのファイルでは扱いません。)
4つの問題をすべて直す必要があります。前のラボで作成した検証スクリプトを再利用できます。
復旧手順を作成する
/root/rca/recovery.shを作成してください。次の2種類のコマンドが、順番どおりに入っている必要があります。
- 設定の変更を反映するコマンド(
scontrol reconfigure) - 外れたノードを復帰させるコマンド(
scontrol update NodeName=... State=RESUME)
設定の反映とノードの復帰は、別々のコマンドです。順序も重要です。
RCAレポート
/root/rca/report.txtを次の6行で作成してください。
CAUSE1=cpus-mismatch / CAUSE2=munge-<3번의 CAUSE 값> / CAUSE3=unknown-node / CAUSE4=gres-count / BAD_NODES=<1번 파일의 줄 수> / FIXED=yes(プレースホルダーは、ステップ3のCAUSEの値と、ステップ1のファイルの行数です)
4つの原因を、決められたキーで整理します。値は、前のステップで特定したものである必要があります。