nginxとapacheはどちらを使うべきか?3

今までは元々C10K問題の走りとなったapache1で敢えて説明をしてきました。
apache2だとまた事情が変わるという件について今日は論じたいと思います。
MPMという機能が搭載されていますので、実は1プロセス中のスレッド管理というのが出来ます。
そして2.4からはイベントというnginxと同じ考え方のアプローチも提供しています。
apache1:fork
 新しいプロセスを都度立ち上げます
apache2:pre-fork
 プロセス管理ですが、nginxが最初にマスタ+n件のプロセスを立ち上げるのと同じで事前にプロセスを立ち上げるのでプロセス起動のオーバーヘッドを削減します。
apache2:worker
 1プロセス中でn件の通信をスレッド管理しますので、プロセス数消費の問題はこの設定で無くなります。
apache2:event
 nginxのイベント管理手法と同じアプローチで、1プロセス中でスレッド管理します。

元々Linuxカーネルにはスレッド管理という概念が無かったのでマルチプロセスのアプローチをしていたapacheですが、今ではマルチスレッドも実装しています。
workerのスレッドとイベントのスレッドは何が違うのか?
FastCGIで考えてみます。
ブラウザ:これ見たい>マスタープロセス:お前が相手しろ>スレッド:APサーバーと通信>APサーバー:結果どぞ>スレッド:結果どぞ>ブラウザ
お前が相手しろ以降の一連の処理単位がスレッドとして実行されるんだと思います。

次にeventですが、もっと細かい単位でスレッド分割されてるんだと思います。
TCPパケットの説明までするのは面倒なので単純に通信すると結果を得るまでに待ち時間があるのを想像して下さい。
APサーバーと通信するリスナースレッド
結果を処理するスレッド
ブラウザに結果を返すリスナースレッド

マルチスレッドプログラミングでは、同じプログラムが同時に動くので同一メモリにアクセスするプログラミングなどはご法度です。
ブロックする必要すらないのが理想的ですが、どうしてもそういう必要があるならセマフォという概念でブロックする必要があります。
前者も後者もスレッドセーフと呼ばれますが、前者をノンブロッキング、後者をブロッキングと言います。
せっかくマルチコアなら同時処理が可能な仕組みですが、ブロッキングだと処理を待つ必要があります。
nginxはノンブロッキングで作られており、apacheはブロッキングの部分があるそうです。
こればかりは、ソースを見た訳じゃないので噂を信用するしか無さ気ですね。

Leave a Reply

Time limit is exhausted. Please reload CAPTCHA.