とあるサイトにて、アクセス数が増加してくると
Can’t create a new thread (errno 12); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug
というエラーが連発し、ページが表示されなくなる現象に悩まされ中。コンソールでプロセスをみてみると、httpdが山のように・・・溢れています。。CPUの使用率も凄いことになってるし、Load Averageも高い。
そのページは外部サーバのページから引っ張ってきたデータと、自サーバのDBから引っ張ってきたデータをphpで集計して表示しているんだけど、どうもその処理待ちでプロセスがたまって上記エラーがでているっぽい。時間が経てば処理待ちが解消されるのか普通にページが表示されるようになるんだけど。ボトルネックは外部サーバとの通信負荷か?
ページを表示するたびに外部サーバから毎回データを引っ張ってくるので、本当は「PEAR::Cache_Lite」なんかを使うべきなんだろうけど、リアルタイム性が重要な情報を表示しているためキャッシュの利用は不可。
外部サーバとの通信負荷以外にも、とってきたデータに正規表現かけて多次元配列でごにょごにょしたりphpでいろいろやっているので、とりあえずそちらの負荷対策をやりましょうと。てことで、やった対策としては、
- Zend Optimizer 3の導入
- eAcceleratorの導入
- httpd.confでKeepAliveまわりの調整
でphpの処理の高速化・負荷低減をはかりつつ、httpd.confの設定でhttpdプロセスが増えるのを押さえつつ、みたいなのを期待しましたが、あまり効果でずorz
うーん、サーバスペックの増強が最後の手段だけど、、そもそもの仕組みに問題あるっぽいからなぁ。どうしたものか。