|
|
サーバ負荷の原因を探れ! |
サーバが重いってどういうこと?
著者:ウノウ 尾藤 正人 2007/10/4
2007年10月の連載ランキング1位(一覧を見る)
|
|
|
1 2 3 次のページ
|
|
サーバが重いとは
|
サーバ管理者だけではなく誰でも一度は経験したことがある「サーバが重い」という現象。一言で「重い」というのは簡単ですが、重いというのは具体的にどういうことなのでしょうか。
ここでいう重い・軽いは単一のベクトルで判断できるような簡単な代物ではなく、様々な要素によって発生する現象です。処理が重いからといって闇雲にハードウェアを増強するのは賢いやり方とはいえません。例えば、メモリ不足が高負荷の原因なのに、CPUを高速なものに変えても効果はほとんどないでしょう。
このような無駄な投資を避けるためにも、負荷の原因を特定して素早く対応策を講じるのはサーバ管理者にとって重要なスキルになります。本記事ではサーバ負荷の特定の仕方と対策の仕方について、簡単な概要を説明します。
今回はLinuxでの操作を前提にしています。他のUNIX処理系でも同様な操作が行えるとは思いますが、コマンドや出力結果が若干違う場合があります。あらかじめご了承ください。
|
重い ⊇ 応答速度が遅い
|
「重い」とは具体的にどういうことでしょうか。処理が重いと観測するのは通常は人です。観測者が興味があるのは、自分が実行している処理の応答速度になります。応答速度が遅いときに「重い」と感じます。
では、応答速度が遅ければ重いのかというとそうではなく、実際は本当にその処理が「遅い」のかもしれません。遅い処理を速くするのはまた別問題ですので、本記事では取り扱いません。
|
サーバ上での応答速度が遅い ⊇ 実行待ちプロセスが存在する
|
単に応答速度が遅いといっても、もしかしたらネットワーク帯域の問題かもしれません。問題の切り分けのためにも、まずはサーバ上での処理について考えてみます。
サーバ上での処理の応答速度が遅いということは、他のプロセスの処理に時間がかかってしまい、目的のプロセスがなかなか処理されないということになります。サーバ上での負荷が高いということは、待ちプロセスが存在するということです。
つまり実行待ちプロセスがたくさん存在すれば存在する程、「目的のプロセスへの切り替えが遅くなって応答速度が遅くなる」つまりサーバ負荷が高くなっていきます。
|
実行待ちプロセスの数を確認する
|
それでは実行待ちのプロセスを確認しましょう。実行待ちプロセスの数を確認するにはtopコマンドを使用します。
% top
右上にある「load average」が実行待ちプロセスの数を表します。
top - 09:12:29 up 55 days, 15:09, 2 users, load average: 0.84, 0.48, 0.33
数字が3つありますが、左から順番に1、5、15分間の実行待ちプロセスの平均数になっています。この実行待ちプロセスの平均数(ロードアベレージ)がサーバ負荷の判断基準となる重要な数値になります。ロードアベレージがCPU数より大きくなっている場合は「処理が追いついていない」つまりサーバ負荷が高いということです。
一昔前までは単純にロードアベレージが1以上かどうか判断すればよかったのですが、最近はマルチコアのCPUが増えてきたので、ちゃんとサーバのCPUのコアがいくつなのか確認するようにしましょう。これはOSからは「1コア = 1CPU」に見えるからです。コアが2つのCPUの場合は実行待ちプロセスが2以下になっているかどうかをチェックしてください。
ただし、ロードアベレージがCPU数以下だといって安心してはいけません。ロードアベレージはあくまでも平均数ですから、一時的に実行待ちプロセスが発生している状況も考えられます。できるだけ0に近づける努力を怠らないようにしましょう。
|
CPUの使用状況を確認する
|
まずはCPUの使用状況を確認しましょう。topコマンドを実行するとに次のようにCPUの使用率が表示されています。
Cpu(s): 0.3%us, 0.3%sy, 0.0%ni, 90.4%id, 0.0%wa, 0.0%hi, 8.9%si, 0.0%st
主に見るのは次の3つの値です。
us(user) |
実行している割合 |
id(idle) |
お休みしている割合 |
wa(wait) |
待ち状態の割合 |
表1:CPUの使用状況で確認する項目
userの値が大きい(100%に近い)場合はCPU負荷が高くなっています。CPU負荷の高い状態が継続している場合はCPUがボトルネックになっています。
idleが大きい場合はCPUがほとんど使われていません。仮にサーバ負荷が高いとしたら、ボトルネックは別の所にあるということです。
waitが大きい場合はI/O待ちをしているプロセスが多く存在する可能性があります。この場合はディスクI/Oかネットワークがボトルネックになっている可能性が高いです。
CPU負荷の高いプロセスを特定するにはtopコマンドを実行中に「P(大文字)」を押します。するとCPU使用率の高い順にプロセスをソートしてくれますので、CPU負荷の高いプロセスを特定することが可能です。
|
CPUの負荷が高い場合の対策
|
CPUの負荷が高い場合は次のような対策を行います。
- アドホックな対策
-
- 該当プロセスを終了させる
- 該当プロセスのスケジューリング優先順位を下げる
- 恒久的な対策
-
- 時間のかかる処理を高速化する
- CPUを高速なものに変更する
- サーバを増やして負荷分散する
- 事前にスケジューリング優先順位を下げて実行する
表2:CPUの負荷が高い場合の対策
たまにプログラムが暴走してCPUの負荷が高くなる場合があります。そのような場合は、該当プロセスをkillコマンドを使って終了させましょう。CPUの負荷が高くても終了できないプロセスの場合は、ひたすら待つしかありません。
バックグランドの処理などで実行スピードが要求されない場合は、reniceコマンドを使ってプロセスのスケジューリング優先順位を下げましょう。
また、CPU負荷の高い状態が頻繁に起きる場合は、なんらかの恒久的な対策を行う必要があります。プログラムそのものを高速化したり、ハードウェアを増強するなどして対策してください。実行スピードが要求されないバックグランドの処理は、niceコマンドを使ってスケジューリングの優先順位を下げてやるのも1つの方法です。
|
1 2 3 次のページ
|
|
|
|
著者プロフィール
ウノウ株式会社 尾藤 正人
CTO
広島市立大学大学院在学中にVine Linux SPARC版の開発を行う。2002年4月、HDEに入社。2003年度未踏ユースプロジェクトに採択され、「みかん - サーバ自動選択型FTPサーバの開発」を行う。退職後、シリコンバレーに語学留学のため渡米。2004年12月、帰国してウノウに参画。写真共有サイト「フォト蔵」を開発中。
ブログ:ベイエリア情報局 http://blog.bz2.jp/
|
|
|
|