「エポール」は、Tornadoweb(またはNginx)がとても速いという重要な理由ですか?

StackOverflow https://stackoverflow.com/questions/2583350

  •  24-09-2019
  •  | 
  •  

質問

Tornadowebnginx 現時点では人気のあるWebサーバーであり、多くのベンチマークは、特定の状況下でApacheよりも優れたパフォーマンスを持っていることを示しています。だから私の質問は次のとおりです。

「epoll」は、それらを非常に速くする最も重要な理由ですか?そして、優れたソケットサーバーを書きたい場合、それから何を学ぶことができますか?

役に立ちましたか?

解決

ソケットサーバーの作成を検討している場合、数年前のDan KegelのC10Kの記事は良い出発点です。

http://www.kegel.com/c10k.html

また、ネットワークプログラミングのガイドがかなり便利であることがわかりました。

http://beej.us/guide/bgnet/

最後に、優れた参照が必要な場合は、W。RichardStevens etによるUNIXネットワークプログラミングがあります。 AL。:

http://www.amazon.com/unix-network-programming-sockets-networking/dp/0131411551/ref=dp_ob_title_bk

とにかく、あなたの質問に答えるために、ApacheとNginxの主な違いは、ApacheがI/Oをブロックするとクライアントごとに1つのスレッドを使用しているのに対し、Nginxは非ブロッキングI/Oでシングルスレッドされていることです。 Apacheのワーカープールは、プロセスの開始と不眠症のオーバーヘッドを削減しますが、複数のクライアントにサービスを提供する際に、CPUが複数のスレッド間を切り替えます。一方、Nginxはすべてのリクエストを1つのスレッドで処理します。 1つのリクエストがネットワーク要求(たとえば、バックエンドに)を作成する必要がある場合、nginxはバックエンドリクエストへのコールバックを添付し、別のアクティブなクライアントリクエストで動作します。実際には、これはイベントループに戻ることを意味します(epoll, kqueue, 、 また select)そして、報告するものがあるファイル記述子を求めます。メインイベントループのシステムコールは、実際にはブロッキング操作であることに注意してください。ファイル記述子のいずれかが読み取りまたは書き込みの準備が整うまで何もすることはないためです。

これが、NginxとTornadoが多くの同時クライアントにサービスを提供するのに効率的である主な理由です。1つのプロセス(RAMを節約する)と1つのスレッドのみ(したがって、CPUをコンテキストスイッチから節約します)のみがあります。 ePollに関しては、Selectのより効率的なバージョンにすぎません。 n開いたファイル記述子(ソケット)がある場合、O(n)時間の代わりにO(1)で読む準備ができているものを選択できます。実際、nginxはepollの代わりにselectを使用できます。 --with-select_module オプション、そして私はそれがまだApacheよりも効率的であると確信しています。私はApache Internalsに精通していませんが、クイックGrepはSelectとEpollを使用していることを示しています。おそらく、サーバーが複数のポート/インターフェイスを聴いている場合、または単一のクライアントに同時バックエンド要求を行う場合です。

ちなみに、私はこのようなものを始めようとして、基本的なソケットサーバーを書き込もうとし、nginxがどのように効率的であるかを理解したいと思いました。 NGINXソースコードを熟し、上記にリンクしたガイド/本を読んだ後、自分のサーバーではなくNGINXモジュールを簡単に記述する方が簡単になることがわかりました。したがって、NGINXモジュール開発に関する現在の最終的なラゲンダリーエミラーガイドが生まれました。

http://www.evanmiller.org/nginx-modules-guide.html

(警告:ガイドはNginx 0.5-0.6に対して書かれており、APIが変更された可能性があります。)HTTPで何かをしている場合、愚かなクライアントに対処するすべての毛むくじゃらの詳細を解決したので、Nginxにショットを与えると思います。たとえば、私がFunのために書いた小さなソケットサーバーは、Safariを除くすべてのクライアントとうまく機能しましたが、その理由はわかりませんでした。他のプロトコルであっても、Nginxは正しい方法かもしれません。イベントはプロトコルから非常によく抽象化されているため、IMAPと同様にHTTPをプロキシできる理由です。 Nginxコードベースは非常によく組織化されており、非常によく書かれていますが、1つの例外が言及されています。プロトコルパーサーのハンドロールに関しては、そのリードに従うことはありません。代わりに、パーサージェネレーターを使用します。ここでNginxを使用してパーサージェネレーター(Ragel)を使用することについていくつかのことを書きました。

http://www.evanmiller.org/nginx-modules-guide-advanced.html#parsing

これらはすべて、おそらくあなたが望んでいたよりも多くの情報でしたが、うまくいけば、あなたはそれが便利だと思うでしょう。

他のヒント

はいといいえ。どちらもePollを使用していますが、技術的には、両方ともリクエストを処理するためにイベントループを使用しています。イベントループとは何か、どのように使用されるかについての詳細情報を見つけることができます。 ウィキペディア.

チェックアウト libevent (によって使われた Gevent, 、一般的に竜巻よりも速くて安定しています)または libev 実装用。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top