ホームページ  >  記事  >  運用・保守  >  なぜnginxはそんなに速いのでしょうか?

なぜnginxはそんなに速いのでしょうか?

步履不停
步履不停オリジナル
2019-06-20 17:52:123870ブラウズ

なぜnginxはそんなに速いのでしょうか?

主な理由は、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 です。待っていた友達が到着しました。実際のコードでは、選択バージョンおばさんのバージョンは次のことを行います:


##int n = select(&readset,NULL,NULL,100);

for (int= 0 ; n > 0; i) {

if (FD_ISSET(fdarray) [i], &readset)){
do_something( fdarray[i]);
--n;
}
}

##epoll バージョンのおばさんはさらに高度です。おばさんはクラスメート A の部屋番号などの情報を書き留めておき、クラスメート A の友人が到着したときに、その友人にどの部屋かを伝えるだけで済みます。クラスメート A がいる部屋で、誰かを見つけるために人でいっぱいの建物を歩き回る必要はありません。そこで、叔母の epoll バージョンは次のコードで表すことができます:



##Actipro CodeHighlighter (フリーウェア) によって生成されたコード ハイライト表示 ##http://www.CodeHighlighter.com/

n

=
epoll_wait(epfd,events,20,500);
for
(i
=0;i#<n; i){do_something(events[n]) ;}


epoll では、主要なデータ構造 epoll_event は次のように定義されます。


typedef Union epoll_data {
void * ptr;
int fd;__uint32_t u32;
__uint64_t u64;
} epoll_data_t;


struct epoll_event {__uint32_t イベント;
/* Epoll イベント */epoll_data_t データ;
/* ユーザー データ変数 */};
ご覧のとおり、 epoll_data は共用体構造であり、epoll バージョンの叔母がクラスメート情報を保存するために使用する構造です。fd、ポインタなど、さまざまな種類の情報を保存できます。この構造を使用すると、epoll 叔母は手間をかけずに情報を見つけることができます。クラスメート A.


これらの効率の向上を過小評価しないでください。大規模な同時実行サーバーでは、IO のポーリングは最も時間のかかる操作の 1 つです。例に戻ります。友人のビル管理者全員が望んでいるのであれば、ビル全体のクラスメートにクエリを実行するため、必然的に処理効率が低くなります。すぐにフロアには多くの人が集まります。

初期のブロッキング IO 処理モデルを比較すると、その後は次のことがわかります。多重化された IO を使用すると、プログラムは IO 操作以外の独自の作業を自由に実行できます。IO ステータスが変化した場合にのみ、多重化された IO が通知し、対応する操作を実行します。ブロックして IO ステータスの変化を待つ必要はありません。

上記の分析から、select に対する epoll の改善は、実際には空間を時間に交換するというアイデアの具体的な応用であることもわかります。

Nginx 関連の技術記事の詳細については、Nginx チュートリアル 列にアクセスして学習してください。

以上がなぜnginxはそんなに速いのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。