ホームページ > バックエンド開発 > PHPチュートリアル > nginx イベント駆動型モデルへの参入

nginx イベント駆動型モデルへの参入

WBOY
リリース: 2016-07-29 09:06:54
オリジナル
1134 人が閲覧しました

最近、私はアリ・タオ・ホイ先輩が書いた「nginxの徹底理解」でnginxのイベントモジュールを読んでいました。私がこのコンテンツを読みたい理由は、nginx が巨大な同時接続を処理できること、そしてその背後にあるイベント ドライバーがどのように構築されているかを見たいからです

nginx について話すために大量のコードを投稿したくないからです。このブログ記事はイベント駆動型であり、私はそこまで完全には理解していないかもしれませんし、読者がすぐに知識を理解するのはさらに難しいでしょう。そのため、将来のサーバー プログラムの開発に役立つと思われるいくつかのことを簡単に要約します。知識ポイント

nginx の epoll モデルについて簡単に説明します

この記事では、epoll を例としてのみ取り上げます

nginx は、接続イベントが相対的なものであるため、通常のサーバー設計では新しい接続イベントを処理するために epoll をイベント ドライブの基礎として使用します。機密性が高い (高速応答に対する高い要件) ため、接続を特別に処理するための別のスレッド (プロセス) を開き、接続を取得し、それを各 I/O 多重化スレッドに配布します。ただし、nginx は接続イベントを処理し、他のイベントも処理します。同じ I/O 多重化の下で、接続イベントの応答要件はどのように確保されるのでしょうか? Niginx は取得したイベントに対してコールバックを呼び出しませんが、2 つのポスト キューに入れます。最初のキューは接続イベントを保存するために使用され、2 番目のキューは通常の読み取りおよび書き込みイベントを保存するために使用されます。 ngx_posted_accept_events のイベントが実行中に最初に処理されるようにすることで、応答速度に対する接続の感度を確保できます

(2)クロストークを防ぐ方法

クロストーク問題はサーバープログラムで対応すべき問題と言えます。クロストークの問題は、ソケットが閉じられたばかりで、新しい接続が入ってきたことを意味します。新しい接続は、たまたま閉じられたばかりのソケットにシステムによって割り当てられます。その後、ソケットにまだ未処理のイベントが残っている場合、そして、対応するソケットにデータを送信します。このソケットは、新しく作成されたユーザーに送信される可能性があります。では、nginx はこの問題をどのように解決するのでしょうか?これは非常に簡単です。nginx が新しい接続を取得するたびに、この接続のインスタンスと前の接続のインスタンスが異なるように接続内のフラグを反転します。また、各イベントには接続が含まれるため、イベントが処理されるたびに反転されます。イベント内のインスタンスが同じかどうかを比較するだけでOKです

(3) 「雷鳴の群れ問題」にどう対処するか

いわゆるサンダーリング ハード問題とは、複数のプロセスが同時に同じポートをリッスンしていることを意味します。接続が確立されると、システムは複数のプロセスを起動しますが、当然のことながら、新しい接続を処理できるのは 1 つのプロセスだけなので、他のプロセスが処理します。本来は覚醒する必要があるが、覚醒してしまうのが、有名な雷鳴の群れの問題です。 nginx が解決する方法も非常に簡単です。サンダーリング グループの問題を回避するために、同時に 1 つのプロセスだけがポートでリッスンしていることを確認するだけです。しかし、問題の鍵は、同時に 1 つのプロセスだけがポートをリッスンするようにする方法です。 nginx はロックを試行する方法を採用し、ロックの戻り値に基づいてプロセスが新しい接続イベントを処理するかどうかを決定することで、「雷の群れ問題」を解決します
(4)負荷分散の解決方法
以前に書いた小さなネットワーク ライブラリでは、メイン スレッドを使用して新しい接続を受け入れ、新しい接続を各子スレッドに順番に分散させ、nginx がプロセス間の負荷分散の問題を解決しました。バランスのとれた分散はありませんが、各プロセスが処理する接続数が処理する最大接続数の 7/8 を超えると、今度は接続は処理されませんが、処理する接続数は -1 になります。 . これは、他のスレッドに機会を与えることと同等であり、これにより負荷分散が実現されます

概要

最初に nginx ドライバー モジュールについて書きます。自分自身を勉強するためにこのブログを書いているだけです

').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i

').text(i)); }; $numbering.fadeIn(1700); }); });

以上、内容の側面も含めてnginxのイベント駆動モデルについて紹介しましたが、PHPチュートリアルに興味のある友人の参考になれば幸いです。
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート