サーバの負荷を調べるコマンド集その1:CPUの確認

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