1つのサーバに複数のサービス(WebとDBとか)が乗っていると、負荷が高いときにどれが原因なのか、原因のように見せかけて別の何かに引っ張られているだけなのか、よくわからなくなる場合があります。そんなときに手がかりになるコマンドをご紹介します。
「負荷が高い」とは
サーバにとって「負荷が高い」とは、サーバ資源の枯渇をさします。具体的には
- CPUを使い切っている
- ディスクI/Oを使い切っている
- ネットワークI/Oを使い切っている
- (メモリを使い切っている)
がwebサービスでの主要因です。他にもありますが、これで9割がた抑えられます。
メモリをカッコ書きにしたのは、メモリを使い切るとスワップが激しく稼働しだしてディスクI/Oを使い切ってしまうというのが負荷の原因なので、分類としては最終的にディスクI/Oに入ってしまうからです。しかし負荷のよくある原因の1つなので真っ先に監視対象になります。
CPUの確認:uptime、w、top、sar
uptimeはロードアベレージの確認に使います。
$ uptime
15:45:16 up 632 days, 17:09, 1 user, load average: 1.32, 0.68, 0.56
注目すべきは「1.23」の部分で、この部分がCPUスレッド数より大きいようであれば、処理をさばき切れていません。小さければ処理待ちは発生していないので、アプリケーションチューニングをがんばります。
CPUスレッド数がわからない場合は「cat /proc/cpuinfo」でprocessorの数を確認しましょう。
$ cat /proc/cpuinfo | grep processor | wc
2 6 28
この場合は2個です。
wもロードアベレージの確認ですが、1文字で入力できるのでuptimeより6倍楽です。
$ w
15:49:34 up 1:10, 2 users, load average: 0.08, 0.06, 0.01
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
takekosh tty1 :0 02:26 4:24m 9.75s 0.02s pam: gdm-password
takekosh pts/0 :0.0 02:26 13:16m 0.11s 0.11s bash
topはどのプロセスがCPUを使っているかを確認するのに使います。
top - 15:51:37 up 1:12, 4 users, load average: 0.06, 0.05, 0.00
Tasks: 183 total, 2 running, 181 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.3%us, 0.3%sy, 0.0%ni, 98.5%id, 0.6%wa, 0.0%hi, 0.2%si, 0.0%st
Mem: 2054880k total, 640624k used, 1414256k free, 20484k buffers
Swap: 4128760k total, 0k used, 4128760k free, 299380k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3312 takekosh 20 0 15020 1252 920 R 0.7 0.1 0:00.04 top
2116 root 20 0 130m 29m 7436 S 0.3 1.5 0:10.13 Xorg
2477 root 20 0 40328 612 364 S 0.3 0.0 0:02.11 udisks-daemon
2899 takekosh 20 0 310m 15m 10m S 0.3 0.8 0:05.88 gnome-terminal
「%CPU」の部分が大きいプロセスがCPUを使っています。重くなっている処理ですが、このプロセスが原因ではない場合もあります。
sarは10分ごとのサーバ状況を表示します。
$ sar
Linux 2.6.32-220.7.1.el6.x86_64 (feanor.localdomain) 2012年07月07日 _x86_64_ (2 CPU)
00時00分01秒 CPU %user %nice %system %iowait %steal %idle
00時10分01秒 all 12.29 0.00 4.91 0.14 0.00 82.66
00時20分01秒 all 6.21 0.00 4.16 0.04 0.00 89.59
コマンドがない場合は「yum install sysstat」で幸せになれます。
このうち「%user」が高ければ「CPUを使い切っている」になります。その時はさっきのtopで見たプロセスを調整することになります。「%iowait」が高い場合はCPUは「他に引きずられて高くなっている」になります。その場合はディスクI/Oを疑ってみます。
時系列での表示なので、負荷の上がった時間帯に走り始める処理(たとえばバックアップとか)を知っていると、それを疑うと近道です。近道ですが、あくまでも推測になので、ときどき遠回りになります。
長くなったので一旦切ります。次はディスクI/Oの確認です。
続き:サーバの負荷を調べるコマンド集その2