Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxサーバネットワーク開発モデル

Linuxサーバネットワーク開発モデル

  

NginxがApacheよりもはるかに優れているのはなぜですか?

これは主にNginxが最新のepoll(Linux 2.6カーネル)およびkqueue(FreeBSD)ネットワークI /Oを使用しているためです。一方、Apacheは伝統的なselectモデルを使用します。私はブログで例を見ました:あなたが大学で勉強していて、友人が訪れるのを待っているとしましょう、そしてこの友人はあなたがビルAにいるのを知っています、しかし私はあなたが住んでいる場所を知らないので、あなたは約束をします。私がビルAの入り口で会いました。この問題に対処するためにブロッキングIOモデルを使用する場合、あなたはビルAのゲートに友人が到着するのを待つことしかできません。この間、他には何もできません。この方法の効率が低いことを知るのは難しいですが、時代が変わった今、私はこの問題に対処するために多重IOモデルを使い始めましたあなたは友人にビルの叔母を見つけるためにビルAに来るように言いました。行き方:ここにある建物の叔母は、多重IOの役割を果たしています。

セレクトモデルとepollモデルの動作モードを説明します。セレクトバージョンのおばさんバージョンは次のことを行います。たとえば、クラスAの友人がやってきて、セレクトバージョンのおばさんがばかげている。 A、あなたは友達を待っています。ビル管理部門の友達に来た友達全員が、ビル全体のクラスメートについて質問しなければならない場合、必然的に治療の効率が低下します、すぐに、ビルの一番下にかなり多くの人々がいるでしょう。叔母のEpollバージョンはより進んでいます、そして、彼女は彼の部屋番号のようなクラスメートAの情報を書き留めました、それからクラスAの友人が来るとき、ただAをクラスメートした友人に言ってください建物内の誰かを探しています。エポール叔母は吹く力なしでクラスメートAを見つけることができます。一目で、私はepollとselectモデルの違いを理解しています。

Linuxカーネルでは、selectで使用されるFD_SETは制限されています。つまり、カーネルのソースコード/usr /include /linux /posix_typesには、各FD_SETのハンドル数を定義するパラメータ__FD_SETSIZEがあります。 .h #undef __FD_SETSIZE#define __FD_SETSIZE 1024同時に1025個のハンドルの読み取り可能または書き込み可能状態を検出したい場合は、selectは不可能です。カーネルにselectを実装するには、ポーリング方式を使用します(つまり、各チェックはすべてのFD_SET内のハンドルを通過します)。

epollはIO(I /O Multiplexing)を多重化する方法です。linux2.6以上でのみ有効です。 epollモデルは最大FD制限をサポートしており、これはオープンファイルの最大数で、一般的には2048をはるかに超えています。たとえば、メモリが1GBのマシンでは約100,000です。詳細については、cat /proc /sys /を参照してください。 Fs /file-max、この数はシステムメモリと関係があります。従来のselect /pollのもう一つの致命的な弱点は、あなたが大きなソケットコレクションを持っているとき、しかしネットワーク待ち時間のために、いつでもソケットの一部だけが "active"であるがすべてのコレクションをスキャンすると、効率が直線的に低下します。しかしepollはこの問題を抱えておらず、それは「アクティブな」ソケット上でのみ動作します - これはカーネル実装ではepollが各fdのコールバック関数に従って実装されているからです。そして、「アクティブ」ソケットのみがアクティブにコールバック関数を呼び出し、他のアイドル状態のソケットはコールバック関数を呼び出さない。この時点では、epollは「疑似」AIOを実装している。カーネル高速LAN環境のように、すべてのソケットが基本的にアクティブであれば、epollはselect /pollよりも効率的ではありませんが、epoll_ctlを使いすぎると、効率はわずかに低くなります。 。しかし、WAN環境をシミュレートするためにアイドル接続を使用すると、epollはselect /pollよりはるかに効率的になります。

Epollには2つの動作モードがあります。エッジトリガ(ET)、レベルトリガ(LT)LT(レベルトリガ)はデフォルトの動作モードで、ブロックソケットと非ブロックソケットの両方をサポートします。ファイルディスクリプタの準備ができているかどうかをカーネルが教えてくれるので、この準備ができたfdに対してIO操作を実行できます。何もしなければ、カーネルが通知し続けるので、このモードはプログラムされる可能性が低いです。伝統的な選択/投票はこのモデルの代表です。 ET(エッジトリガ)は、ブロックなしのソケットのみをサポートする高速動作モードです。このモードでは、ディスクリプタの準備ができたことが一度もなかったときには、カーネルがepollによって通知します。それから、ファイルディスクリプタの準備ができていることを知っていると仮定し、ファイルディスクリプタの準備ができなくなるまで、そのファイルディスクリプタの準備完了通知を送信しません(たとえば、 EWOULDBLOCKエラーは、要求を送信、受信、または受信したとき、あるいは一定量未満のデータを送信および受信したときに発生します。

Copyright © Windowsの知識 All Rights Reserved