サーバのレスポンスが遅くなると経験のないサーバ管理者は無意味にメモリ増強を行ったりしますが、行き当たりばったりのシステム拡張は無駄な投資につながります。ボトルネック個所の調べ方は案外簡単なので、この際押さえるところをきちんと押さえて正しい方法論でシステム拡張をしていきましょう。
【一般論】
ボトルネックとなりうる要素は主に4つです。
①CPU使用率
②メモリ使用量
③ディスクI/O
④TCPコネクション数
これらを押さえておけばボトルネック個所の把握とその解消は難しくありません。これを踏まえた一般論を述べてみたいと思います。
WEBサーバの場合は多くの場合、TCPコネクション数から先に限界が来ます。OSやApache等のWEBサーバのパフォーマンスチューニングを十分施すことが前提ですが、その場合TCPコネクション数1万くらいまではなんとか保てると思いますが、それ以上のTCPコネクション数がある場合はサーバ増強が必要だと思われます。TCPコネクション数は「netstat -an」で調べることができます。
アプリケーションサーバの場合は多くの場合、CPU使用率とメモリ使用量から先に限界が来ます。この場合CPU増強とメモリ増強を行うことも重要ですが、アプリケーションを書き換えることのほうが効果的な場合が多いです。UNIXの場合はCPU使用率はtopコマンドかwコマンド、メモリ使用量はtopコマンドかfreeコマンド等で調べられます。Windowsの場合はタスクマネージャで調べましょう。
DBサーバの場合は、問題の切り分けが難しいです。通常①②③のどれかがボトルネックになります。CPU使用率が70%を超えた辺りから注意というのはよく言われますね。あと意外と気づきにくいけどディスクI/Oです。ディスクI/Oのレスポンスが大幅に低下している場合はストレージ政策の見直しからはじめるべきだと思います(この件は後日改めて記します)。UNIXの場合はvmstat,iostat等で調べましょう。
【各種コマンドの使いこなし方】
ここからは実際のボトルネック測定方法をコマンドの使い方と共に記してみたいと思います。
■CPUボトルネックの測定(UNIXの場合)
# top
151 processes: 150 sleeping, 1 running, 0 zombie, 0 stopped
CPU0 states: 0.4% user, 0.5% system, 0.0% nice, 98.1% idle
CPU1 states: 0.1% user, 0.5% system, 0.0% nice, 98.4% idle
Mem: 513596K av, 442136K used, 71460K free, 0K shrd, 77992K buff
Swap: 1044184K av, 14120K used, 1030064K free 208420K cached
CPU0と1の2個があって、それぞれidleが98%以上なので問題ないですね。
# w
12:08pm up 171 days, 1:20, 1 user, load average: 1.22, 1.02, 1.97
ロードアベレージが正常値なので問題ないですね。
※ロードアベレージの数値をどう読むかについてはこちらが参考になります。
■メモリボトルネックの測定(Linuxの場合)
# top
151 processes: 150 sleeping, 1 running, 0 zombie, 0 stopped
CPU0 states: 0.4% user, 0.5% system, 0.0% nice, 98.1% idle
CPU1 states: 0.1% user, 0.5% system, 0.0% nice, 98.4% idle
Mem: 513596K av, 442136K used, 71460K free, 0K shrd, 77992K buff
Swap: 1044184K av, 14120K used, 1030064K free 208420K cached
512MBのメモリを搭載しているマシンで、442M程度のメモリを使用していて70M程度のメモリしか空きがない、と読み取れますが、それは厳密には間違いです。もっと見てみましょう。
# free
total used free shared buffers cached
Mem: 513596 443556 70040 0 78340 209196
-/+ buffers/cache: 156020 357576
Swap: 1044184 14120 1030064
Linuxの場合空いるメモリはすべてCacheにまわそうとします。それがtopに出てくる数字です。では空いているメモリでCacheで使われている分を減らした分はどのくらいかを調べるにはfreeコマンドでの実行結果の2行目を見ます。これを見ると357MBくらい空いているのがわかります。よってこのマシンはメモリに大分余裕があると見ることができます。
■ディスクI/Oボトルネックの測定(Linuxの場合)
# vmstat 1 5
procs memory swap io system cpu
r b w swpd free buff cache si so bi bo in cs us sy id
0 0 0 3604 3580 23580 187696 0 1 0 1 1 1 0 0 1
0 0 0 3612 3580 23592 187636 0 8 148 96 1432 291 0 7 93
0 0 0 3612 3484 23624 187756 0 0 312 332 1376 321 0 10 90
0 0 0 3620 3456 23616 187772 0 8 164 80 1301 320 0 6 94
0 0 0 3620 3600 23636 187772 0 0 488 64 1340 318 0 8 91
ここではbi/boの部分を見ます。bi: Blocks received from a block device (blocks/s).
, bo: Blocks sent to a block device (blocks/s)。どのくらいが適正値かというのは予算によります。一番お金をかけた場合だとストレージのキャッシュが十分に積まれていて、どんなにディスクにアクセスしてもbi/boが0というパターンになります。(きちんとディスクに書き込みを完了する前にドライブが書き込み完了を返す)
■ネットワークボトルネックの測定(UNIXの場合)
# netstat -an | wc -l
3050
この数字がTCPコネクション数とほぼ同等です(厳密にはESTABLISHED,TIME_WAIT,FIN_WAIT等の総数。余計な部分は許容誤差ということで)。
Recent Comments