nginxの研究ノート(c)のI / Oモデルコメントの-Nginx

A、Webリクエストの処理

以上の1.1の処理方法

マルチプロセスモード: 各サーバは、サーバを持っているために、クライアントの要求を受け取ります プライマリプロセス生成します子プロセスクライアントに応答し、ユーザが接続閉じるまで
速い処理速度、各他の子プロセスとは独立して:長所
短所:あまりにも多くのアクセスがサーバリソースの枯渇がもはや要求された提供することはできません引き起こす可能性がありますが

以上1.2スレッド

複数のスレッド: :マルチプロセスモードでは似ていますが、それぞれがクライアント要求を受信します サービスプロセス派生Aスレッド是非、クライアント側との対話。
長所:はるかに少ないプロセスのスレッドよりもコストので、システムリソースに必要なWebサーバを削減
短所:ので、作業中に同じプロセス内で複数のスレッドが、彼らは、お互いに同じメモリアドレス空間にアクセスできる
スレッドがお互いに影響を与えます
メインプロセスは、すべての子スレッドが動作していないハングアップしたら、あなたが安定するまでに時間遅れを再起動する必要があり、サーバーがマルチスレッドモードを使用していますIIS。

1.3非同期

非同期:nginxのののepoll、イベントのアパッチなど

第二に、同期、非同期、非ブロックとnginxのをブロックI / Oモデル

2.1同期および非同期(カーネルと対話するアプリケーション)

  • 同期: カーネルはデータを返しません場合は、プロセスデータを発行した後、カーネルは次のリクエストに続行する前に応答を返すようにした後、プロセスは、永遠になるまで、そうでクラッシュエラーとなっています。
  • 非同期:次の要求は、コールバック関数により、カーネルの処理手順を、データを発行するカーネルが応答を返す至るまで、処理の処理後。nginxのは非同期です。
  • 同期および非同期メッセージ通信機構が関係していますすべての要求は、サーバー側の同期を取得し、同期機構は、要求処理ステップの送信者と受信者が同じであり、非同期のメカニズムでは、送信者からのすべての要求は、待ち行列を形成する、受信処理完了通知後送信者。
  • 人気例えば:あなたは、何も「アラビアン・ナイト」この本はありません本屋を尋ねるために呼び出すことが同期通信メカニズムであるならば、「私は、チェックしましょう」とし、ああチェックするために始めた、書店の所有者は言うでしょう、あなたは、待ってチェック、チェックや他の良い(おそらく5秒は、それが一日でした)あなたの結果(戻り結果を)伝えます。非同期通信メカニズム(結果を返しません)良いハングアップするために、直接、あなたの小切手を呼び出し、そして、私はああチェックすることを伝えるために、本屋の所有者。そして、まあを確認し、彼はあなたを呼び出すためのイニシアチブをとるだろう。ここでは、この方法では、「コールバック」を通じてボスコールバック。

2.2ブロッキングと非ブロッキング(IOデバイスとカーネルの相互作用)

対話カーネルとIOデバイスとして理解することができ、カーネルは一つのことを行う必要があるとして、カーネルプロセス要求が時間を扱うIOデータを受信したときに、簡単に理解することができ、すぐに返されない場合は、直ちに、応答を返すことができない、待つ必要がそれは、そうでない場合は、非ブロッキングとして理解することができ、ブロックされています。

  • ブロッキング:IOコールがすぐに結果を返すことができない、IO要求をすぐに満たすことができないときに開始されたプロセスを、プロセスが応答カーネルまで待機します、カーネルは、カーネル空間にIOデバイスからデータをコピーして、ブロックされているプロセスに返さなければなりません。
  • ノンブロッキング:IOプロセスによって開始され、プロセスが世論調査が完了し、IOはすぐに実行次の呼び出しであるかどうかを確認するために、再びすぐにではなく、待っているが、何度も会うことができないときIOコールが、すぐに結果を返すことができます。

2.3 nginxのサポート同時実行モデル

nginxのは、プラットフォームによって異なり複数の同時モデル、特定の同時実行モデルの実装をサポートしています。
同時実行モデルではnginxの自動的に最も効率的なモデルを選択し、さまざまなプラットフォームをサポートしています。しかし、それはまた、明示的に設定ファイル同時実行モデルの使用ディレクティブで定義されてもよいです。

  • 選択する:IO多重化、標準の同時実行モデル。プラットフォームは、より効率的な同時実行モデルに使用されていない場合は、nginxのをコンパイルすると、モジュールが自動的にコンパイルされます選択。オプションのconfigureスクリプト:-with-select_moduleと--without-select_moduleは、強制的に有効または無効にコンパイル選択モジュールに使用することができます。
  • 世論調査:IO多重化、標準の同時実行モデル。nginxのをコンパイルするときにプラットフォームがより効率的な同時実行モデルに使用されていない場合と同様に、、投票モジュールが自動的にコンパイルされます]を選択します。オプションのconfigureスクリプト:-with-poll_moduleと--without-poll_moduleは強制的にポーリングコンパイルされたモジュールを有効または無効にするために使用することができます
  • ファイルディスクリプタ: IO多重化、高い並行性モデルは、コア内およびLinux上で使用することができる2.6+
  • kqueueの; IO多重化、高同時実行モデルは、FreeBSDの4.1以降、OpenBSDの2.9+、NetBSDの2.0、およびMac OS Xプラットフォームで使用することができます
  • / dev /世論調査: 効率的な同時実行モデルは、インターネット+ Solaris 7の11/99 +、HP / UX 11.22+(eventport)、IRIX 6.5.15+、およびTru64 UNIX 5.1Aで使用することができます
  • イベントポート: 効率的な同時実行モデルは、Solaris 10のプラットフォームのために使用することができ、PS:いくつかの既知の問題のためには、お勧めは/ dev /投票を代わりに。

