簡単に言うと、これは非同期、ノンブロッキングで、epoll と多くの基盤となるコードの最適化を使用します。
もう少し詳しく言うと、nginxの特殊なプロセスモデルとイベントモデルの設計です。
ビデオ コースの推奨事項 →: 「数千万のデータに対する同時実行ソリューション (理論と実践)」
プロセス モデル
nginx はマスター プロセスと複数のワーカー プロセスを採用しています。
マスター プロセスは主にリクエストの収集と配布を担当します。リクエストが届くと、マスターはワーカー プロセスを開始してリクエストを処理します。
マスター プロセスは、高い信頼性を確保するためにワーカーのステータスを監視する役割もあります。
ワーカー プロセスは、通常、CPU コアの数に一致するように設定されます。 nginx のワーカー プロセスは Apache とは異なります。 Apche プロセスは同時に 1 つのリクエストしか処理できないため、多くのプロセス (数百、場合によっては数千) が開かれることになります。 nginx のワーカー プロセスが同時に処理できるリクエストの数はメモリによってのみ制限されるため、複数のリクエストを処理できます。
イベント モデル
nginx は非同期でノンブロッキングです。
リクエストが受信されるたびに、それを処理するワーカー プロセスが存在します。しかし、それがプロセス全体ではありません。リクエストを上流 (バックエンド) サーバーに転送し、リクエストが返されるのを待つなど、ブロックが発生する可能性があるプロセス。そうすれば、処理作業者は愚かに待つことはなく、リクエストを送信した後、「上流が戻ったら教えてください。続行します」というイベントを登録します。それで彼は休みました。この時点で、別のリクエストが来た場合は、この方法ですぐに対応できます。上流サーバーが戻ると、このイベントがトリガーされ、ワーカーが引き継ぎ、リクエストはダウンし続けます。
Web サーバーの動作特性により、各リクエストの処理時間のほとんどがネットワーク送信に費やされることが決まり、実際、サーバー マシンに費やされる時間はそれほど多くありません。これが、わずか数プロセスで高い同時実行性を解決する秘訣です。
IO 多重化モデル epoll
epoll()、カーネルはリンク リストを維持し、epoll_wait はリンク リストが空かどうかを直接チェックして、ファイル記述子の準備ができているかどうかを確認します。 。カーネルは、各 sockfd 上のデバイス ドライバーで確立されたコールバック関数に基づいて epoll を実装します。その後、sockfd 上のイベントが発生すると、対応するコールバック関数が呼び出されて、この sockfd がリンク リストに追加されますが、他の「アイドル」状態は追加されません。
select()、カーネルは回転トレーニング メソッドを使用して fd の準備ができているかどうかを確認します。sockfd は配列のようなデータ構造 fd_set に保存され、キーは fd、値は 0 または 1 です。 。
poll()
[概要]: select と比較した epoll の最大の利点は、sockfd の数が増加しても効率が低下しないことです。
Nginx 関連の技術記事の詳細については、Nginx の使用法チュートリアル 列にアクセスして学習してください。
以上がnginx が高い同時実行性を実現する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。