おなじみのツール: iostat、vmstat、dstat
まずは、パフォーマンス監視ツールの三種の神器から始めましょう:
1. iostat: I/Oの探偵
ディスクI/Oが問題を引き起こしているとき、iostat
はその解決策です。この便利なツールは、すべてのデバイスのCPU使用率とI/O統計をスナップショットで提供します。
$ iostat -xz 1
Linux 5.4.0-42-generic (myserver) 06/15/2023 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
2.43 0.00 1.22 0.31 0.00 96.04
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
sda 0.35 2.13 14.44 34.96 0.00 0.57 0.00 21.05 0.57 2.50 0.01 41.54 16.43 0.40 0.10
これは何を示しているのでしょうか?ここでは、かなりアイドル状態のシステムがあります。CPUは96%の時間をアイドル状態で過ごし、ディスク(sda)は0.10%の使用率でほとんど負荷がかかっていません。
2. vmstat: メモリのマエストロ
vmstat
は、システムのメモリの状態を示す窓です。実行キューの長さからスワップ使用量まで、すべてを表示します。
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 6981496 191268 724132 0 0 3 5 36 79 2 1 97 0 0
0 0 0 6981496 191268 724132 0 0 0 0 209 355 1 0 99 0 0
このfree
列を見てください - 約7GBの空きメモリがあります。システムが落ち着いているのも納得です!
3. dstat: 万能選手
もしiostat
とvmstat
が合体したら、それはdstat
になるでしょう。この多機能ツールは、CPU、ディスク、ネットワーク、ページング、システム統計を一つのカラフルな出力で提供します。
$ dstat -cdngy
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai stl| read writ| recv send| in out | int csw
2 1 97 0 0| 14k 40k| 0 0 | 0 0 | 237 420
1 0 99 0 0| 0 0 | 66B 722B| 0 0 | 206 357
1 0 99 0 0| 0 0 | 60B 722B| 0 0 | 208 355
これこそ、システム統計のワンストップショップです!
さらに深掘り: 知られざるヒーローたち
しかし、まだまだあります!あまり知られていないが同様に強力なツールを探ってみましょう:
4. sar: 時間旅行者
sar
(システムアクティビティレポーター)は、システム統計のタイムマシンのようなものです。過去のデータを表示し、グラフを生成することもできます。
$ sar -u 1 3
Linux 5.4.0-42-generic (myserver) 06/15/2023 _x86_64_ (4 CPU)
13:00:01 CPU %user %nice %system %iowait %steal %idle
13:00:02 all 2.01 0.00 0.75 0.25 0.00 96.98
13:00:03 all 1.75 0.00 0.75 0.00 0.00 97.49
13:00:04 all 1.75 0.00 0.75 0.25 0.00 97.24
Average: all 1.84 0.00 0.75 0.17 0.00 97.24
プロのヒント: sar -A
を使ってすべての統計を見てみましょう。ただし、情報が多すぎて圧倒されるかもしれません!
5. perf: プロファイリングの強者
さらに深く掘り下げる必要があるとき、perf
はあなたの探検装備です。CPU使用率をプロファイルし、システムコールをトレースし、キャッシュミスを分析することもできます。
$ sudo perf top
Samples: 42K of event 'cpu-clock', 4000 Hz, Event count (approx.): 5250000000 lost: 0/0 drop: 0/0
Overhead Shared Object Symbol
7.89% [kernel] [k] _raw_spin_unlock_irqrestore
4.32% [kernel] [k] finish_task_switch
3.21% [kernel] [k] __schedule
2.96% [kernel] [k] schedule
見てください!カーネルの_raw_spin_unlock_irqrestore
関数がCPUの約8%を占有しています。カーネルコードを調べる時かもしれませんね。
物語は続く: パフォーマンスの可視化
時には、絵が千のstrace
出力に値することがあります。これらのグラフィカルツールを使ってみましょう:
6. htop: インタラクティブなプロセスビューア
top
の強化版と考えてください。htop
は、プロセスをカラフルでインタラクティブに表示します。

