vmstatでパフォーマンス測定をしよう

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のカテゴリである。これらの数字がどのように計算されるかは別項にて説明する。(予定)

カテゴリ項目説明
procsr実行可能なプロセスの数
procsb割り込み不可能な状態でスリープしているプロセスの数
memoryswpdswapにあるmemoryの量
memoryfreeidle memoryの量
memorybuffbufferとして使用されているmemoryの量
memorycachecacheとして使用されているmemoryの量
iobiブロックデバイスから受信したブロックの数
ioboブロックデバイスへ送信したブロックの数
systemin1秒当たりの割り込みの回数
systemcs1秒当たりのコンテキストスイッチの回数
cpuus非カーネルモードで実行た時間の割合
cpusyカーネルモードで実行た時間の割合
cpuidプロセッサがidleである時間の割合
cpuwaプロセッサがIO待ちである時間の割合
cpust仮想マシンで実行している時間の割合

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待ち時間を測定することは難しい。

コメント

タイトルとURLをコピーしました