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

推薦する

mysql zipファイルのインストールチュートリアル

この記事では、参考までにMySQL zipファイルをインストールする具体的な方法を紹介します。具体的...

MySQL初心者のための基本操作のまとめ

図書館運営クエリ1.SHOW DATABASE; ----すべてのデータベースを照会する2. SHO...

MySQLトリガーの簡単な使用例

この記事では、例を使用して MySQL トリガーの簡単な使用方法を説明します。ご参考までに、詳細は以...

GIFアニメーション効果を模倣した自動ビデオ再生を実現するWeChatアプレットの例

需要背景:ミニプログラムページに GIF ダイナミック画像を挿入しますが、GIF 画像は通常サイズが...

JavaScriptはすべての選択と選択解除の操作を実装します

この記事では、JavaScriptで全選択と全選択解除の操作を実装するための具体的なコードを参考まで...

MySQL 5.7.17 のインストールと設定方法のグラフィック チュートリアル (Windows10)

MySQL 5.7.17 のインストールと設定方法の概要最初のステップは、MySQL公式サイトから...

CentOS8 yum/dnfで国内ソースを設定する方法

CentOS 8 ではソフトウェア パッケージのインストール プログラムが変更され、yum 構成方法...

MySQLデータベースの管理者パスワードを忘れた場合の解決策

1. コマンド mysqld --skip-grant-tables を入力します (前提条件: m...

Vueはランニングライトのシンプルな効果を実現

この記事では、マーキーのシンプルな効果を実現するためのVueの具体的なコードを参考までに共有します。...

要素内の TimePicker は時間の一部を無効にします (分単位で無効)

プロジェクトの要件は、日付と時刻を選択し、現在の時刻以降の時刻のみを選択し、最小レベルを分単位で無効...

MySQL マルチテーブルクエリの詳細な説明

いつも、気づかないうちに時間というのは驚くほど早く過ぎていきます。小暑が過ぎ、中暑に突入しました。太...

Element-ui NavMenuサブメニューを使用して再帰的に生成する場合のエラーの詳細な説明

ナビゲーションバーのサブメニューを再帰的に生成すると、メニューは正常に生成できるが、マウスをホバーす...

CSS変換ページめくりアニメーションレコードの実装

ページめくりの問題のシナリオBとCは同じページ(表と裏)にありますページをめくって A をカバーした...

Ubuntu 20.04でルートアカウントを有効にする方法

Ubuntu 20.04 をインストールした後、デフォルトでは root アカウントのログイン権限が...