
2026/07/04 21:00
Linux の htop または top で表示される項目のすべてについて(2019)
RSS: https://news.ycombinator.com/rss
要約▶
日本語訳:
主要なメッセージは、Ubuntu サーバー 16.04 上の
htop システムメトリックを正確に解釈する方法について説明し、負荷平均が CPU パーセンテージではなく、1 分間、5 分間、15 分の期間における実行中および中断不能プロセスの指数減衰移動平均であることを明確にしています。シングルコアマシンでは負荷が 1.0 の場合、利用効率は 100% に相当しますが、マルチコアマシンでは負荷数は容量最大時にコア数と一致します。このメトリックは CPU ボンディングプロセスと I/O ウェイト中のプロセス(ディスクまたは NFS を待機している中断不能睡眠/D ステートに属するプロセスなど)をどちらも含み、mpstat などのツールで見られる瞬間的な CPU データとは区別されます。問題の診断については、システム管理者は /proc/<pid>/ ディレクトリを通じてプロセスステート(R, S, D, Z, T)を確認でき、ここではコマンドラインや実行可能ファイルのパスなどの詳細を提供します。また、ユーザーアイデンティティは /etc/passwd および /etc/group を通じて解決されます。一般的な起動プロセスには systemd-journald, lvmetad, sshd が含まれます。これらの内部動作—including コピーオンライプット方式を通じて共有メモリエリブラリが仮想使用量を膨らませる方法や、SIGINT や SIGKILL などのシグナルの動作—を理解することで、管理者は CPU ボンディングと I/O ボンディングのボトルネックを区別し、正確なシステム管理を行うことができます。本文
Ubuntu サーバー 16.04 x64における htop
の完全解説
htop本記事では、Ubuntu サーバー 16.04 (x64) 環境下で表示される
ツールの各項目の意味を詳しく解説します。システムの状態を正確に把握し、プロセス管理の理解を深めることを目的としています。htop
目次
- アップタイム (Uptime)
- 負荷平均 (Load Average)
- プロセス一覧のプロセス表示
- PID と /proc の活用
- プロセスツリーと所有者
- プロセス状態 (State) の詳細
- プロセス実行時間
- 優先度と niceness
- メモリ使用量 (VIRT/RES/SHR/MEM%)
- 起動時プロセスの削減案
- 補遺・ソースコード確認
アップタイム (Uptime)
システムが稼働している時間の総称です。コマンド
uptime で確認できます。
$ uptime 12:17:58 up 111 days, 31 min, 1 user, load average: 0.00, 0.01, 0.05
仕組みの裏側
コマンドはuptime
ファイルを読み込んで値を計算します。/proc/uptime- このファイルには以下の情報が含まれています:
- 稼働総時間(秒): システム起動からの経過時間。
- アイドル時間(秒): その間マシンが処理待ちだった時間。
- マルチコア注意: アイドル時間が全体のアップタイムより大きい場合もあります(すべてのコアの合計アイドル時間のため)。
確認方法 (strace
)
straceシステムコールをトレースして、ファイル読み込み動作を確認できます。
$ strace uptime 2>&1 | grep open ... open("/proc/uptime", O_RDONLY) = 3 open("/var/run/utmp", O_RDONLY|O_CLOEXEC) = 4 open("/proc/loadavg", O_RDONLY) = 4
負荷平均 (Load Average)
システムが「どのくらい忙しそうか」を表す指標です。
uptime 出力の最後に表示される 3 つの数値(例:0.00, 0.01, 0.05)は、直近 1 分、5 分、15 分における負荷平均です。
データ的来源
- ファイル
に格納されています。/proc/loadavg - カラムの意味:
- 1 分間負荷平均
- 5 分間負荷平均
- 15 分間負荷平均
- 現在実行・待機中のプロセス数 / 全プロセス数 (例:
)1/120 - 最後に使用された PID
なぜ負荷平均なのか?(重要)
負荷数は 「中断不可状態のプロセス数」+「実行・待機中のプロセス数」 で計算されます。これは単純な CPU 使用率ではありません。
- CPU コア数との関係:
- 2 コアシステムで
は、平均して 1 コアが処理済み(50% 使用)であることを意味します。Load Average: 1.0
はすべてのコアが忙しく(100% 使用)、キュー待ちが発生している可能性があります。Load Average: 2.0
- 2 コアシステムで
- 指数減衰移動平均: 厳密には起動以降の負荷を時間重み付けして計算しています。
CPU 使用率を推測するには?
Load Average だけでは不十分な場合があります。より正確な情報は
や mpstat
の CPU グラフ で確認してください。htop
$ sudo apt install sysstat -y $ mpstat 1
プロセス一覧の表示
タスク (Tasks) とスレッド
ではプロセス数を 「Tasks」(タスク)と呼びます(Linux カーネルも「タスク」と呼ぶため)。htop- スレッド表示: キー
で切り替え。例:[Shift+H]
(プロセス 23、スレッド 10)。Tasks: 23, 10 thr - カーネルスレッド表示: キー
で表示可能。[Shift+K]
PID (Process ID)
- プロセスを一意に識別する番号です。
- バックグラウンド実行時 (
) は PID を確認できます。&$ sleep 1000 & [1] 12503
変数: 最後に起動したバックグラウンドプロセスの PID を取得。$!
/proc/<PID>/
の活用
/proc/<PID>/プロセスの詳細情報は、疑似ファイルシステム
/proc/<PID>/ に集約されています。
$ ls /proc/12503 attr cmdline cwd environ exe fd map_files ...
- 起動コマンドの確認:
$ cat /proc/12503/cmdline sleep1000 # \0 で区切られているため、od や tr で可読化 $ od -c /proc/12503/cmdline s l e e p \0 1 0 0 0
プロセスツリーと所有者
プロセスツリーの確認
親プロセスから子プロセスへの階層構造を確認できます。
: キーhtop
で階層表示を切り替え。[F5]- コマンドライン:
やps f
を使用。pstree -a
$ pstree -a init ├─atd ├─cron └─sshd └─bash └─pstree -a
プロセス所有者 (User)
プロセスはユーザーによって所有されます。
/etc/passwd や /etc/group ファイルで ID を名前とマッピングします。
$ grep Uid /proc/<PID>/status Uid: 1000(ubuntu) 1000 $ id 1000 uid=1000(ubuntu) gid=1000(ubuntu) groups=...
パスワードについて:
- パスワードは
に格納されています(暗号化されたハッシュ値)。/etc/shadow
権限が必要な場合、sudo
を使用してvisudo
を編集してください。/etc/sudoers
プロセス状態 (State) の詳細
htop の STAT カラムに表示される文字は以下の意味を持ちます:
| 記号 | 状態の説明 | 解説 |
|---|---|---|
| R | Running | 実行中または実行待ちキューにあり。CPU を消費している。 |
| S | Sleeping (Int) | 中断可能スリープ。イベントの完了を待機中。( で切れる) |
| D | Uninterruptible Sleep | 中断不可能スリープ。IO(ディスク等)待ち。殺害不能 ()。 |
| Z | Zombie (Defunct) | 終了した子のプロセスだが、親が状態を受け取っていない。メモリは消費しない。 |
| T | Stopped | ジョブ制御信号で停止された ()。 |
| t | Tracing Stop | デバッガー (gdb) で追跡中の状態。 |
| X | Dead | 死んでいる(見られるべきではない状態)。 |
状態変化への対応例
- 中断可能 (S):
またはキーボードでkill -INT <PID>
シグナル選択で停止可能。[F9] - 中断不可能 (D): IO 待ちなどのため、強制的な強制終了 (
) は有効ではありません。SIGKILL - ゾンビ (Z): 親プロセスが子プロセスの状態を受け取る(
)まで消えません。wait
プロセス実行時間と優先度
実行時間 (Time)
マルチコア CPU でも、CPU は瞬間的に片方しか処理できません。タイムスライスという時間共有機構により、複数のプロセスを高速に切り替えて並列に実行しているように見えます。
優先度 (Priority) と Niceness
スケジューラは以下の情報に基づいてタスクの順序を決めます。
- Niceness (NI): ユーザーが設定できる値(-20 から 19)。「Nice なプロセス」ほど CPU リソースを譲ります。
コマンドで実行中のプロセスの Nice 値を変更可能。renice
- Priority (PRI): カーネル空間での優先度。NICeness との関係は PR = 20 + NI。
メモリ使用量 (VIRT / RES / SHR / MEM%)
メモリ使用量は以下の意味を持ちます:
| 項目 | 説明 |
|---|---|
| VIRT | 仮想メモリー使用量。コード、データ、マッピングされたファイル、スワップアウト分を含む。実装上の上限を指すことが多い。 |
| RES | 物理メモリー使用量。現在実際に占有しているメモリ。最も重要な指標。 |
| SHR | 他プロセスと共有されているメモリの量(ライブラリなど)。 |
| MEM% | RES / 全 RAM に占める割合。色付き表示で視認可能(緑:使用、青:バッファ、橙:キャッシュ)。 |
注意: コアディumps (メモリコピー) を作成した際などは VIRT と RES が乖離します。
起動時プロセスの削減案
Ubuntu サーバー起動時に自動的に始まる不要なプロセスを特定し、削除するための手順を示します。
Before: システム起動時の主要プロセス
(systemd)/sbin/init
(ログ管理)systemd-journald
(LVM メタデータキャッシュ)lvmetad
(デバイス管理)udevd
(NTP 同期)timesyncd
,atd
,cron
,rsyslogd
など。acpid
After: 極端な削減案 (Extreme Edition)
サーバー用途であれば、以下のサービスを削除または無効化することでリソースを軽量化できます。
sudo apt remove lvm2 at snapd mdadm open-iscsi accountsservice policykit-1 acpid -y --purge sudo apt remove snapd dbus rsyslog -y --purge # cron を停止・無効化 sudo systemctl stop cron && sudo systemctl disable cron # getty (ログインプロンプト) を削減 sudo rm /etc/systemd/system/getty.target.wants/getty@tty1.service
注意:
,snapdなどは特定の依存パッケージ(例:dbus)やアプリケーションに影響を与える可能性があります。削除前に必要か確認してください。systemd-timesyncd
補遺・ソースコード確認
ソースコードの確認
コマンドの仕組みを理解するには、パッケージ情報とソースコードを見ます。
$ dpkg -S /usr/bin/uptime procps: /usr/bin/uptime # Ubuntu パッケージリポジトリからソースを確認 http://packages.ubuntu.com/source/xenial/procps
ファイル記述子とリダイレクトの復習
: 標準出力 (>
) をリダイレクト。stdout
: 標準エラー (2>&1
, ID 2) を標準出力 (ID 1) と同じ場所へ書き出す。stderr
PuTTY での色表示修正
htop の色が正しく表示されない場合:
- タイトルバーで右クリック
[Change settings...]
->WindowColours
を選択して ApplyBoth
C 言語による簡易シェルの実装 (fork
, exec
, wait
)
forkexecwait以下のコードは、基本コマンド処理とプロセス制御の仕組みを実験的に示します。
// shell.c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/wait.h> int main() { char line[1024]; while (1) { printf("> "); fgets(line, sizeof(line), stdin); if (strcmp(line, "exit") == 0) break; int pid = fork(); if (pid == 0) { // 子プロセス:コマンド実行 if (execlp("ls", "ls", "-l", NULL) == -1) { perror("execlp"); exit(1); } } else if (pid > 0) { // 親プロセス:子プロセスの終了を待つ int status; waitpid(pid, &status, 0); printf("Child exited with %d\n", WEXITSTATUS(status)); } } return 0; }
TODO (今後の学習目標)
-
のサブステータス解析 (Ss+, R+ 等)ps - カーネルスレッドの詳細な管理方法
-
(擬似端末) の仕組み/dev/pts - メモリ領域の詳細 (CODE, DATA, STACK, SWAP)
- タイムスライスの長さの確認方法
- Linux スケジューラーアルゴリズムの深掘り
-
ページの書き方man - CPU/メモリのバーチャル化について
結び言及と T シャツ提案
もし本記事が役に立った場合は、
htop のより詳しい動作(人間視点での負荷表示など)を含むスクリーンショットをご覧ください。
「何かを学ぶ最良の方法は、それを教えることに挑戦することだ。」