負荷とCPUの診断
目標
ロードアベレージが何を数えているのかを直接確認し、CPU使用率・PSI・スロットリングカウンターを一緒に読んで、「メトリクスは正常なのに遅い」状況を説明できるようにします。
なぜ重要なのか
Linuxのロードアベレージは、CPU待ちだけを数えません。ディスクやNFSの応答を待つD状態のタスクも一緒に数えます。そのため、8コアのサーバーでロードが24なのにCPUアイドルが60%という状況は、正常な動作です。そのときにCPUを増やすのは、お金を使うだけです。反対に、コンテナのcgroupスロットリングは、ロードにも、stealにも、使用率にも現れません。スロットルされたタスクはランキューから完全に外れるためです。そのため、cpu.statのカウンターを別に見る必要があります。このラボで「なければないと書く」ことまで採点する理由は、現場でもそのファイルの有無を確認することが最初の動作だからです。
ステップ
/root/loadディレクトリで作業します。
- この環境のCPU数を、数字だけ
/root/load/cpus.txtに書いてください。 - CPUを使い続けるプロセスを2個以上バックグラウンドで起動し、PIDを
/root/load/burner_pids.txtに1行に1つずつ書いてください。以降のステップの間ずっと生きている必要があります。 - 1–2分待ってから、
/proc/loadavgの1分平均を/root/load/load1.txtに書いてください。0.7以上である必要があります。 - それらのプロセスの現在の状態を表す文字を1つ、
/root/load/state.txtに書いてください。 - 最初のプロセスの累積CPU時間(秒)を、整数で
/root/load/cpu_sec.txtに書いてください。5秒以上である必要があります。 /proc/pressure/cpuのsome行からavg10の値を/root/load/psi.txtに書いてください。ファイルがなければunavailableと書いてください。- cgroupの
cpu.statからnr_throttledの値を、nr_throttled=<값>の形式で/root/load/throttle.txtに書いてください(プレースホルダーは値です)。読み取れなければunavailableと書いてください。 /root/load/loadcheck.sh <임계비율>を作成してください(プレースホルダーはしきい値の比率です)。1분 부하 평균 / CPU 개수(韓国語の語は、順に「1分のロードアベレージ」と「CPUの個数」を意味します)がしきい値の比率を超えたら、high load=<값> cpus=<개수>を出力して終了コード1です(プレースホルダーは、順に値とCPUの個数です)。超えなければokを出力して終了コード0です。引数がなければ、0以外のコードで終了します。
参考
python3 -c "while True: pass" &で、CPUを使い続けさせることができます。/proc/<PID>/statのフィールドはpid (comm) state ...の順で、14番目と15番目がutime/stime(clock tick)です。awk 'BEGIN {exit (a/b > t) ? 1 : 0}'の形で、bcなしで小数を比較できます。- よくあるミス1: ステップ3で、負荷をかけた直後に読むと値が低く出ます。指数減衰平均は、1分後でも63%しか反映されません。
- よくあるミス2: ステップ8で、負荷をかけているプロセスを先に片付けてしまうと、判定テストが失敗します。
CPU数を確認する
この環境のCPU数を、数字だけ/root/load/cpus.txtに書いてください。
nprocが最も簡単です。ロードアベレージは、この数字と並べて初めて意味を持ちます。
CPUを使い続けるプロセスを起動する
CPUを使い続けるプロセスを2個以上バックグラウンドで起動し、PIDを/root/load/burner_pids.txtに1行に1つずつ書いてください。以降のステップの間ずっと生きている必要があります。
無限ループを回すpython3のプロセスが2つあればよいです。PIDを1行に1つずつ書いてください。
ロードアベレージが上がることを確認する
1–2分待ってから、/proc/loadavgの1分平均を/root/load/load1.txtに書いてください。0.7以上である必要があります。
指数減衰平均なので、すぐには上がりません。1–2分待ってから、/proc/loadavgの最初の値を読んでください。
プロセスの状態を表す文字を読む
それらのプロセスの現在の状態を表す文字を1つ、/root/load/state.txtに書いてください。
/proc//statの3番目のフィールドが状態です。CPUを使い続けるプロセスは、どの文字でしょうか。
累積CPU時間を測る
最初のプロセスの累積CPU時間(秒)を、整数で/root/load/cpu_sec.txtに書いてください。5秒以上である必要があります。
/proc//statのutimeとstimeを足して、clock tick(通常は100)で割ります。
PSIのプレッシャーメトリクスを読む
/proc/pressure/cpuのsome行からavg10の値を/root/load/psi.txtに書いてください。ファイルがなければunavailableと書いてください。
/proc/pressure/cpuのsome行にavg10があります。ファイルがなければunavailableと書いてください。
cgroupのスロットリングカウンター
cgroupのcpu.statからnr_throttledの値を、nr_throttled=<값>の形式で/root/load/throttle.txtに書いてください(プレースホルダーは値です)。読み取れなければunavailableと書いてください。
cpu.statにnr_periodsとnr_throttledがあります。読み取れなければunavailableです。
ロード判定スクリプト
/root/load/loadcheck.sh <임계비율>を作成してください(プレースホルダーはしきい値の比率です)。1분 부하 평균 / CPU 개수(韓国語の語は、順に「1分のロードアベレージ」と「CPUの個数」を意味します)がしきい値の比率を超えたら、high load=<값> cpus=<개수>を出力して終了コード1です(プレースホルダーは、順に値とCPUの個数です)。超えなければokを出力して終了コード0です。引数がなければ、0以外のコードで終了します。
ロードアベレージをコア数で割った比率を、しきい値と比較します。bcなしでも、awkで小数を比較できます。