-------
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.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
各種ツールを使って細かなデータが取れれば、判断のしようもあるが。
まずは余談ですが、top が動いている状態で 1 を入力すれば、
CPU毎(コア毎)/平均の表示切り替えが出来ます。
(1)CPU
能力が足らないために利用率が常にピークに近い状態であるとすれば、
多くのプロセスが待たされているはずなので、
ロードアベレージの数字が1前後というのはおかしい。
↓
仮にではありますが、常にピークではなくて、
作業が集中した時などに一時的に100%に跳ね上がり、
その際のロードアベレージが1前後になるという事であれば、
一時的に忙しかったけれどもCPUの処理能力はまぁ足りているという事になる。
↓
使用率が常に高く、ロードアベレージが常に 1 を超えるという状態では、
能力に余裕が無いと言えるので、交換なり、ソフト側の調整ができないかを検討。
ただし、WEBサーバの場合は計算能力よりも遥かに遅いネットワーク環境のほうが、
先に頭打ちになったりしますので、必ずしもロードアベレージが1を超えたらダメ、
というものでもなく、常に1を超えるようであれば要注意くらいでよろしいかと思います。
(2)ディスクI/O
どのくらいのタイミングで、どれぐらいのデータを取り扱っているかや、
ドライブに搭載されているキャッシュなど諸々の条件が重なるので、
ディスクI/O の値だけではディスクキャッシュの有効性は図れませんが、
ほぼ無しという事であれば、その方面での心配はとりあえず無いと判断。
(3)メモリ
free コマンドで使われていない量などをチェックしてみればよいでしょう。
4GB搭載で、データベースは別サーバ上ですし、プロセスが80-100程度であれば、
ほとんどがキャッシュやバッファに回されてると思いますけど・・・。
失礼ながら、
CPU使用率だけに踊らされているように思えました。
ロードアベレージの値を、しばらく観察してみてください。
調査している理由として、最近サイトが重いということであれば、
先にネットワーク負荷のほうを計測する必要があるかと思いますが、
それはまた別の話ですね・・・。
ありがとうございます。
>top が動いている状態で 1 を入力すれば、
>CPU毎(コア毎)/平均の表示切り替えが出来ます。
これにおいて、もうひとつ疑問が出てきたので以下に質問をたてさせていただきました。
ロードアベレージの値が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
ぱっと見た感じではPHPに問題があるのではと思います。
まずはPHPアクセラレータの導入(APC等)をしてみて下さい。
あとはsarコマンドにてCPUと合わせて変化しているリソースの監視。
topコマンドで何のプロセスが消費しているのかを確認。
その結果を見て次の対策を考える感じでしょうか。
ありがとうございます。
>状況から考えて、この数値はおかしい。
・・えっと、どのようにおかしいのでしょうか?
ロードアベレージの値が1未満ということは実行待ちキューがない状態で、
その状態がおかしいということでしょうか、それともCPUが100%張り付きなのに
1未満という値を示しているのがおかしいということですかね??
コアは2つなので、2以下であるのでキュー待ちはないかなぁと思っています。
>vmstat を過負荷時に実行しその値を再度確認すべし。
了解です。
>prefork で 100 を超えるプロセスは明らかに処理し切れていない。
>サーバーの処理能力次第ではあるが、数十プロセスが限界と見て良い。
そうなんですか、このあたり、ちょっと理解できてません。
>というよりは、CPU負荷が高すぎてディスクアクセスを要求する処理が発生していない。
・・・すみません。この意味もちょっと私では理解できません・・
上記に書いたように低負荷時でもディスクIOはほぼナシ状態なのですが。どうなんでしょうか。。
>CPU「使用率」が 100% を超えることはない。最大で 100% の指標であるから。
確かに。「張り付き」と書き間違えました。失礼。
>この場合複数コアのCPUを利用しているので、「表記上」100 * コア数 までの数値が出ることはある。
おそらく使用率はコア数で割って出しているので100%を超えることはないと思っていました。
>top コマンドなどでは複数コアそれぞれの CPU 使用率を分けて表示するのでそれを参考にする手もある
コア別で出せるのですか、それも知りませんでした。
その方法もしくは文献を教えていただくことは可能でしょうか。