サーバ負荷の原因を探る方法
インフラエンジニアの伊藤です。
前回、サーバの負荷が上がったときに確認する「ロードアベレージ」というものをご紹介しました。
ロードアベレージでサーバの負荷を確認する ? ビヨンドブログ
ロードアベレージは、処理待ちのプロセスを表したものになります。
数値が高ければ高いほど処理待ちのプロセス数が多く、「負荷が高い」という状況になります。
今回は、なぜ負荷が高いという状況になるのか?の原因を探っていきたいと思います。
原因は大きく分けて2つある
ロードアベレージが高い状況が起こる原因は基本的に大きくわけて2つあります。
- CPUの処理が追いつかない
- ディスクI/Oの処理が追いつかない
では、それぞれが原因であるときの探り方を説明していきたいと思います。
CPUが原因の場合
まずはtopコマンドなどでCPUの使用率を見てみます。注目すべきは以下2つの値です。
%user | ユーザプロセスが使用しているCPU使用率 |
%system | システム(カーネル)が使用しているCPU使用率 |
一般的なプロセスがCPUに負荷がかかる場合は、だいたいユーザモード(%user)のCPU使用率が高くなっているはずです。
また、ユーザモードのプロセスは、大量のプロセスを動作させていたりする場合は、プロセスの切り替え等を行います。
その「プロセスの切り替え」を行う際にカーネルモード(%system)のCPUを使うので、
プロセスの切り替えが多いプログラムに関してはカーネルモードのCPU使用率が高くなっているでしょう。
ユーザモードのCPU使用率が高い場合
カーネルのCPU使用率が高い場合
ディスクI/Oが原因の場合
ディスクI/Oが原因の場合は、topで以下について注目してみます。
%iowait | ディスクI/Oが必要な場合のプロセスがアイドル状態である |
SWAP | メモリを使用しつくして、HDDをメモリ代わりに使用している量 |
iowaitの値は、ディスクからデータを読み書きを大量に行っている際に高くなることが多いです。
例えばDBサーバでデータベースへのアクセスが多いサーバは、iowaitの値が高くなりやすいです。
SWAPは、プロセスがメモリを全て使用してしまった場合にHDDをメモリ代わりに使用している容量になります。
SWAPを使う例としては、Webサーバなどで、大量にアクセスがあった場合にメモリを確保していってSWAPを使用することがあります。
SWAPを使用している場合、メモリの代わりにHDDを使用する=ディスクI/Oで負荷が高まるため、サーバの速度としては遅くなります。
iowaitが高く、ディスクI/Oが原因で負荷が高い場合
SWAPを使用している場合
調査していく
これで、CPUが原因か、I/Oが原因かがわかるようになると思います。
更にpsコマンド等でどのプロセスがCPUを使用しているか(SWAPの場合はメモリを使用しているか)を探っていきます。
ユーザモードのCPU使用率が高い場合には、I/O等で問題がないので、
CPUの性能を上げるか、プログラム的な見直しが必要になるかもしれません。
ディスクI/O側に問題がある場合は、メモリ増設を行ったり、
プログラム側でディスクI/Oではなくメモリの空きがある場所で一旦処理をさせるといった見直しが必要があるかもしれません。
また、ロードアベレージが低いけど処理が遅い場合があるかもしれません。
その場合にはソフトウェアの設定や、ネットワークの処理が問題になっている可能性があります。
まずは「負荷が高い」という問題に直面したときは、落ち着いて
どの部分に負荷がかかっているかを特定していくことが、解決への第一歩になるでしょう。