Can't create a new threadが連発する件

とあるサイトにて、アクセス数が増加してくると

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でいろいろやっているので、とりあえずそちらの負荷対策をやりましょうと。てことで、やった対策としては、

  1. Zend Optimizer 3の導入
  2. eAcceleratorの導入
  3. httpd.confでKeepAliveまわりの調整

でphpの処理の高速化・負荷低減をはかりつつ、httpd.confの設定でhttpdプロセスが増えるのを押さえつつ、みたいなのを期待しましたが、あまり効果でずorz

うーん、サーバスペックの増強が最後の手段だけど、、そもそもの仕組みに問題あるっぽいからなぁ。どうしたものか。

参考

  • ブックマーク
  • Feedly

この記事を書いた人

キタジマタカシ

長崎在住、フリーランスのWordPress テーマ / プラグインデベロッパー。 多数のプロダクトをオープンソースで開発・公開しています。現在は WordPress 有料テーマ Snow Monkey を開発・販売しています。