主な理由は、Nginx が最新の epoll (Linux 2.6 カーネル) および kqueue (freebsd) ネットワーク I/O モデルを使用しているためです。
epoll は IO を多重化する方法 (I/O Multiplexing) ですが、Linux2.6 以降のカーネルでのみ使用されます。この問題について説明する前に、その理由を説明しましょう。 IO は必須です。
人生の例で説明しましょう。
あなたは大学で勉強していて、友人が訪ねてくるのを待たなければならず、その友人はあなたが「いいえ」であることしか知らないとします。建物 A ですが、具体的にどこに住んでいるのかわからないので、建物 A の玄関で会う約束をしました。
ブロッキング IO モデルを使用してこの問題に対処すると、ずっと A 棟で待つことしかできない 1 号棟の入り口で友達の到着を待つ この間、他のことは何もできない この方法の効率が低いことはわかります.
現在、時代は変わり、多重化が使用され始めています。この問題に対処するために IO モデルが使用されています。あなたは友人にビル A に来るように言い、ビルの管理者にその方法を教えてもらいます。ここのビルディング マネージャーは、多重化された IO の役割を果たします。
select モデルと epoll モデルの違いについてさらに説明します。
Aunt の select バージョンは次のことを行います。クラスメート A の友達が来ました。叔母の選択バージョンは愚かです。彼女は友達を部屋から部屋へ連れて行き、誰が誰であるかを確認します。クラスメート A です。待っていた友達が到着しました。実際のコードでは、選択バージョンおばさんのバージョンは次のことを行います:
epoll では、主要なデータ構造 epoll_event は次のように定義されます。
これらの効率の向上を過小評価しないでください。大規模な同時実行サーバーでは、IO のポーリングは最も時間のかかる操作の 1 つです。例に戻ります。友人のビル管理者全員が望んでいるのであれば、ビル全体のクラスメートにクエリを実行するため、必然的に処理効率が低くなります。すぐにフロアには多くの人が集まります。
初期のブロッキング IO 処理モデルを比較すると、その後は次のことがわかります。多重化された IO を使用すると、プログラムは IO 操作以外の独自の作業を自由に実行できます。IO ステータスが変化した場合にのみ、多重化された IO が通知し、対応する操作を実行します。ブロックして IO ステータスの変化を待つ必要はありません。
上記の分析から、select に対する epoll の改善は、実際には空間を時間に交換するというアイデアの具体的な応用であることもわかります。
Nginx 関連の技術記事の詳細については、Nginx チュートリアル 列にアクセスして学習してください。
以上がなぜnginxはそんなに速いのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。