← システム性能分析のしくみ コース
6. PSI — 「足りない」を時間で測る
PSI(Pressure Stall Information)の some と full の読み方を図で追っていきましょう。
① 3つのファイルが並んでいる
/proc/pressure/リソース逼迫の窓口
配下に3ファイル
cpuCPUの順番待ち
memoryスワップイン・リフォルト・回収待ち
ioストレージI/O待ち
- ・カーネル公式ドキュメント accounting/psi によると、pressure の情報は /proc/pressure/ 配下のファイルで公開されます
- ・cgroup2 の各ディレクトリにも cpu.pressure / memory.pressure / io.pressure が同じ書式で用意されます
見たいリソースごとにファイルが分かれています。まずは memory を開くところから始めます。
② 1ファイルに some と full の2行
cat /proc/pressure/memory
2行が返る
some avg10=... avg60=... avg300=... total=...1つ以上が待たされていた割合
full avg10=... avg60=... avg300=... total=...全員が同時に待たされていた割合
- ・どのファイルも some と full の2行、フィールド構成は共通です
- ・avg の単位はパーセント、total の単位はマイクロ秒です
1ファイルにつき2行。この some と full の差が、このレッスンの主役です。
③ some は「誰か1人でも待っていた時間」
タスクAメモリ待ちで停止
タスクBCPUで実行中
タスクCCPUで実行中
この状態の判定は
some に計上される少なくとも1つが停滞している
full には計上されない全員ではないため
- ・公式ドキュメントは some を「少なくとも一部のタスクが当該リソース待ちで停滞していた時間の割合」と定義しています
- ・メモリの停滞にはスワップイン待ち、ページキャッシュのリフォルト、ページ回収が含まれます
- ・BとCは仕事を進めているので、システム全体としてはまだ前に進んでいます
1つでも待っていれば some。混雑の兆候は拾えますが、深刻さまでは分かりません。
④ full は「全員が同時に止まっていた時間」
タスクAメモリ待ちで停止
タスクBメモリ待ちで停止
タスクCメモリ待ちで停止
非アイドルのタスクが全員停滞
some にも full にも計上full は some に含まれる状態
このとき何が起きているか
CPUサイクルが無駄になる走らせる仕事があるのに誰も走れない
- ・公式ドキュメントは full を「非アイドルのタスクが全員同時に停滞していた時間の割合」と定義しています
- ・この状態では実CPUサイクルが浪費され、長く続く状態はスラッシングと表現されています
full の時間は純粋な浪費です。だから深刻度の判断には full を見ます。
⑤ なぜ full=0 でも some が高くなるのか
some=40 / full=0待つ人はいるが他が走っている
some=40 / full=35待つ間ほぼ誰も走れていない
数字が分かれる理由
走れるタスクが残っているか残っていれば full は上がらない
取るべき解釈
左は余力ありレイテンシは悪化しうる
右はスループット喪失増設・削減の判断材料
- ・some が同じでも full が違えば、失われている仕事量が違います
- ・定義上、全員停滞は「1つ以上停滞」に必ず含まれるため、full が some を超えることはありません
some だけ見て慌てないこと。full が上がったときに初めて、処理そのものが止まっていると判断できます。
⑥ avg10 / avg60 / avg300 と total
avg10直近10秒の割合(%)
avg60直近60秒の割合(%)
avg300直近300秒の割合(%)
total累計停滞時間(マイクロ秒)
読み分け方
avg10 が高く avg300 が低い今まさに起きているスパイク
avg300 も高い慢性的な逼迫
total の使い道
2時点の差を取る任意区間の停滞時間を自分で計算できる
- ・avg は10秒・60秒・300秒の3つの時間窓で報告されます
- ・公式ドキュメントは total を、レイテンシのスパイク検出や任意の時間枠での傾向の平均化に使えると説明しています
急な悪化は avg10、続いているかは avg300。厳密に測りたいときは total の差分を使います。
⑦ cpu の full が常に0な理由
cpu の fullシステム全体では未定義
考えてみると
CPU待ちのタスクがいる= 別の誰かがCPUを使っている
つまり
「全員が同時にCPU待ち」が成立しないCPUは浪費されていない
実装上の扱い
5.13以降も互換のため0を報告欠落させず0で埋める
- ・公式ドキュメントは「CPU の full はシステムレベルでは未定義だが、5.13 以降報告されているため後方互換のためゼロに設定される」と述べています
- ・未定義である理由まではドキュメントに書かれていませんが、上図の考え方で理解できます
- ・cgroup2 で CPU 使用量を制限した場合など、cgroup 単位では意味を持ちうる値です
cpu の full=0 は異常ではなく仕様です。CPU は some、メモリとI/Oは full まで見ましょう。