質問: Redhat系OSでの複数コアを持つCPUで各コアへの処理の分散の方法を知りたいと思っています。 Xeon L3426をCPUとするマシンで、CentOS5.5でApache上のPHPを高速に動かすことが目的です。CakePHPを使用して構築したプログラムを動かしています。 CPUのグラフを見ていると、CPUのうちの特定のコアにのみ処理が集中してしまっていて、処理スピードが上がりません。処理を4つの各コアに、上手に分散させる方法をご存じの方は居ませんでしょうか? なお、renice -20 httpd で、apacheの処理の優先度は既にあげています。
回答: 結論から申し上げますと「残念ながら簡便な方法はありません」 【1】分散させるためにはマルチスレッドへの対応が必要です apache2.x系はマルチスレッド対応 phpも実験的にスレッドセーフなバージョンが用意されてます 【2】マルチにも対応してますけれどmod_phpを使う場合は非推奨です > > マルチスレッド版の Apache をビルドするには、ターゲットシステムがスレッドに対応していなければなりません。 その場合は、PHP についても実験的な Zend Thread Safety (ZTS) でビルドしなければなりません。 この構成では使用できない拡張モジュールもあります。推奨される方法は、Apache をデフォルトの prefork MPM モジュールでビルドすることです。 > > > http://www.php.net/manual/ja/faq.installation.php#faq.installati... > > なぜ、Apache 2 のマルチスレッド MPM モードを実運用環境で使用するべきではないのですか? > > > PHP はグルー(糊)です。このグルーは、多くのサードパーティ製のライブラリを くっつけることによりクールな Web アプリケーションを構築するために使用され、 直観的で簡単に習得できる言語インターフェイスにより、一つの整合性のある実体として 見せることができます。 PHP の柔軟性と力は、プラットフォームの安定性と堅牢性に基づいています。 グルーによる結合をするためには、OS や Web サーバ、サードパーティ製のライブラリを 必要とします。 これらの一つの機能が停止した場合、PHP は問題を特定し、速やかに修正する 手段を必要とします。 実行スレッドを完全に分離しなかったり、 メモリセグメントを完全に分離しなかったり、 各リクエストで使用される強力なサンドボックスを有さないことで、 基本的なフレームワークをより複雑なものにした場合、 PHP のシステムに弱点が生まれます。 > > > マルチスレッド MPM を使用する必要がある場合、 PHP が自分のメモリ空間で実行される FastCGI 設定を観てみてください。 > > > 【3】phpをCGIモードで利用すればマルチスレッドも可能ですけれど問題はいろいろあります phpはモジュールモードとCGIモードでは動作が異なる場合があり、いろいろと苦労します CakePHPも細々した調整が必要となり、多くの皆さんがいろいろ苦労なさってます 【4】CakePHPを使う利点は開発の容易さです ハードウェアやソフトウェア構成にあわせてチューニングを行いたい向きの開発には向きません php自体もお手軽(?)に動的ページを生成する手段の1つのため速度や効率を求める場合はperl、 さらにはjavaやCを使うことまでも考慮しなければならない場合もあります どうしても処理速度が問題となっているのであればCakePHPを利用しているという時点から、 考え直さないといけないでしょう 【5】apache+phpだけの利用でマルチコアは少し贅沢 VPSで複数ドメインを動かす場合などはマルチコアの真価が発揮できると思います 1ドメインの運用だけでもapache、MySQLなどを並列に動かせるメリットはありますが、 物理4コア(論理8コア)は贅沢すぎた選択だったかもしれません 同じお金を出すならば、メモリをより多く搭載したり、より高速なHDDを搭載したりすることのほうがよかったのかもしれません 1台の高性能なサーバよりも、低性能なサーバを複数用意して、分散させるなども時には有効な手となる場合があります ほかにも、いろいろ細々と考えなければなりませんので最初に申し上げたとおり「残念ながら簡便な方法はありません」