vmstatとはLinuxのパフォーマンス測定ツールである。以下のようにvmstatコマンドを実行すると、現在実行中のプロセス、メモリの使用割合、IOの実行状態、CPUの利用率が表示される。
$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 26021184 9584 53432 0 0 13 146 2 5 0 0 100 0 0
また、vmstatコマンドに引数を与えることで指定された秒数ごとに集計して表示する。以下の例では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 0 0 26020940 9416 53456 0 0 34 146 5 12 0 0 100 0 0
0 0 0 26020948 9416 53456 0 0 0 2048 5 31 0 0 100 0 0
0 0 0 26020948 9416 53456 0 0 0 2048 5 27 0 0 100 0 0
0 0 0 26020948 9416 53456 0 0 0 4096 5 38 0 0 100 0 0
0 0 0 26020948 9416 53456 0 0 0 2048 5 29 0 0 100 0 0
0 0 0 26020948 9424 53448 0 0 0 2060 9 42 0 0 100 0 0
具体的な測定方法
上述のように、vmstatコマンドを使用することによりシステムの状態を動的に測定することができる。アプリケーションの動的な状態を測定するためには、例えば以下のようにスクリプトを組む。
#! /bin/bash
vmstat -t 1 > vmstat.log &
pid=$!
# do some applications
# ./my_command
kill $pid
コマンドの実行に先立ち、vmstatコマンドを実行する。この時、-tオプションを付けてタイムスタンプ付きで出力するようにしている。このタイムスタンプの情報を使用して別のパフォーマンス測定ツールやログと情報を突き合わせることができる。
$! は最後にバックグラウンドで実行したプロセスIDに展開される。この場合は直前に実行したvmstatコマンドのプロセスIDになる。ここで得られるプロセスIDはコマンド実行後にvmstatコマンドを止める(killする)ために必要になる。
出力される情報の意味
vmstatが出力する数字についてはvmstatのマニュアルに記載がある。ココではそれぞれについて簡単にまとめていく。ひとまず、パフォーマンス測定で着目すべき項目はmemory、io、cpuのカテゴリである。これらの数字がどのように計算されるかは別項にて説明する。(予定)
カテゴリ | 項目 | 説明 |
procs | r | 実行可能なプロセスの数 |
procs | b | 割り込み不可能な状態でスリープしているプロセスの数 |
memory | swpd | swapにあるmemoryの量 |
memory | free | idle memoryの量 |
memory | buff | bufferとして使用されているmemoryの量 |
memory | cache | cacheとして使用されているmemoryの量 |
io | bi | ブロックデバイスから受信したブロックの数 |
io | bo | ブロックデバイスへ送信したブロックの数 |
system | in | 1秒当たりの割り込みの回数 |
system | cs | 1秒当たりのコンテキストスイッチの回数 |
cpu | us | 非カーネルモードで実行た時間の割合 |
cpu | sy | カーネルモードで実行た時間の割合 |
cpu | id | プロセッサがidleである時間の割合 |
cpu | wa | プロセッサがIO待ちである時間の割合 |
cpu | st | 仮想マシンで実行している時間の割合 |
memoryカテゴリ
memoryに関してい知りたい情報は、「アプリケーションが現在どの程度メモリを使用しているか」である。メモリがどの程度使用されているかはかなり難しい問題であるが、以下のように概算することができる。
memoryカテゴリのswpdは別として、free、buf、cachedは「とりあえず使える」メモリである。したがって、この数字が出た時点でプロセスが実際に使用しているメモリは以下の計算式で求めることができる。
使用メモリ量 = TotalMemory - (free + buf + cached)
ioカテゴリ
IOカテゴリではブロックデバイスに送信したブロックの数を集計している。すべてのブロックデバイスで求めるため、-dや-pでデバイスごとの集計が出るようにした方がよいだろう。これらの項目については別項にて解説する(予定)。
cpuカテゴリ
CPUカテゴリに関して知りたい情報は何といってもCPU使用率であろう。これはusやsyの項目の合計値と考えればよい。また、この値はすべてのCPUに関しての数字である。例えば、CPUが8コアあり、usの数字が100%になっている場合、実装されている8つのCPUがすべて使用されていたことを意味する。
CPU使用率 = us + sy
なお、マニュアルによるとwaはIO待ちの時間ということになっている。しかし、一般にIOコマンドを発行して待ちに入った場合、CPUはidle状態になる。そのため、idの時間にもIO待ち時間が含まれていることになるため、実質的にIO待ち時間を測定することは難しい。
コメント