Apache
マルチプロセスモデル:接続ごとにプロセスをフォークするためメモリがいっぱいになりやすい。
・利点:メモリ空間が独立しているため、スクリプト言語が取り組みやすい
・欠点:同時接続が増えるとメモリが欠乏しやすい
マルチプロセスモデルは、C10K問題(クライアント1万台問題)と呼ばれるサーバへのクライアントアクセス数に起因する問題がある。C10K問題とは、ハードウェアの性能上は問題がなくても、あまりにもクライアントの数が多くなるとサーバがパンクする問題のことである。
Nginx
イベント駆動モデル:1プロセス内で接続ごとにイベント処理を行う。1プロセス1CPUなのでCPUの数だけワーカープロセスが作成できる。
・利点:接続数が増えてもプロセス数やスレッド数が増えない。メモリを削減できる。
・欠点:1つのメモリ空間で動作するためスクリプト言語を組み込めないことがある。
I/Oの多重化について
1プロセスでどのように多数のクライアントからのアクセスをさばいているのか。
Webサーバのように同時に複数の処理を行うには、ディスクやネットワークといったI/Oの多重化が必要になる。
I/O多重化の実装には「select」や「poll」といったシステムコールが従来使われている。
同期IOを使用した場合、1台のクライアントがらのアクセスだけでプロセスが専有されてしまうため、複数のクライアントへのレスポンスを返すことができない。
これを回避するために以下の方法がある。 ・マルチプロセス(Apache) ・マルチスレッド(Apache) ・非同期I/O ・I/Oの多重化(Apache, Niginx)
システムコール「select, poll, epoll」について
プログラムで複数のファイルディスクリプタを監視し、一つ以上のファイルディスクリプタがある種のI/O操作の「ready(準備ができた状態)」になるまで待つことができる。
select, pollの場合
プロセスがselectを発行する際に、ファイルディスクリプタセットと呼ばれる複数のファイルディスクリプタをまとめたリストをカーネルに渡す。
カーネルはリストを読み込み、それぞれのファイルディスクリプタの状態を確認しリストを更新する(リストに含まれるディスクリプタの数だけループする)。その後、処理が終わった後カーネルがリストを返却し、状態がreadyになったファイルディスクリプタの処理をプロセスが進める。
この処理だとファイルディスクリプタの数だけループが発生するため処理に時間がかかる。
epollの場合
epollでは指定のファイルディスクリプタの状態をカーネルに問い合わせるだけ。そのため高速な処理が可能。