2022/05/31
NginxとApache
参考
C10K問題とは
ハードウェアの性能上は問題がなくても,あまりにもクライアントの数が多くなるとサーバーがパンクする問題のこと。プロセスやスレッドが多くなることが原因となる。
プロセスやスレッドが多くなると
- プロセスの上限に達する
- ファイルディスクリプタ(ファイルを識別するための目印)数の上限に達する
- コンテキストスイッチにオーバーヘッドが発生し,負荷が大きくなる
- コンテキストスイッチ
- CPUのコンテキストがプロセスに紐づいており,このコンテキストにそのプロセスで最後に実行した状態が記憶されており,プロセスの切り替えごとにそのプロセスに紐づくコンテキストが読み込まれる
- https://milestone-of-se.nesuke.com/sv-basic/architecture/cpu/
- コンテキストスイッチ
Apache
preforkモデル
- 1プロセスあたり1スレッド
- プロセス数の上限に達しやすくなる
workerモデル
- 1プロセスあたり複数スレッド
- ファイルディスクリプタの上限(1プロセスあたり1024)に達しやすくなる
Nginx
概要
1プロセス1スレッドで複数のアクセスを捌ける。
特徴
- ノンブロッキングI/O
- イベント駆動
- クライアントのアクセスをイベントとして扱い,それをきっかけにプロセス内で処理を開始する
ノンブロッキングI/Oとは
参考
ブロッキングI/O・同期I/O
KernelのI/O処理中,プロセスは待ち状態となり,プログラムの処理が止まる。
ノンブロッキングI/O
KernelのI/O処理中,プロセスは待ち状態とはならず,他の処理を行うことができ,Kernelの処理中はエラーが返される。
非同期I/O
KernelのI/O処理中,プロセスは待ち状態とはならず,他の処理を行うことができ,I/O処理が終了すれば,完了通知が来る。
ApacheとNginxの比較
Apache
- configの文法的に静的配信に向いている
Nginx
- リバースプロキシとして動的配信を行えるように設定されている
- ただのPort転送ならApacheに比べて簡素な設定で終わる