PHPでスレッド処理
勘違い
nginXのイメージとして、
静的コンテンツ=nginX 動的コンテンツ=Apacheという雰囲気だと思っていたら、
twitter経由でPHPでふつうに使えるよ。と指摘された。
そもそもPHPでスレッド処理することを
あんまり考えたことがなかったので下記にまとめる自分メモ。
PHPはpreforkの使用が推奨。1クライアント1プロセス。
PHPの場合はApacheのpreforkMPM(フォーク駆動)が推奨とされているので
基本的にはプロセスを予め立ち上げておくことで、立ち上げ時のオーバーヘッドを削りつつ、
クライアント1つに対して、1プロセスを与えていく。
プロセスを増やしていくとやはりメモリ容量を圧迫し、例えば
自分のSAKURA VPS512プランでは、こんな感じが限界↓
<IfModule prefork.c> StartServers 8 MinSpareServers 5 MaxSpareServers 10 ServerLimit 15 MaxClients 15 MaxRequestsPerChild 50 </IfModule>
この状況は「各プロセスが一つのクライアントを受け付ける+ブロッキングI/Oを使う」状態。
PHPでもworkerMPM(マルチスレッド駆動)でスレッド制御もできる。
では、PHPでスレッドの処理ができないのかというとそんなことはなく、
PHP5.3以上ではphp-fpm(FastCGIProcessManager)がrpmパッケージで用意されていたりする位なので、
ふつうにapacheのworkerMPMを使用できる。
※workerMPMでスレッド制御するには注意点2個
1.PHPのスレッドセーフ版のインストールが必要
2。mod_php要はapacheのモジュールとしては動作しないので、PHPをCGI(php-fpm)として動かす必要がある。
オペレーション参考)
http://www.obaland.net/blog/archives/202
http://vine.1-max.net/apache2-php5.html
この状況は「各スレッドが一つのクライアントを受け付ける+ブロッキングI/Oを使う」状態。
nginXを使用することでPHPもメモリの消費を抑えたイベント駆動が可能になる?
http://heartbeats.jp/hbblog/2012/01/nginx01.html
nginxではマルチスレッドを使わずに、イベント駆動のアーキテクチャを採用することにより、C10K問題に対応するような仕組みを設けております。 このため、メモリの使用量も抑えることができ、メモリが少ないサーバでもそれなりに快適に動作します。 とのこと。
また、
nginxではWebアプリケーションを(apacheのmod_phpやmod_wsgiのように) Webサーバ自体に組み込んで動作させることはできません。 WebアプリケーションをFastCGIやSCGIやuWSGIに対応したアプリケーションサーバ上で動作させて、 ネットワークあるいはUNIXドメインソケットを経由して利用します。
なるほど。この事から自分は
静的コンテンツ=nginX 動的コンテンツ=Apache
だと思い込んでいたのか。。
ということで、下記記事などで、導入方法は記載されている
apache のかわりにnginxを使ってみる(2)-2 php5.3系のphp-fpmをyumでインストールする
カテゴリnginxのインストール・設定
http://sakura.off-soft.net/centos/apache-nginx-2-rpm-php-fpm-install.html
この状況は「各スレッドが複数のクライアントを受け付ける+ノンブロッキングI/Oを利用する+レベルトリガ型の完了通知を利用する」状態
以下ワードの整理
C10K問題
ハードの性能上は問題がなくても、クライアントが多くなるとサーバーが
パンクする問題のこと。
同期=ブロッキング
メソッドを呼び出すとメソッド内の処理が完了するまで呼出元には
戻ってこない。
非同期呼出=ノンブロッキング
メソッドを呼び出した瞬間に、呼出し元に処理が戻ってくる。
※非同期に呼び出されたメソッドは環境によって処理タイミングが違う
ブロッキングI/O
データ処理が完了するまで待たされる
ノンブロッキングI/O
データの処理完了を待たされずに他の処理を行えること
イベントループモデル=イベント駆動
※並行処理をシングルスレッドで行う->ノンブロッキングI/Oによる非同期処理
Node.JS
サーバーサイドJavaScript
GoogleV8エンジン搭載
シングルスレッド非同期I/O環境
イベントループモデル