Linux上で、開発したプログラムやスクリプトのレスポンスを検証する際に、それらが動いている時の、CPU負荷、メモリ消費量、ディスクI/Oなどがどうなっているのかを把握して、どこがボトルネックとなっているのかを知ることは重要です。
Linuxでは topコマンドでCPUやメモリの使用率を手軽にモニタリングすることができますので、このコマンドを使ってほぼリアルタイムに状況を確認することは可能です。
しかし、例えばレポーティングなどの目的で1秒間隔で時系列にCPU、メモリ、ディスクI/Oなどリソースの使用状況を出力するにはどうしたらよいでしょうか?
そういう場合はvmstatコマンドを使用することができます。
これは、例えば
%vmstat 1
と引数に1(秒)を与えてやると、1秒間隔でメモリ消費量、ディスクI/O、CPU使用率などの情報を1行ずつ表示してくれます。
%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 0 1 64 12776 107644 316480 0 0 0 1488 1261 1015 2 1 73 24 0 0 1 64 19168 104856 312592 0 0 0 1540 1284 1075 3 1 70 26 0 0 1 64 19112 104936 312684 0 0 0 1048 1188 748 1 0 73 25 0 0 1 64 18752 105128 312904 0 0 0 1484 1270 1026 2 1 72 24 0 0 1 64 18392 105212 313040 0 0 0 1012 1194 765 2 1 73 24 0 0 1 64 18144 105244 313104 0 0 0 460 1090 424 1 1 74 24 0 0 1 64 18020 105352 313148 0 0 0 872 1173 737 1 1 72 26 0 ・・・・・
残念ながら、このvmstatコマンドは各行が示す統計時点の時刻は表示してくれないので、awkを使って
vmstat 1 | awk '{print strftime("%y/%m/%d %H:%M:%S"), $0}'
とやると、時刻も表示してくれます。
こうすることでvmstatの結果をタイムスタンプ付きで時系列データとして出力することができます。
13/06/05 23:47:06 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ 13/06/05 23:47:06 r b swpd free buff cache si so bi bo in cs us sy id wa st 13/06/05 23:47:06 2 0 64 25964 66800 342952 0 0 0 0 1005 108 0 0 100 0 0 13/06/05 23:47:07 1 0 64 25964 66800 342952 0 0 0 0 1024 143 0 0 100 0 0 13/06/05 23:47:08 1 0 64 25964 66804 342948 0 0 0 16 1009 115 0 0 100 0 0 13/06/05 23:47:09 1 0 64 25964 66804 342948 0 0 0 0 1005 102 0 0 100 0 0 13/06/05 23:47:10 1 0 64 25964 66804 342952 0 0 0 0 1005 107 0 0 100 0 0 13/06/05 23:47:11 1 0 64 25964 66804 342952 0 0 0 0 1024 149 0 0 100 0 0 13/06/05 23:47:12 1 0 64 25964 66804 342952 0 0 0 0 1005 104 0 0 100 0 0 ・・・・・
このデータをエクセルに持っていってグラフ化するマクロを作成してレポートする、といったことも可能です。
2015.03.16 追記
vmstatの結果をタイムスタンプ付きでファイルに保存したい場合は、
vmstat 1 | awk '{print strftime("%y/%m/%d %H:%M:%S"), $0} {fflush() }' >> a.out
とします。
vmstatの詳細については、マニュアルページを参照していただきたいと思いますが、メモリ、CPU、ディスクI/O それぞれに関してポイントを以下に記したいと思います。
【メモリ】 (単位はディフォルトでKバイト)
freeの値が純粋な空きメモリの量。swapdが仮想メモリの量なので、この値が時系列で見て激しく変化するようであればスワップ・イン、スワップ・アウトが発生しているので、メモリネックとなっていると言えます。ちなみにスワップ・インとスワップ・アウトのメモリ量は、si so の値で表示されています。
【CPU】
cpu の us がカーネルコード以外の実行に使用したCPUの使用率ですので、この値が時系列に見て常に高い値だと、CPUネックになっていると言えます。ひどい時はこの値が常に100近くになっているという場合もあります。逆にidが示す値がアイドル時間なのでidが高い値を示しているのであればCPUは大丈夫(余裕がある)といえます。
【ディスクI/O】
bi(ブロック・イン)、bo(ブロック・アウト)の値で見ます。
CPUやメモリには余裕があって、この値が高い値を示す時はディスクI/Oがネックとなっている、言い換えると、CPUやメモリは余裕があるのでディスクI/Oにレスポンス改善の余地があると見ることができます。
参考 : vmstatの出力内容(マニュアルページより抜粋)
Procs r: ランタイム待ちのプロセス数 b: 割り込み不可能なスリープ状態にあるプロセス数 Memory swpd: 仮想メモリの量。 free: 空きメモリの量。 buff: バッファに用いられているメモリの量。 cache: キャッシュに用いられているメモリの量。 inact: アクティブでないメモリの量 (-a オプション)。 active: アクティブなメモリの量 (-a オプション)。 Swap si: ディスクからスワップインされているメモリの量 (/s)。 so: ディスクにスワップしているメモリの量 (/s)。 IO bi: ブロックデバイスから受け取ったブロック (blocks/s)。 bo: ブロックデバイスに送られたブロック (blocks/s)。 System in: 一秒あたりの割り込み回数。クロック割り込みも含む。 cs: 一秒あたりのコンテキストスイッチの回数。 CPU これらは CPU の総時間に対するパーセンテージである。 us: カーネルコード以外の実行に使用した時間 (ユーザー時間、nice 時間を含む)。 sy: カーネルコードの実行に使用した時間 (システム時間)。 id: アイドル時間。Linux 2.5.41 以前では、IO 待ち時間を含んでいる。 wa: IO 待ち時間。Linux 2.5.41 以前では、0 と表示される。 st: 仮想マシンから盗まれた時間。Linux 2.6.11より前では未知。
コメントを残す