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 の使用を減らすべきいくつかの理由の分析

推薦する

Windows Server 2016 AD サーバーをセットアップする手順 (画像とテキスト)

導入: AD は Active Directory の略称で、中国語では Active Direct...

フロントエンド JavaScript におけるリフレクションとプロキシ

目次1. 反射とは何ですか? 2. JavaScriptで反映する2.1 Reflect.get(タ...

MySQL 5.7.23 バージョンのインストールチュートリアルと設定方法

MySQL を自分でインストールするのに 3 時間かかりました。チュートリアルはたくさんあるにもかか...

div の特定の実装は自動的に折り返されず、HTML で折り返されないよう強制されます。

1. 改行なしを実現するには<nobr>タグを使用するコードをコピーコードは次のとおりで...

Docker Composeでコンテナ管理の問題を解決する

Docker の設計では、コンテナは 1 つのアプリケーションのみを実行します。しかし、現在のアプリ...

Linux での SSH パスワードフリーログイン設定の詳細な説明

Linux サーバー A と B が 2 台あり、一方のサーバーから SSH 経由でパスワードなしで...

Dockerカスタムブリッジdocker0とdockerのコマンド操作の開始、終了、再起動

質問会社がサーバーを移行した後、デフォルトで作成された docker0 ブリッジが会社の外部ネットワ...

Facebook によるインターネット サービスのほぼ完璧な再設計

<br />出典: http://www.a-xuan.cn/?p=197 先ほどFac...

HTMLは正規表現を使用してテーブルの例をテストします

以下は、HTML で正規表現を使用してテーブルをチェックするサンプル コードです。具体的なコードの内...

div間のギャップの解決策

HTMLのdivブロックを使用していて、ブロックの中央をしっかりと接続できず、解決できない場合1. ...

CSSは親コンテナのdivをimg画像で埋め、コンテナのサイズに適応します。

ページに複数の画像を導入すると、画像のサイズがばらつくことがあります。しかし、それらを一貫したサイズ...

MySQL数千万の大規模データに対する30のSQLクエリ最適化テクニックの詳細な説明

1. クエリを最適化するには、テーブル全体のスキャンを避けてください。まず、where と orde...

実用的なクイックスタートReactルーティング開発

インストールインストールするには、次のコマンドを入力します。 // ネプ npm で react-r...

モバイルデバイスでインラインスクロールを実装するための4つのソリューションの詳細な説明

ニーズの発見領域の一部のみスクロールでき、残りの部分は移動できない場合、どのような方法を使用しますか...