1、なぜファイルディスクリプタ速いですか?

選択Apacheの共通の比較、およびnginxの共通のファイルディスクリプタ

選択する:

オープンFD(ファイルディスクリプタ)のプロセスが同時選択モデルの最大数は相応に制限されていた、デフォルト値は2048分の1024で、FD_SETSIZEセットによって制限されるため、同時の最大数を制限します。

効率、各呼び出しはFDのすべての線形セットをスキャンします選択は、とても効率が減少線形提示されることを、FD_SETSIZE大きな変化の結果は、我々がゆっくりしていることは何ですか?すべての残業。

FDは、ユーザ空間に通知し、問題のカーネル/ユーザ空間のメモリコピーは、どのようにカーネルに伝えるには?この問題に取りに非常に時間がかかる多くの時間でメモリコピー方法、FDを、選択します。

以下のように要約:1、カーネルモード時間がかかることで、ユーザにコピーペアリング遅い、データを見つけるための接続2、3、限られた数の

ファイルディスクリプタ:

ファイルディスクリプタの最大同時接続数の制限なし、上限はファイルの最大数を開くことができるで、この数は一般的には2048年よりもはるかに大きい、この数は、一般的に素晴らしいです、とシステムメモリとの間の関係、特定の番号かもしれ猫を/ proc / sys / fs /ファイルマックスビュー。

効率性の向上、最大の利点は、その実際のネットワーク環境では、ファイルディスクリプタ効率が選択し、世論調査よりもはるかに高くなります、それはちょうどあなたが「アクティブ」な接続のepollが、接続の合計数とは何の関係ということです。

メモリの共有、この点で、「共有メモリ」のファイルディスクリプタの使用は、メモリコピーが省略されています。

たとえば:
あなたはA棟のドアに適合するように約束をした、訪問の友人を待つために、あなたは大学で勉強と仮定し、この友人は、あなたがA棟にある知っているが、具体的にどこに滞在するか分からない。
使用である阻塞IO模型あなたが何かを行うことはできません。この時点で、このアプローチの効率を知るのは簡単です、あなたは唯一の建物の到着のための友人を待っているドアで待っていたことができ、この問題に対処するために低されています。
使用多路复用IO模型するには、この問題に対処。あなたは彼女がどのようにそこにあなたを教えてみましょう、ビル管叔母の床を見つけるためにあなたの友人を教えてください。パイプは多重IOの役割を果たしているおばさんの床。

  • 行うにはおばさんのバージョン以下のものを選択している:例えば、学生Aの友人を、そして愚か版おばさんを選択し、彼女は、1 Aの同級生によって部屋のいずれかを照会している友人を取ったあなたの他の友人、そしてその実際のコードで、次のことを行うバージョンの叔母を選択します。

     int n = select(&readset,NULL,NULL,100);  
      for (int i= 0; n > 0; ++i) {
      if (FD_ISSET(fdarray[i], &readset))
      {
          do_something(fdarray[i]);
          --n;
      } } ```
    
  • おばさんのepollバージョンより高度で、そして彼女は、学生Aの情報を書き留め、例えば、彼の部屋番号、友人が来て、待ち時間の学生、友人、クラスメートが唯一の部屋をすることができる鎧を伝える必要があり、個人的に取る必要はありません。おばさんのバージョンを確認するために建物を満たした人々がepollを次のコードを使用することができませんと言います。

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

nginxののIOモデルがされ、イベント駆動型に基づいてアプリケーションには、迅速、いわゆる非同期IOを達成するために、複数のIOハンドルを切り替える作り、。IO集約型の仕事のためのイベント駆動型のサーバーが最も適しているように、クライアントとサーバのWEB間のデータ転送に役割を果たしているリバースプロキシとして、純粋にIO操作自体は複雑な計算を必要としません。実行するには、明らかに優れ、イベント駆動型でワーカープロセスを実行するリバースプロキシは、どのプロセス、スレッド管理のオーバーヘッド、CPUが存在しない、メモリの消費量が少ないです。

Apacheサーバなどのアプリケーションは、そのような科学技術計算、グラフィックス、画像などの一般的な実行、特定のビジネスアプリケーション、。彼らは、CPU集約型のサービスである可能性が高い、イベント駆動型は適切ではありません。例えば、コンピューティングは、2秒、2秒かかった、完全にブロックされ、どのようなイベント役に立たないだろう。場合、MySQLを何が起こるかを考えてみての変更、イベント駆動型、またはすべてのクライアントをブロックします生活の大規模なソートを結合します。すべての乾物の各プロセスの利点を実証し、ない障害物との干渉を行うにはこの時間、マルチプロセスまたはスレッド。もちろん、現代のCPUより速く、より速く、単一のコンピューティング時間を遮断することは、小さなかもしれませんが、限り障害物、ノーアドバンテージにイベントプログラミングがあるとして。プロセスは、このような技術のスレッドが、そして消えないように、しかし補完やイベントのメカニズム、長い時間。

全体的に、イベント駆動型サービスIO集約型に適した、マルチプロセスまたはスレッドがCPU集約型のサービスに適しており、実際には、それが(特に高い同時実行の下)nginxのフロントエンドプロキシ、または静的ファイルに適しているのですが、Apacheバックエンド・アプリケーション・サーバー、強力な[PHP、書き換え...]、高い安定性のために適しました。

公開された102元の記事 ウォン称賛21 ビュー5309

おすすめ

転載: blog.csdn.net/ranrancc_/article/details/102684755