以下の環境及び状態のWEBサーバー複数台があります。

-------
CentOS5.1 32bit
CPU:Core2duo
MEMORY: 4GB
Apache2系 + PHP5 + Mysql(別サーバー)
高負荷ピーク時のCPU使用率:100%
低負荷時のCPU使用率:30%前後
高負荷時及び低負荷時のディスクIO:ほとんどナシ
高負荷時及び低負荷時のロードアベレージ:1.0未満
高負荷時のApacheプロセス数:100未満/150(maxclient)
Apacheプロセスの挙動:prefork
ApacheのKeep-Alive:Off
Apacheの処理:PHPの実行(動的コンテンツのみ)
-------

ディスクIOがほぼナシということは、ディスクキャッシュが有効に働いている。
起動プロセスが最大を満たしてないのでアクセスは裁ききっている。
にも関わらず、CPUが100%を超えるということはどのような原因が考えられ、
どこをチューニングの対象とし、最終的に皆様はどのような手段を講じるでしょうか。

何卒よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/07/11 01:50:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答4件)

id:b-wind No.1

回答回数3344ベストアンサー獲得回数440

ポイント23pt

高負荷時及び低負荷時のロードアベレージ:1.0未満

状況から考えて、この数値はおかしい。

LBの値は論理CPU数未満であれば問題ないが、それ以上は過負荷であると判断する。

高負荷時のApacheプロセス数:100未満/150(maxclient)

ということであれば、最低でもLB は Apache のプロセス数程度は存在しているはず。

vmstat を過負荷時に実行しその値を再度確認すべし。


起動プロセスが最大を満たしてないのでアクセスは裁ききっている。

起動プロセスとは Apache の事だと思うが、アクセスを裁けているかとプロセス数の最大値はあまり関係ない。

というより、PHP等の動的コンテンツにおいて prefork で 100 を超えるプロセスは明らかに処理し切れていない。

サーバーの処理能力次第ではあるが、数十プロセスが限界と見て良い。

ディスクIOがほぼナシということは、ディスクキャッシュが有効に働いている。

というよりは、CPU負荷が高すぎてディスクアクセスを要求する処理が発生していない。


CPUが100%を超えるということは

CPU「使用率」が 100% を超えることはない。最大で 100% の指標であるから。

ただし、この場合複数コアのCPUを利用しているので、「表記上」100 * コア数 までの数値が出ることはある。

top コマンドなどでは複数コアそれぞれの CPU 使用率を分けて表示するのでそれを参考にする手もある。


とりあえず、現状では判断するに足りる情報が無いので、何とも言えない。

【 vmstat 】 メモリーやCPUの負荷率や使用状況を表示する:ITpro

サーバ診断:vmstat - Y-110's Wiki

@IT:障害の兆候を見逃さないためのサーバ監視(2/3)

各種ツールを使って細かなデータが取れれば、判断のしようもあるが。

id:osamuaa

ありがとうございます。

>状況から考えて、この数値はおかしい。

・・えっと、どのようにおかしいのでしょうか?

ロードアベレージの値が1未満ということは実行待ちキューがない状態で、

その状態がおかしいということでしょうか、それともCPUが100%張り付きなのに

1未満という値を示しているのがおかしいということですかね??

コアは2つなので、2以下であるのでキュー待ちはないかなぁと思っています。


>vmstat を過負荷時に実行しその値を再度確認すべし。

了解です。


>prefork で 100 を超えるプロセスは明らかに処理し切れていない。

>サーバーの処理能力次第ではあるが、数十プロセスが限界と見て良い。

そうなんですか、このあたり、ちょっと理解できてません。


>というよりは、CPU負荷が高すぎてディスクアクセスを要求する処理が発生していない。

・・・すみません。この意味もちょっと私では理解できません・・

上記に書いたように低負荷時でもディスクIOはほぼナシ状態なのですが。どうなんでしょうか。。


>CPU「使用率」が 100% を超えることはない。最大で 100% の指標であるから。

確かに。「張り付き」と書き間違えました。失礼。


>この場合複数コアのCPUを利用しているので、「表記上」100 * コア数 までの数値が出ることはある。

おそらく使用率はコア数で割って出しているので100%を超えることはないと思っていました。

>top コマンドなどでは複数コアそれぞれの CPU 使用率を分けて表示するのでそれを参考にする手もある

コア別で出せるのですか、それも知りませんでした。

その方法もしくは文献を教えていただくことは可能でしょうか。

2009/07/04 03:12:48
id:kn1967 No.2

回答回数2915ベストアンサー獲得回数301

