サーバが遅いときや処理が遅いときに、サーバの負荷状態を調査するのに役に立つvmstatコマンド。

ただ、vmstatコマンドを使ってリソース状態を表示しても、どこをどう見ればいいのかいつも忘れてしまいます。

サクッとまとめました。

サーバの負荷とは何?

一言にサーバの負荷といっても色々あります。

大きく2つに分けると、ソフトウェアが原因の場合と、CPUやIOなどリソースが原因の場合です。

apacheやmysqlなどソフトウェアが原因の場合は、接続数や使用メモリを上げたりなどチューニングする必要があります。

自社で開発したソフトウェア(システム)が原因なら、開発チームに投げればいいでしょう。

今回はvmstatを利用してリソース側から見た調査の検証をします。

負荷を調査する

vmstatを使って負荷を調査します。

# 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
 1  0  32220 139492   1700 7783032    0    0     0     1    0    0  0  0 100  0  0
 0  0  32220 139616   1700 7783032    0    0     0     0   55  147  0  0 100  0  0
 0  0  32220 139600   1700 7783032    0    0     0     0   61  154  0  0 100  0  0
 0  0  32220 139600   1700 7783032    0    0     0     0   68  176  0  0 100  0  0
 0  0  32220 139600   1700 7783032    0    0     0     0   63  158  0  0 100  0  0

vmstatの項目は以下の通りです。

procsr: 実行待ちのプロセス数
b: I/O待ちのプロセス数
memoryswpd: スワップの使用量
free: 空きメモリ容量
buff: バッファキャッシュの使用量
cache: ページキャッシュの使用量
swapsi: スワップインした回数の秒間平均
so: スワップアウトした回数の秒間平均
systemin: 1秒当たりの割り込み回数
cs: 1秒当たりのコンテキストスイッチの回数
cpuus: カーネル以外が使用したCPU使用率
sy: システム(カーネル)が使用したCPU使用率
id: アイドル(待機)状態の割合
wa: I/Oウェイトにかかった割合
st: Xenなど、別のDOMが使用した割合
vmstat項目

procsは実行待ちの状態のプロセス数を表しています。rが多いと処理待ち、bが多いとI/O待ちです。
rとbを足したのがロードアベレージになるようです。

memoryはメモリ使用量、freeが少なければメモリに余裕がないことになります。

ioはディスクのreadやwrite関連、biが高ければ読み込み、boが高ければ書き込みに時間がかかっていることになります。

cpuはcpu使用率なので、高いとCPUの負荷が高いといえます。

負荷の原因と対策

vmstatでいろいろな項目が表示されますが、これをもとにどう判断すればよいのでしょうか?

memoryはfreeが少なくなればメモリ不足、メモリを増設するか、自社システムなどでメモリを解放しているか確認すればいいでしょう。

CPUの使用率が高ければ、高負荷な処理がないか確認したり、サーバ機能を分散するなど対応が必要になります。(webとDBを分けるなど)

IOに時間がかかっているのであれば、HDDを回転数(rpm)の高いHDDに交換したり、SSDにするなど対策が必要です。

IOがどうなるか調査した

調査のついでに、IO負荷をかけた場合vmstatのioがどう変化するか調査しました。

IO 書き込み負荷が高い例

dd if=/dev/zero of=dummy.iso bs=1M count=10000

ddで10Gのファイルを作成して書き込み負荷を上げます。

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
 0  2  32220 3162844   1688 4759172    0    0     0     1    0    0  0  0 100  0  0
 2  1  32220 2705764   1688 5216416    0    0     0 489996 1308  457  0  5 50 44  0
 0  2  32220 2176620   1688 5745392    0    0     0 474120 1263  442  0  5 53 43  0
 0  2  32220 1722888   1688 6199136    0    0     0 473612 1180  431  0  3 52 46  0
 0  2  32220 1193960   1688 6728344    0    0     0 490392 1210  456  0  3 56 41  0

ioのboが上がっているのが分かります、procsのbも上がっているのでI/O待ちが発生していることも確認できます。

IO 読み込み負荷が高い例

dd if=dummy.iso of=/dev/null bs=1M

先ほど作成したdummyファイルを読み込み、/dev/nullに投げます。これで読み込みの負荷を上げます。

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
 0  1  32220 131624   1020 7789532    0    0     0     1    0    0  0  0 100  0  0
 0  1  32220 123624   1020 7797252    0    0 543360     0 4476 8931  0  5 74 21  0
 1  1  32220 123556   1020 7797532    0    0 543360     0 4497 8907  0  5 74 20  0
 1  1  32220 139772   1020 7781316    0    0 543488     0 4502 8892  0  5 74 20  0
 0  1  32220 135524   1020 7785828    0    0 543360     0 4506 8918  0  6 74 21  0

今度はioのbiが上がっているのが分かります。

ioの値は読み書きしたブロック数の秒間平均なので、いくつ以上がやばいなど一概には言えません。

回転数(rpm)が高いHDDに交換後、ベンチマークしてこれより小さい数字になればIOが早くなっているなど、相対的な指標として参考にするのかもしれません。