LabHub

ブログ

htopとtopを完全に読む — すべての数字の意味

한국어English日本語中文

はじめに — 数字の洪水

Linuxサーバーで htoptop を初めて開くと、数字と色の洪水に圧倒されます。多くの人はCPUとメモリのパーセントだけを何となく見て残りを無視しますが、その数字一つひとつには、システムの状態を診断するのに必要な情報が詰まっています。最近Hacker Newsの上位に再び上がったペテリス・ニキフォロフス(Pēteris Ņikiforovs)の名解説「Explanation of everything you can see in htop」がこの話題を再び照らしたのを機に、この記事ではそれらのフィールドを一つずつ分解します。

プロセスの列を読む

プロセス一覧の各列が何を意味するかから見ていきましょう。

VIRT、RES、SHR — メモリ三値の罠

メモリの列は最もよく誤解される部分です。三つの値の意味はまったく異なります。

ここで重要な実務上の教訓が一つ出ます。メモリを多く食うプロセスを探すときは、VIRTではなく RESで並べ替える べきだということです。VIRTで並べ替えると、実際にはメモリをあまり使っていないのにアドレス空間だけ大きく取ったプロセスが上位に来て、判断を誤りやすくなります。

プロセス状態の文字

S 列には一文字のプロセス状態が表示されます。各文字の意味は次のとおりです。

ロードアベレージ — CPU使用率とは違う

最も広く誤解される指標が ロードアベレージ(load average) です。よく「CPU使用率」と同じだと思われますが、そうではありません。

第一に、ロードアベレージは単純な平均ではなく 指数減衰移動平均 です。1分、5分、15分の三つの値が表示され、最近の値により大きな重みを置きます。1分値はおおよそ、直近1分の負荷を63%、それ以前を37%ほど混ぜた値です。

第二に、そしてより重要な点 — ロードは実行中の(R)プロセスだけでなく、割り込み不可能なスリープ(D)状態のプロセスも一緒に数えます。 このため、ロードが高いからといって必ずしもCPUが忙しいわけではありません。ディスクやネットワークの入出力を待つプロセスが多くても、ロードは跳ね上がります。

第三に、ロードはコア数を基準に解釈すべきです。N個のコアを持つマシンでロードがNなら、おおよそ100%の利用状態です。コアが4個でロードが4なら飽和状態、コアが8個でロードが4なら半分しか使われていないことになります。

これら三つを総合すると強力な診断ルールが出ます。ロードは高いのに %CPU が低ければ、十中八九は入出力待ち(I/O wait) です。このときは D 状態のプロセスを探すのが問題解決の出発点です。

メーターの色

htop上部のバーメーターも色で情報を伝えます。

ここでバッファとキャッシュを「使われているメモリ」と勘違いしないことが重要です。バッファとキャッシュはカーネルが性能のために一時的に借りている領域で、アプリケーションがメモリを必要とすればすぐに返されます。ですから実際に注目すべき値は「used」ではなく 利用可能メモリ(available) です。Linuxで「メモリがほぼ一杯だ」という画面がたいてい問題ではない理由がこれです。キャッシュで埋まったメモリは、必要なときに空けられる、事実上の余裕メモリです。

ゾンビプロセスの正体

ゾンビ(Z)プロセスはよく誤解されます。いくつかの事実を整理します。

ゾンビはすでに死んだプロセスです。実行を終えましたが、親プロセスがその終了ステータスをまだ回収(reap)していないため、プロセステーブルに項目だけが残っている状態です。そのためゾンビは メモリをまったく消費しません。 ただプロセステーブルのスロットを一つ占めるだけです。

また、ゾンビは 殺せません。 プロセスを終了させるにはシグナルを送りますが、シグナルは生きているプロセスしか受け取れません。すでに死んだゾンビに kill -9 を送っても無駄です。ゾンビが消える唯一の道は、親がそれを回収することです。もし親が先に死ぬと、ゾンビはinit(PID 1)に引き取られ、initが代わりに回収します。

つまりゾンビが数個見えても慌てる必要はありません。ゾンビが積み上がり続けるなら、それはゾンビ自体が問題というより、子を正しく回収しない親プロセスのバグを示す信号です。

コピーオンライトとRESの錯覚

一つ微妙な現象を付け加えます。プロセスが fork で子を作ると、Linuxは コピーオンライト(copy-on-write) を使います。親と子が同じ物理メモリページを共有し、どちらかが書き込みをするときにだけそのページを複製します。

このため、htopで親と子がそれぞれ全RESをまるごと表示することがあります。見かけ上はメモリを二倍使っているようですが、実際の物理メモリは共有されており、合計はそれほど大きくありません。プロセスを多くforkするプログラムのメモリを見るときは、この錯覚を念頭に置く必要があります。

実戦の診断レシピ

ここまでの内容を実際のトラブルシューティングに適用すると、次のようになります。

これらのツールをブラウザで直接触ってみたいなら、このサイトの LinuxターミナルWebターミナル を、カーネルパラメータがこうした動作にどう関わるかを見たいなら カーネルパラメータ探索 を併せて開いてみるとよいでしょう。

おわりに

htopとtopの数字は最初は暗号のように見えますが、各フィールドの意味を知れば、システムの状態を読む強力な診断ツールになります。特にVIRTとRESの違い、ロードが入出力待ちを含むという事実、キャッシュが事実上の余裕メモリだという点 — この三つをきちんと理解するだけで、サーバー問題の診断の半分は解決します。

参考資料

コメント

まだコメントはありません。

ログインするとコメントできます