vmstat
はじめに
Linuxの性能指標を確認するコマンドのうちvmstatについてまとめる。
vmstatとは
仮想メモリやCPU、ディスクI/Oの統計情報を表示するコマンド。システム*1全体に関する統計情報を表示するため、CPUごとやプロセスごとの情報を取得する場合は別のコマンドを利用する(mpstat -P
やtop
、ps aux
)。
導入方法
多くの環境では標準でインストールされている。
見方
実行例は以下の通り。vmstat (秒数) (回数)
の形式になっており、指定した秒数ごとに回数分の行数出力する。1行目は前回起動時からの各項目の平均値になっているため、直近の性能が必要なケース*2では2行目以降を用いる。
# vmstat 1 5 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 2 0 0 3593060 2108 133724 0 0 94 8 52 96 0 0 99 0 0 0 0 0 3593080 2108 133724 0 0 0 0 21 21 0 0 100 0 0 0 0 0 3593080 2108 133724 0 0 0 0 16 17 0 0 100 0 0 0 0 0 3593080 2108 133724 0 0 0 0 13 20 0 0 100 0 0 0 0 0 3593080 2108 133724 0 0 0 0 14 17 0 0 100 0 0
各項目(列)が示している内容は次の通り。
procs
r
はCPUでの実行待ちプロセス数。ランキューと呼ばれる待ち行列に入っているプロセスの数だが、通常はランキューに入るとほぼ同時に処理される。したがって、多くても平常時は0~2程度だが、この値が大きいとCPUの処理が追い付いていないということがわかる。
b
はディスクやネットワークなどのデータI/O処理で待ち状態のプロセスの数。
r
とb
を足したものをロードアベレージと呼ぶ。つまり、ロードアベレージは平均での実行待ちプロセスである。
memory
free
は空いている物理メモリの量(KB単位)。
buff
はバッファとして用いられているメモリの量(KB単位)。バッファとはデータの一時的な記憶領域。ディスクの読み書きをキャッシュしてデータへのアクセスを高速化する目的で用意される*4。主にカーネルが利用する。
cache
はキャッシュに用いられているメモリの量(KB単位)。キャッシュもバッファと同様、一時的なディスクへの読み書き領域で、データへのアクセスを高速化する。
swap
si
はスワップインされているメモリの量(KB/s)。スワップ→メモリの方向。
so
はスワップアウトされているメモリの量(KB/s)。メモリ→スワップの方向。*5
io
bi
はディスクから読み込んだブロック数の秒間平均。
bo
はディスクへ書き込んだブロック数の秒間平均。
system
in
は1秒あたりの割り込み回数。interruptのin。
cs
は1秒あたりのコンテキストスイッチ回数。CPUは複数のプロセスを高速に切り替えることによって、マルチタスクを実現している。コンテキストスイッチはこの切り替えの回数。切り替えは性能ロスになる*6
cpu
us
はユーザープログラム、すなわちカーネル以外のプログラムが動いていた時間の割合(%)。
sy
はカーネルが動いていた時間の割合(%)。
id
はCPUが全く動いていなかった時間の割合(%)。idleのid。
wa
はデータやネットワークへのI/O待ち時間の割合(%)。
st
は「仮想環境でプログラムを実行している場合に、他VMとCPUを取り合った結果、実際に実行されていなかった」ケースの時間の割合(%)。stealのst。
参考にしたもの
*1:ある物理マシンもしくは仮想マシン、単独のLinux OSが動いている範囲。
*2:多くの場合はこちらが該当すると思われる。
*3:参考文献含め、swpdの定義に「使用しているスワップ領域の量を表す。」という文が追加されているケースが散見する。しかし、仮想メモリ≠スワップのはずなので、「使用しているスワップ領域を表す。」という文章は適切ではないと思う。仮想メモリの実体として、物理メモリが対応しているケースと、スワップ領域(ディスク)が対応しているケースがあるので、ここを正確に言うなら「使用しているスワップ領域と物理メモリの合計を表す」くらいだろうか。
*4:ディスクよりメモリへの読み書きのほうが高速である。
*5:自分は「スワップからイン」「スワップへアウト」と覚えている。どちらも8文字になるというのがテレコに覚えるのを防いでいる。