Linuxでvmstatの結果に時刻表示(タイムスタンプ)を付けて出力


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より前では未知。

タグ: ,
カテゴリー: その他

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

カテゴリー