Open棟梁Project - マイクロソフト系技術情報 Wiki
目次 †
概要 †
「C10K問題」(クライアント1万台問題)とは、ハードウェアの性能上は問題がなくても、
あまりにもクライアントの数が多くなると効率が悪化しサーバがパンクする問題のこと。
- スレッドなどのリソースを大量に消費してしまう。
- 最近は、「C10M問題」(クライアント1,000万台問題)などが出て来ている。
NginxとNode.js †
- Nginx(エンジンエックス)
- Node.js(ノードジェイエス)
Nginx †
Nginxの概要 †
Nginxでは、イベントループというモデルにより、
同時リクエストを多く処理することに特化することで、C10K問題に対応する。
Windowsや.NETでNginxを使う。 †
Node.js †
Node.jsの概要 †
サーバサイド JavaScript のNode.jsはノンブロッキングI/Oというモデルにより、
イベントループを止めてしまうようなブロッキングを回避し、C10K問題に対応する。
WindowsでNode.jsを使う。 †
- Unix系OS向けの非同期I/O環境(epoll/kqueue/event port)を使用する「libev」ライブラリを使用していた。
- Windows向けの非同期I/O環境(IOCP : Input/output completion port)を使用する「libuv」を開発した。
- 現在、libeio / libev に代わって libuvが、Node.js のコアとして置き換わりつつある。
2つの方式 †
イベントループ †
- 方式
シングルスレッドでループ処理を回し、
- キューに溜まったイベントを処理していく方式。
- リクエストを1つのスレッドで受け取ることができる。
- 問題
- イベントループは、昔懐かしい、ノンプリエンプティブOSのように、
どこかでブロッキングが発生すると、イベントループ全体がストップしてしまう。
ノンブロッキングI/O †
- 「イベントループ」の問題を解決するのが「ノンブロッキングI/O」らしい。
- 簡単に、ブロッキングを防止することでイベントループの停止を防止する。
- 仕組みとしては、ざっくり、
- ワーカースレッドプールと I/O 処理がうまく協調して動き、
- スレッドを節約して動作しているクライアントに処理完了後のコールバックを返す。
という、非常に優れた方法であるらしい。
参考 †
C10k †
NginxとNode.js †
Node.js †
Nginx †
Windows, .NET †
- 非同期 I/O - Web/DB プログラミング徹底解説
ノンブロッキングI/O †
Tags: :インフラストラクチャ, :Windows, :プログラミング, :その他、開発の色々, :.NET開発