tanke25616429のアウトプット

IT技術の基本を勉強したことをアウトプットします。Linux、Kubernetes、クラウド中心です。百番煎じくらいだけど誰かの役に立てばそれはそれでうれしい。

vmstat

はじめに

Linuxの性能指標を確認するコマンドのうちvmstatについてまとめる。

vmstatとは

仮想メモリやCPU、ディスクI/Oの統計情報を表示するコマンド。システム*1全体に関する統計情報を表示するため、CPUごとやプロセスごとの情報を取得する場合は別のコマンドを利用する(mpstat -Ptopps 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処理で待ち状態のプロセスの数。

rbを足したものをロードアベレージと呼ぶ。つまり、ロードアベレージは平均での実行待ちプロセスである。

memory

swpd は使用している仮想メモリの量(KB単位)*3

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。

参考にしたもの

techbookfest.org

www.atmarkit.co.jp

g-network.boo.jp

milestone-of-se.nesuke.com

b.l0g.jp

*1:ある物理マシンもしくは仮想マシン、単独のLinux OSが動いている範囲。

*2:多くの場合はこちらが該当すると思われる。

*3:参考文献含め、swpdの定義に「使用しているスワップ領域の量を表す。」という文が追加されているケースが散見する。しかし、仮想メモリスワップのはずなので、「使用しているスワップ領域を表す。」という文章は適切ではないと思う。仮想メモリの実体として、物理メモリが対応しているケースと、スワップ領域(ディスク)が対応しているケースがあるので、ここを正確に言うなら「使用しているスワップ領域と物理メモリの合計を表す」くらいだろうか。

*4:ディスクよりメモリへの読み書きのほうが高速である。

*5:自分は「スワップからイン」「スワップへアウト」と覚えている。どちらも8文字になるというのがテレコに覚えるのを防いでいる。

*6:レジスタの値等をメモリに退避しているため、その時間がかかる。