7. atop: システムとプロセスのモニター
atop
は、top
の優秀な従兄弟のようなものです。システムレベルのカウンターとプロセスごとの統計を一つのビューで表示します。
$ atop
ATOP - myserver 2023/06/15 13:15:23 ------------------------------
PRC | sys 1.85s | user 3.70s | #proc 213 | #zombie 0 | #exit 0 |
CPU | sys 2% | user 4% | irq 0% | idle 94% | wait 0% |
CPL | avg1 0.02 | avg5 0.05 | avg15 0.05 | csw 53592 | intr 43357 |
MEM | tot 15.5G | free 6.8G | cache 724.7M | buff 191.3M | slab 409.8M |
SWP | tot 15.9G | free 15.9G | | vmcom 4.7G | vmlim 23.7G |
DSK | sda | busy 0% | read 131 | write 644 | avio 2.50 ms |
NET | transport | tcpi 37 | tcpo 36 | udpi 0 | udpo 0 |
NET | network | ipi 37 | ipo 36 | ipfrw 0 | deliv 37 |
NET | eth0 ---- | pcki 19 | pcko 18 | si 1 Kbps | so 1 Kbps |
PID SYSCPU USRCPU VGROW RGROW RDDSK WRDSK ST EXC S CPU CMD 1/600
1829 0.37s 0.73s 0K 0K 0K 0K -- - R 1% atop
1 0.02s 0.03s 0K 0K 0K 0K -- - S 0% systemd
これこそ情報過多と言えるでしょう!
秘密のソース: カスタムモニタリングスクリプト
時には、市販のツールでは不十分なことがあります。そんなときは、自分でモニタリングスクリプトを書く時です。ここにiostat
とvmstat
データを組み合わせた簡単な例があります:
#!/usr/bin/env python3
import subprocess
import time
def get_iostat():
output = subprocess.check_output("iostat -c 1 1 | tail -n 2 | head -n 1", shell=True).decode()
cpu_stats = output.split()
return float(cpu_stats[5]) # %idle
def get_vmstat():
output = subprocess.check_output("vmstat 1 2 | tail -n 1", shell=True).decode()
stats = output.split()
return int(stats[3]) # free memory
while True:
cpu_idle = get_iostat()
free_mem = get_vmstat()
print(f"CPU Idle: {cpu_idle}%, Free Memory: {free_mem}K")
time.sleep(5)
このスクリプトを実行すれば、自分だけのミニモニタリングシステムが完成です!
まとめ: システムパフォーマンスのシャーロック・ホームズになろう
Linuxシステムを低レベルで監視することは、サイバーパンク小説の探偵のようなものです。ツール(iostat、vmstat、dstat)、虫眼鏡(perf)、そしてワトソン(カスタムスクリプト)を持っています。重要なのは、どのツールをいつ使うか、そして結果をどう解釈するかを知ることです。
覚えておいてください:
- 基本から始める(iostat、vmstat、dstat)で概要を把握する
- 必要に応じてperfのような専門ツールで深く掘り下げる
- htopやatopでデータを視覚化して別の視点を得る
- 特定のニーズに合わせてカスタムスクリプトを書くことを恐れない
そして最も重要なのは、練習、練習、練習です!監視するシステムが増えるほど、異常を見つけてパフォーマンスの問題を解決する能力が向上します。
考えるための糧
"最も効果的なデバッグツールは、慎重な思考と適切に配置されたprint文です。" — ブライアン・カーニハン
これらの素晴らしいツールが手元にある一方で、時には問題を批判的に考え、いくつかの戦略的なecho
文を追加するのが最良のアプローチです。ツールが問題解決能力を上回らないようにしましょう!
次は何をする?
この知識を得た今、テスト環境を設定して実験を始めてみませんか?さまざまな負荷シナリオをシミュレートして、これらのツールがどのように反応するかを確認してください。あるいは、これらの技術を直面している実際の問題に適用してみてください。実際に試してみることが重要です!
監視を楽しんで、システムが常に高性能であることを願っています!