nginx(エンジンエックスと読みます)
Nginxの由来
C10K問題
nginxはApacheでC10K問題が起こったことにより開発され始めました。
C10K問題とは、簡単にいうとクライアントが多すぎてサーバーがパンクすることです。
サーバーにクライアントが接続すると、worker/thread
が発生します。worker/thread
とはクライアントが仕事が来たら働くが、来ない場合は待機するというものです。
worker
はメモリをある量だけ確保します。これによって一定数以上のクライアントが接続するとサーバーが食い尽くされます。
この現象が起きるのがだいたいClientが10Kilo個の時におこるという意味でC10K問題と言います。
実際は他にも原因があるようですが、細かいところまではわかりませんでした。
わかる方は
http://www.aosabook.org/en/nginx.html
を読んでいただくとわかると思います。
C10K問題の解消
上記の問題を解消するためにNginxが作られました。
どうやって解決したのでしょう?
nginxではイベント駆動モデルというのを採用しています。
イベント駆動型モデルでは、クライアントの接続を1プロセスとして扱い、それをきっかけに処理が行われます。
また1プロセス1スレッドとなるため、クライアントの数が増えてもプロセス数は増えないためC10K問題が起こるのを防ぎます。
I/Oの多重化
1プロセスで多数のクライアントの接続を処理するためには
- マルチプロセス(Apache)
- マルチスレッド(Apahce)
- 非同期I/O
- I/Oの多重化(Apache、Nginx)
があります。
nginxではI/Oの多重化という方式を使っています。
I/Oの多重化の実現にはシステムコール「select, poll, epoll」を使っています、
詳しくは
https://blog.shibayu36.org/entry/20120101/1325418188
を読んでください。
結局細かいことまですっきりとはわかりませんでしたが、これらを使ってI/O多重化を実現し1プロセスで多数のクライアント接続に対処しているそうです。
参考文献
https://qiita.com/ayana_shi/items/d529ee7d4fcac0f8b046
https://blog.framinal.life/entry/2015/09/13/195121
これが一番わかりやすくてまとまっている
http://www2.matsue-ct.ac.jp/home/kanayama/text/nginx/all.html