Nginx プロセス スケジューリングの問題の詳細な説明

Nginx プロセス スケジューリングの問題の詳細な説明

Nginx は、マスター プロセス (MasterProcess) と、同じ数のホスト CPU コアを持つワーカー プロセスが連携してさまざまなイベントを処理する、固定数のマルチプロセス モデルを使用します。

Nginx は、マスター プロセス (MasterProcess) と、同じ数のホスト CPU コアを持つワーカー プロセスが連携してさまざまなイベントを処理する、固定数のマルチプロセス モデルを使用します。

メイン管理プロセスは、構成の読み込み、作業プロセスの開始と停止を担当し、作業プロセスは特定の要求の処理を担当します。プロセス間のリソースは独立しています。各ワーカー プロセスは複数の接続を処理します。各接続はワーカー プロセスによって完全に処理されます。プロセスを切り替える必要がなく、プロセス切り替えによるリソース消費の問題も発生しません。デフォルト構成では、ワーカー プロセスの数はホスト上の CPU コアの数と同じです。CPU とプロセス間のアフィニティを最大限に活用してワーカー プロセスを CPU にバインドすることで、マルチコア CPU の処理能力が最大限に引き出されます。

Nginx のメイン プロセスは、外部制御信号を監視し、チャネル メカニズムを通じて関連する信号操作をワーカー プロセスに渡す役割を担います。複数のワーカー プロセスは、共有メモリを通じてデータと情報を共有します。

ヒント: プロセス アフィニティにより、プロセスまたはスレッドを指定された CPU (コア) 上で実行できるようになります。

Nginx の作業プロセスには、次のスケジューリング方法があります。

  • スケジュールなしモード: 接続イベントがトリガーされると、すべてのワーカー プロセスがクライアントとの接続を確立するために競合し、接続が正常に確立されるとクライアント要求の処理を開始します。非スケジュールモードでは、すべてのプロセスがリソースを競い合いますが、最終的にクライアントとの接続を確立できるのは 1 つのプロセスだけです。これにより、システムのリソースが瞬時に大量に消費され、いわゆる「群れ現象」が発生します。
  • ミューテックス ロック モード: 各ワーカー プロセスは、定期的にミューテックス ロックを競います。ワーカー プロセスがミューテックス ロックを取得すると、HTTP 接続確立イベントを受信する権限が与えられ、現在のプロセスのソケット監視がイベント エンジン (epoll など) に挿入され、外部接続イベントを受信します。他のワーカー プロセスは、確立された接続の読み取りおよび書き込みイベントの処理を継続し、定期的にポーリングしてミューテックスの状態を確認することしかできません。ミューテックスが解放された後にのみ、ワーカー プロセスはミューテックスを捕捉し、HTTP 接続確立イベントを処理する権限を取得できます。作業プロセスの最大接続数の 1/8 とプロセスの利用可能な接続数 (free_connection) の差が 1 以上の場合、このラウンドでミューテックス ロックを競う機会は放棄され、新しい接続要求は受け入れられません。確立された接続の読み取りおよび書き込みイベントのみが処理されます。相互排他ロック モードは、集団スラッシング現象を効果的に回避します。多数の短い HTTP 接続の場合、このメカニズムにより、イベント処理権限をめぐって競合するワーカー プロセスによって発生するリソース消費を効果的に回避できます。ただし、長時間接続が有効になっている HTTP 接続が多数ある場合、ミューテックス モードにより少数のワーカー プロセスに負荷が集中し、ワーカー プロセスにかかる負荷が不均一になるため QPS が低下します。
  • ソケット シャーディング: ソケット シャーディングはカーネルによって提供される割り当てメカニズムであり、各ワーカー プロセスが同一のリスニング ソケット セットを持つことができるようになります。外部からの接続要求がある場合、カーネルはどのワーカー プロセスのソケット リスナーが接続を受信できるかを決定します。これにより、群集現象が効果的に回避され、ミューテックス ロック メカニズムと比較してマルチコア システムのパフォーマンスが向上します。この機能を使用するには、listen ディレクティブを構成するときに、reuseport パラメータを有効にする必要があります。

ヒント: Nginx バージョン 1.11.3 以降では、ミューテックス モードはデフォルトで無効になっています。 Linux カーネルがプロセス スケジューリング メカニズムを提供するため、ソケット シャーディング モードは最高のパフォーマンスを発揮します。

Nginx プロセス スケジューリングに関するこの記事はこれで終わりです。Nginx プロセス スケジューリングの詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Nginx プロセス管理とリロードの原則の詳細な説明
  • Pythonはnginxのポートとプロセスの状態を監視します
  • Nginx で使われる 2 つのプロセス管理方法と php-fpm の最適化
  • Nginx サーバーのプロセス数を設定し、マルチコア CPU を使用する方法
  • Nginx プロセスを再起動または終了した後に nginx.pid が失われる問題の解決方法
  • nginxプロセスを監視するPythonスクリプトを書いた

<<:  SQL IDENTITY_INSERT ケーススタディ

>>:  Iframe の使用を減らすべきいくつかの理由の分析

推薦する

jQueryは広告の表示と非表示のアニメーションを実装します

数秒後に広告が表示されて消えることがよくあります。この機能を実装するには、JQuery フレームワー...

Linux システムの busybox に mkfs.vfat コマンドを移植する

オーディオおよびビデオ ファイルを保存するためのディスク寿命を延ばすには、ディスクをフォーマットする...

Alibaba Cloudのセキュリティルール設定の詳細な説明

2日前、ダブル11ショッピングフェスティバルを利用して、Alibaba CloudでECS(サーバー...

JavaScript による省・市連携効果の実現

この記事では、省と都市間の連携効果を実現するためのJavaScriptの具体的なコードを参考までに共...

珍しいけれど役に立つJSテクニックをいくつか紹介します

序文プログラミング言語には通常、さまざまな隠されたトリックが含まれており、これらのトリックを上手に使...

意外と知らないJSのループ速度テストのいろいろを徹底解説

目次序文1. forループ2. whileループとdo-whileループ3. forEach、map...

Vue+Bootstrapでシンプルな学生管理システムを実現

参考までに、vueとbootstrapを使って比較的シンプルな生徒管理システムを作りました。具体的な...

TypeScript とは何ですか?

目次1. JavaScriptの問題2. TypeScriptの利点3. TypeScriptの欠点...

Vue 大画面データ表示例

効率的に要件を満たし、コンポーネント ライブラリの肥大化や車輪の再発明を避けるために、私は以前、大画...

Vue におけるキープアライブ マルチレベル ルーティング キャッシュの問題

目次1. 問題の説明2. 原因分析3. 解決策4. 処理1. 問題の説明調整センターでは、最後の 2...

MySQLインデックスの基礎となるデータ構造の詳細

目次1. インデックスの種類1. B+ツリー2. MyISAM と InnoDB の B+ ツリー ...

HTML での Li タグの使用例

タイトルを左に、日付を右に揃えたいのですが、日付の範囲に float:right を直接追加すると、...

JavaScript は 9 グリッドのクリックによる色の変更効果を実装します

この記事では、9グリッドクリックの色変更効果を実現するためのJavaScriptの具体的なコードを参...

Docker+jenkins+python3環境を使用して非常に詳細なチュートリアルを構築する

序文:自動化を記述した後、毎日サーバー上で実行する必要があります。このような問題に遭遇しました。Je...

CSS3 で作成した本のページめくり効果

結果:実装コード: html <!-- よろしければハートを付けてください! --> &...