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

C10K問題で台頭してきたnginxだがapacheの代わりに使うか?
そもそもC10Kの10000クライアントを1webサーバーで処理するという前提の時点でナンセンスな話だと鼻で笑い飛ばしたい話なんですがw
ただし、C10K問題が話題に上がった当時と今とではハードウェアの性能が違うので、2013年現在で考えるならという前提での話だと言うのを勘違いしてはいけない。

C10K問題の話を簡単にすると
apacheはマスタープロセス→ワーカープロセスを新規で立ち上げ処理を任せる。
・プロセス毎にスタックメモリを消費する
・32bitOSのプロセス番号がパンクする
という問題から同時接続数が多くなるとOS死んじゃうね
これに対して、nginxだとマスタープロセス→ワーカープロセス内でイベントドリブン
1プロセス中でマルチスレッドしちゃうからapacheの抱える問題はないよ

上のような話を踏まえた上で、今現在の事情で考えてみましょう。
プロセス番号の問題は64bitOSで回避出来るので何ら問題は無くなっていますので論外です。
スタックメモリの問題は相変わらず重要ですが、搭載メモリ量は増えていく一方なのと最初に書いたように10000も同時接続させないですw
あとapache2系からMPMが提供されスレッド管理可能な上に2.4系からnginxと同じイベント駆動も実装されました。
が、MPMの話は置いといて、あえてここではapache1系のpre-forkですらないfork起動を前提に考えていく事にしましょう。

まずnginxのマルチスレッドですが、タスク管理はそもそもOSの役割です。
windowsであればOSがイベント(メッセージ)を管理するのですが、Linuxはそんな機能はないのでアプリとしてイベントを実装しないといけないんじゃ?
コンピューターの動作原理は昔の1CPU1コアの時代のマルチタスクで考えればOKです。
脳みそは1つなので同時に考えれる=処理出来るのは本当は1つですが、CPUのアイドルタイム(空時間)をうまい具合に各プロセスに割り当てる。
CPUリソースの割り当て=タスク管理をプロセス内で複数の処理(イベント)を管理しようというアプローチです。
古いLinuxカーネルはスレッド自体サポートしていませんでした。
(多分)2.4系の場合は、スレッドという単位にはCPUリソースは割り当てられません。
(多分)2.6以降であれば、ライトウェイトプロセスの採用によりスレッドは擬似プロセスとして扱われます。
これに対してapacheはプロセス管理ですので、OSがCPUリソースをプロセスに割り当てたタイミングでその処理に専念して処理します。
OSがCPUリソースを割り当てるタスクの単位はプロセスだと言う前提の説明がここまで。

最近は複数コアのCPUが当たり前になってしまったというハードウェア事情があり、困った事に本当にパラレルでプログラムが動いてしまいます。
まずapacheとnginx双方でマスタープロセスという物を書きましたが、こいつがport80で無限ループ待ち受けしてる本体ですね。
apacheの場合はワーカープロセスを立ち上げ、この子の相手は君がしてね!とプロセス移譲(fork)するのでCPUリソースはOSのタスク管理機能に任せてフルに活かせます。
次にnginxの場合は、ワーカープロセスが1つだと仮定するとCPUコアが8つでも古いカーネルでは1コアで処理してしまうのでCPU性能を活かせない事がありました。
ここでの話題は今現在のハードウェア事情で考えるですがら、LWPが前提となりワーカープロセスが1でもスレッドにCPUリソースが割り当てられるのでこれも問題ありません。

メモリ消費の点でnginxが有利に思われますが、問題点とされるプロセス毎にスタックやヒープが消費されるという話があります。
スレッドの場合はプロセスに割り当てられたスタックメモリを共有するのでスレッド数に注意する必要があります。
スタックメモリはOS等が勝手に割り当てるメモリなので、いくら必要か分からない部分ですからスレッド管理だとパンクするのが怖いです。
windows9X時代にやたらとスタックメモリーのエラーでDrワトソンが出てきたのは懐かしい思い出でしょうか?
今現在のハードウェア事情では搭載出来るメモリもどんどん増えていきます。
プロセス毎にスタックを消費するのと、プロセス内でスレッド数をいくらに制限すれば良いのか不透明な運用。
どちらに重きを置くかで考え方が変わる部分では無いでしょうか?

ただ、ここで不思議になってくるのは、ロードバランサーやL3スイッチなどのwebサーバーよりも上位のハードウェアです。
まずL3スイッチは機種にもよるんでしょうけど、中にlinux入ってますよね?
ロードバランサーは私は設定した事が無いので知らないですけどlinuxベース臭いですよね?
webサーバーは複数台に分けても、分散するまでの経路上のハードウェア達ってC10K問題は無いんですかね?

Leave a Reply

Time limit is exhausted. Please reload CAPTCHA.