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

推薦する

ログインフォームを実装するためのJavaScript

この記事の例では、ログインフォームを実装するためのJavaScriptの具体的なコードを参考までに共...

ホストがアクセスできるようにMySQLの権限を変更する方法

mysqlのリモートアクセス権を有効にするデフォルトでは、MySQL ユーザーにはリモート アクセス...

js を使用して QR コードを生成するサンプル コード

以前、プロジェクトでQRコードをスキャンして情報を表示する機能を開発する必要がありました。インターネ...

SCSS スタイルのコードを 50% 削減する 14 の実践的な経験

序文Sass は CSS3 言語の拡張機能です。Sass を使用すると、より良いスタイルシートをより...

MySQL で結果を選択して更新を実行する例のチュートリアル

1. 単一テーブルクエリ -> 更新 テーブル名の更新 フィールド1=新しい値1、フィールド2...

MySQL テーブルを削除するときに外部キー制約を無視するシンプルな実装

テーブルを削除することはあまり一般的ではありませんが、特に外部キーの関連付けがあるテーブルの場合は、...

開発者がデータベースロックを詳細に理解する必要がある理由

1.ロックしますか? 1.1 ロックとは何ですか?ロックの本当の意味は、鍵またはコードで開くことがで...

両端の CSS レイアウトのサンプルコード (親の負のマージンを使用)

最近、開発中に両端が揃ったレイアウトに遭遇しました。レイアウトはパーセンテージに基づいていました。以...

Antd+vueは円形属性フォームの動的検証のアイデアを実現します

必要な項目をループして検証するために、クエリ フォームのいくつかのプロパティを実装したいと考えていま...

TypeScript の Enum が問題となる理由

目次どうしたの?いつ使うか列挙の数を制御するビット値コントロールインデックス非数値列挙結論はType...

フロントエンドとバックエンド分離プロジェクトのDockerデプロイメントの実装例

目次1. 環境整備2. イメージを実行する問題を解決するRedis のインストールNginx のイン...

mysql 8.0.15 winx64 解凍バージョン グラフィック インストール チュートリアル

システムをインストールした後、毎回いくつかのソフトウェアを再インストールする必要があります。ソフトウ...

Maven で tomcat8-maven-plugin プラグインを使用する詳細なチュートリアル

オンラインで多くの記事を検索しましたが、解決策は見つかりませんでした。次のように、tomcat7-m...

JS配列の一般的な方法とテクニックを学び、マスターになりましょう

目次splice() メソッドjoin() メソッド逆() メソッドevery() メソッド削減()...

MySQL binlog を開く手順

Binlog は、MySQL データの変更を記録するために使用されるバイナリ ログ ファイルです。B...