LoginSignup
43
40

More than 5 years have passed since last update.

NginxがどのようにしてC10K問題に対応しているのか?

Posted at

image.png

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

43
40
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
43
40