TOPサーバ構築・運用> サーバが重いとは
サーバ負荷の原因を探れ
サーバ負荷の原因を探れ!

サーバが重いってどういうこと?

著者:ウノウ  尾藤 正人   2007/10/4
第1位 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/


INDEX
サーバが重いってどういうこと?
サーバが重いとは
  メモリの使用状況を確認する
  ディスクI/Oを確認する