ポイント23pt

まずは余談ですが、top が動いている状態で 1 を入力すれば、

CPU毎(コア毎)/平均の表示切り替えが出来ます。


(1)CPU

能力が足らないために利用率が常にピークに近い状態であるとすれば、

多くのプロセスが待たされているはずなので、

ロードアベレージの数字が1前後というのはおかしい。

    ↓

仮にではありますが、常にピークではなくて、

作業が集中した時などに一時的に100%に跳ね上がり

その際のロードアベレージが1前後になるという事であれば、

一時的に忙しかったけれどもCPUの処理能力はまぁ足りているという事になる。

    ↓

使用率が常に高く、ロードアベレージが常に 1 を超えるという状態では、

能力に余裕が無いと言えるので、交換なり、ソフト側の調整ができないかを検討。

ただし、WEBサーバの場合は計算能力よりも遥かに遅いネットワーク環境のほうが、

先に頭打ちになったりしますので、必ずしもロードアベレージが1を超えたらダメ、

というものでもなく、常に1を超えるようであれば要注意くらいでよろしいかと思います。


(2)ディスクI/O

どのくらいのタイミングで、どれぐらいのデータを取り扱っているかや、

ドライブに搭載されているキャッシュなど諸々の条件が重なるので、

ディスクI/O の値だけではディスクキャッシュの有効性は図れませんが、

ほぼ無しという事であれば、その方面での心配はとりあえず無いと判断。


(3)メモリ

free コマンドで使われていない量などをチェックしてみればよいでしょう。

4GB搭載で、データベースは別サーバ上ですし、プロセスが80-100程度であれば、

ほとんどがキャッシュやバッファに回されてると思いますけど・・・。


失礼ながら、

CPU使用率だけに踊らされているように思えました。

ロードアベレージの値を、しばらく観察してみてください。

調査している理由として、最近サイトが重いということであれば、

先にネットワーク負荷のほうを計測する必要があるかと思いますが、

それはまた別の話ですね・・・。

id:osamuaa

ありがとうございます。

>top が動いている状態で 1 を入力すれば、

>CPU毎(コア毎)/平均の表示切り替えが出来ます。

これにおいて、もうひとつ疑問が出てきたので以下に質問をたてさせていただきました。

http://q.hatena.ne.jp/1246866691

2009/07/06 16:52:58
id:b-wind No.3

回答回数3344ベストアンサー獲得回数440

ポイント22pt

ロードアベレージの値が1未満ということは実行待ちキューがない状態で、

その状態がおかしいということでしょうか、それともCPUが100%張り付きなのに

1未満という値を示しているのがおかしいということですかね??

コアは2つなので、2以下であるのでキュー待ちはないかなぁと思っています。

そう。理解の通りこの値が2以下であることは実行待ちプロセスが無いことを示す。


しかし、CPU 使用率は 100% を維持、かつ Apache のプロセス数も数十を超えているという。

OS自体が使用しているデーモン類だけでもいくつかのプロセスが存在するのに上記の状態は矛盾する。


>サーバーの処理能力次第ではあるが、数十プロセスが限界と見て良い。

そうなんですか、このあたり、ちょっと理解できてません。

考えても見なさい。窓口は2人(2コア)しかいないのに、待ち行列が数十人もいるんですよ?

「同時に」処理できるのは1コアあたり1プロセスまで。

行列の出来るラーメン屋さん状態なのは分かりますか?


コア別で出せるのですか、それも知りませんでした。

その方法もしくは文献を教えていただくことは可能でしょうか。

該当のOSであれば、top と打てばCPU使用率の欄が2行出ているはずだが。

Linux 覚書 システム全体の情報を表示する方法 (top コマンド) -- Ray:雑学事典 -- Ray:雑学事典

出ていないなら、2コア分認識していない可能性がある。

以下のコマンドを実行し、kernel がどう認識しているか確認すること。

$ cat /proc/cpuinfo
id:karla No.4

回答回数130ベストアンサー獲得回数4

ポイント22pt

ぱっと見た感じではPHPに問題があるのではと思います。

まずはPHPアクセラレータの導入(APC等)をしてみて下さい。

あとはsarコマンドにてCPUと合わせて変化しているリソースの監視。

topコマンドで何のプロセスが消費しているのかを確認。

その結果を見て次の対策を考える感じでしょうか。

  • id:osamuaa
    一点、分かりづらい表現ですみません、訂正です。
    「高負荷時のApacheプロセス数:100未満/150(maxclient)」
     ↓
    「高負荷時のApacheプロセス数:80~100以下/150(maxclient)」

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません