おなじみのツール: 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: 万能選手

もしiostatvmstatが合体したら、それは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は、プロセスをカラフルでインタラクティブに表示します。

htop screenshot
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

これこそ情報過多と言えるでしょう!

秘密のソース: カスタムモニタリングスクリプト

時には、市販のツールでは不十分なことがあります。そんなときは、自分でモニタリングスクリプトを書く時です。ここにiostatvmstatデータを組み合わせた簡単な例があります:


#!/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文を追加するのが最良のアプローチです。ツールが問題解決能力を上回らないようにしましょう!

次は何をする?

この知識を得た今、テスト環境を設定して実験を始めてみませんか?さまざまな負荷シナリオをシミュレートして、これらのツールがどのように反応するかを確認してください。あるいは、これらの技術を直面している実際の問題に適用してみてください。実際に試してみることが重要です!

監視を楽しんで、システムが常に高性能であることを願っています!