Redhat系OSでの複数コアを持つCPUで各コアへの処理の分散の方法を知りたいと思っています。


Xeon L3426をCPUとするマシンで、CentOS5.5でApache上のPHPを高速に動かすことが目的です。CakePHPを使用して構築したプログラムを動かしています。

CPUのグラフを見ていると、CPUのうちの特定のコアにのみ処理が集中してしまっていて、処理スピードが上がりません。処理を4つの各コアに、上手に分散させる方法をご存じの方は居ませんでしょうか?

なお、renice -20 httpd で、apacheの処理の優先度は既にあげています。

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

ベストアンサー

id:windofjuly No.1

回答回数2625ベストアンサー獲得回数1149

ポイント60pt

結論から申し上げますと「残念ながら簡便な方法はありません」

 

【1】分散させるためにはマルチスレッドへの対応が必要です

apache2.x系はマルチスレッド対応

phpも実験的にスレッドセーフなバージョンが用意されてます

 

【2】マルチにも対応してますけれどmod_phpを使う場合は非推奨です

http://php.net/manual/ja/install.unix.apache2.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モードで利用すればマルチスレッドも可能ですけれど問題はいろいろあります

http://www.php.net/manual/ja/install.unix.commandline.php

phpはモジュールモードとCGIモードでは動作が異なる場合があり、いろいろと苦労します

CakePHPも細々した調整が必要となり、多くの皆さんがいろいろ苦労なさってます

 

【4】CakePHPを使う利点は開発の容易さです

ハードウェアやソフトウェア構成にあわせてチューニングを行いたい向きの開発には向きません

php自体もお手軽(?)に動的ページを生成する手段の1つのため速度や効率を求める場合はperl、

さらにはjavaやCを使うことまでも考慮しなければならない場合もあります

どうしても処理速度が問題となっているのであればCakePHPを利用しているという時点から、

考え直さないといけないでしょう

 

【5】apache+phpだけの利用でマルチコアは少し贅沢

VPSで複数ドメインを動かす場合などはマルチコアの真価が発揮できると思います

1ドメインの運用だけでもapache、MySQLなどを並列に動かせるメリットはありますが、

物理4コア(論理8コア)は贅沢すぎた選択だったかもしれません

同じお金を出すならば、メモリをより多く搭載したり、より高速なHDDを搭載したりすることのほうがよかったのかもしれません

1台の高性能なサーバよりも、低性能なサーバを複数用意して、分散させるなども時には有効な手となる場合があります

 

ほかにも、いろいろ細々と考えなければなりませんので最初に申し上げたとおり「残念ながら簡便な方法はありません」

id:nakamura12go

ありがとうございます。

難しいことがよくわかりました。

CakePHPでのシステム自体はもう作ってしまったので、なんとか速くする方法を考えます。

2010/08/27 14:05:17
  • id:standard_one
    自分なら速度を要求されたらネイティブコードで複数スレッド作るなぁ
    スクリプト言語はお手軽さが命だから速度を求めるのは酷な気がする
  • id:b-wind
    速度を要求してると言うよりまずは単に今あるハードウェアを有効に使いたいという感じかな。

    Redhat 系と言っても中身は様々だ。
    使っている kernel のバージョン・種類、Apache の MPM の設定、PHP がスレッド対応かどうか
    そういった情報が無ければ答えは得にくいと思うが。

    あとはそもそもマルチコアに振り分けられる処理をしているのかどうかも問題かな。
    推測ではシングルCPU用の kernel を間違って入れたか、特定のスレッドのみが処理能力を要求していて
    他のコアに処理を振りようが無いと見るが。
  • id:b-wind
    >分散させるためにはマルチスレッドへの対応が必要です
    うそん。
    そこそこ分散させるだけならマルチプロセスで十分だと思うが。
    特に放っておいても多重アクセスが発生するようなウェブアプリケーションの場合は。

    >renice -20 httpd
    これって場合によっては逆効果じゃないかなぁ

    とは言ってみた物のアプリケーションの作りやら apache 以外に動いているプロセス等
    考慮に必要な情報はたんまりとあるので、単一的な答えはないし「簡便な方法は無い」ってのは同意だけど
  • id:t-wata
    http://d.hatena.ne.jp/naoya/20070518/1179492085
    負荷が低い状態だと偏るようです。
  • id:nakamura12go
    いろいろと皆様コメントありがとうございます。
    試行錯誤を繰り返してみてなんとかやってみます。
    零細企業だと技術面で困っても相談できる人もいないので、様々なヒントを与えて頂けると助かります。

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

トラックバック

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

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

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