htop と Linux プロセス監視の理解
htop と Linux プロセス監視の理解
htop と Linux プロセス監視の理解
htop は Linux 用のインタラクティブなプロセスビューアで、システムリソースのリアルタイム概要を提供します。そのデータを正しく解釈するには、Linux カーネルがタスクをどのように追跡し、/proc 疑似ファイルシステムを通じて情報を公開しているかを理解する必要があります。
システム稼働時間と /proc ファイルシステム
システム稼働時間は、最後の起動以降マシンがどれだけ動作しているかを示します。htop と uptime コマンドはこの値を /proc/uptime から取得します。
- データソース:
/proc/uptimeには 2 つの数値が含まれます。システムが起動してからの総秒数と、システムがアイドル状態だった総秒数です。 - マルチコアシステム: マルチコアマシンでは、アイドル時間の値が総稼働時間を超えることがあります。これはすべての CPU コアの合計として算出されるためです。
負荷平均の解釈
負荷平均は、現在実行中または実行待ち(runnable)状態にあるプロセスの平均数に、割り込み不能なスリープ状態(通常は I/O 待ち)にあるプロセスを加えたものです。
負荷と CPU 使用率の違い
負荷平均は CPU 使用率の直接的なパーセンテージではありません。タスク数として表されます。たとえば、シングルコアマシンで負荷平均が 1.0 の場合、CPU 使用率は 100% を意味します。デュアルコアマシンで負荷平均が 1.0 の場合、CPU 使用率は 50% です。
計算方法
負荷平均は 1 分、5 分、15 分の間隔で測定された負荷数値の指数的に減衰した移動平均です。割り込み不能なスリープ(D 状態)のプロセスも含むため、CPU 使用率が低くても高い負荷平均が表示されることがあります。これは通常、ディスクやネットワーク I/O のボトルネックを示しています。
プロセスの識別と階層構造
プロセス ID(PID)
すべてのプロセスには一意のプロセス ID(PID)が割り当てられます。カーネルは /proc/<pid>/ 以下に各プロセスの詳細情報を公開しています。たとえば、/proc/<pid>/cmdline はプロセス起動時に使用されたコマンドを示し、/proc/<pid>/exe は実行されたバイナリへのシンボリックリンクです。
プロセスツリー
プロセスは親子関係の階層構造を持ちます。シェル(例: bash)がプログラムを起動するときは、fork システムコールで自身のコピーを作成し、exec システムコールで新しいプログラムをロードします。これによりツリー構造が形成され、htop では F5 キーでツリー表示が可能です。
プロセス状態の解読
htop の S 列はプロセスの現在の状態を示します。これらの状態を理解することは、システムのハングやパフォーマンス問題の診断に重要です。
| State | Meaning | Description |
|---|---|---|
| R | Running/Runnable | プロセスは CPU 上で実際に命令を実行中、または実行キューで順番待ちしています。 |
| S | Interruptible Sleep | プロセスはイベント(タイマーやネットワークパケットなど)を待機中で、シグナルで起床可能です。 |
| D | Uninterruptible Sleep | プロセスは I/O 待ち(主にディスク)で、SIGKILL を含むシグナルで割り込めません。 |
| Z | Zombie | プロセスは終了しましたが、親が wait システムコールで終了コードを取得していません。 |
| T | Stopped | ジョブ制御シグナル(例: Ctrl+Z)やデバッガによりプロセスが停止しています。 |
メモリ使用量指標
Linux は仮想メモリを使用してプロセスを分離するため、htop に表示されるメモリ数値は直感に反することがあります。
- VIRT(Virtual Image): プロセスがアクセス可能な仮想メモリの総量。共有ライブラリ、スワップアウトされたページ、メモリマップドファイルが含まれます。実際の RAM 使用量を示す指標としては最も有用性が低く、しばしば膨らんで表示されます。
- RES(Resident Size): スワップされていない物理メモリで、タスクが現在使用している量です。プロセスの実際のメモリフットプリントを示す最も信頼できる指標です。
- SHR(Shared Mem): 他のプロセスと共有可能なメモリ(例: 共有ライブラリ)です。
- MEM%: プロセスが使用している物理 RAM の割合。
RES / 総 RAMで計算されます。
プロセス優先度とナイス値
Linux スケジューラは優先度に基づいて次に実行するプロセスを決定します。
- ナイス値(NI): -20(最高優先度)から 19(最低優先度)までのユーザ空間の値です。ナイス値が高いほど、他のプロセスに CPU 時間を譲ります。
- 優先度(PRI): カーネル空間の優先度。一般的に
PRI = 20 + NIの関係です。
コミュニティからの洞察
経験豊富なユーザーは htop をより効果的に使うための最適化をいくつか提案しています。
- 表示の最適化: ユーザースレッドを非表示にし、プロセスツリー表示を有効にすると、雑多さが減り、プロセスの起源が把握しやすくなります。
- 代替ツール:
btopは GPU 監視や消費電力(ワット)表示など、htopにはないモダンなインターフェースを提供すると推奨するユーザーもいます。 - メモリ解釈: コミュニティメンバーは仮想メモリが誤解を招きやすいと指摘しています。たとえば、メモリマップドファイルは
VIRTを膨らませますが、実際の物理 RAM 消費はほとんどありません。
"Resident size is the most reliable metric. Anything else can be wrongfully inflated by things like harmless memory mapped files that won't actually hurt anything."
一般的なシステムプロセス
標準的な Ubuntu Server インストールでは、htop に以下のような重要デーモンが表示されます。
- /sbin/init (systemd): 起動時に最初に実行されるプロセス(PID 1)で、他のすべてのシステムプロセスの親です。
- systemd-journald: 構造化されたログデータを収集・保存します。
- sshd: リモートの暗号化接続を管理する OpenSSH デーモンです。
- cron: 定期的にスケジュールされたタスクを実行するデーモンです。