Nginx worker_connections
"ワーカープロセスで開くことができる同時接続の最大数を設定します。この数には、クライアントとの接続だけでなく、すべての接続(プロキシサーバーとの接続など)が含まれます。別の考慮事項は、同時接続の数は、オープンファイルの最大数の現在の制限を超えることはできません。」これに関するクエリはほとんどありません。
実用的なアプローチをとりましょう。
これらの制限はすべて、ハードウェアが低速で高価だった過去1世紀にハードコーディングおよび設計されたものです。現在2016年になり、平均的なウォールマートトースターは、デフォルト値よりも多くのリクエストを処理できます。
デフォルト設定は実際には危険です。 Webサイトに何百人ものユーザーがいることは印象的ではありません。
関連する設定ですが、トピックについて説明します。
nginx as load balancer:
nginx as webservers:
これはトリッキーです。
一部のアプリケーション/フレームワーク/ミドルウェア(php-fpmなど)は、nginxの外部で実行されます。その場合、通常、重い処理を実行してリソースを消費しているのは外部アプリケーションであるため、nginxワーカーは1つで十分です。
また、一部のアプリケーション/フレームワーク/ミドルウェアは一度に1つの要求しか処理できず、それらをオーバーロードするのはバックファイアです。
一般的に言って、1人の労働者が常に安全な賭けです。
そうでなければ、何をしているのかわかっている場合は、コアごとに1つのワーカーを配置できます。私はそのルートを最適化と見なし、適切なベンチマークとテストをアドバイスします。
接続の総数はworker_process * worker_connections
。ロードバランサーモードの半分。
これでトースターの部分に到達しました。 多くの深刻な過小評価されたシステム制限があります:
安全なデフォルトでは、どこにでも1kを置きます。
それは、ほとんどの内部および未知のサイトがこれまでに遭遇するよりも十分に高いです。他のシステムの制限に達しない程度の低さです。
特に公開されているWebサイトの場合、何千ものクライアントがいることは非常に一般的です。デフォルトが低いためにダウンしたウェブサイトの数を数えるのをやめました。
本番環境で許容される最小値は10kです。これを可能にするには、関連するシステム制限を増やす必要があります。
制限が高すぎるようなことはありません(ユーザーがいない場合、制限は単に効果がありません)。ただし、制限が低すぎると、ユーザーが拒否され、サイトが停止します。
10kはナイスで簡単です。
1000kkの任意の制限を設定することもできますが(結局のところ制限です)、実際にはあまり意味がありません。そのトラフィックを取得できず、とにかくそれを受け入れることができませんでした。
妥当な設定として10kに固執しましょう。より多くのサービスを提供する(実際に実行できる)サービスには、特別なチューニングとベンチマークが必要です。
時々、サーバーに多くのリソースがないことを知っていて、あまりできないスパイクが予想されます。利用するより拒否するほうがよいでしょう。その場合は、適切な接続制限を設定し、Niceエラーメッセージと処理を構成します。
時々、バックエンドサーバーは正常に機能していますが、最大である程度の負荷までしかありません。サーバーがクラッシュするよりも速度を落とすほうがよいでしょう。その場合、厳密な制限でキューイングを構成し、要求が上限付きのペースで排出されている間、nginxにすべての熱をバッファーさせます。
ulimit -a
は、システムでプロセスが使用できるオープンファイルの数を示します。
また、net.ipv4.ip_local_port_range
は、IPごとに有効にするソケットの合計範囲を設定します。
したがって、worker_connections
はこれらの値を超えることはできません。そうしないと、クライアント接続はnet.core.netdev_max_backlog
-TCPキューの合計サイズ)までキューに入れられます。
Nginxをリバースプロキシとして使用している場合、接続ごとに2つのソケットを使用することに注意してください。 net.ipv4.tcp_fin_timeout
および他のカーネルtcp関連のタイムアウトを少し試して、ソケットの状態をすばやく切り替えたい場合があります。注意すべきもう1つのことは、各ソケットがTCPメモリスタックのメモリを割り当てることです。また、sysctl
、CPUと十分なファイルハンドラーがある限り、RAMにさらに圧力をかけることができます。
参考までに、十分なコンピューティングリソースがあれば、32GBのRAMを搭載した1台のサーバーと、sysctlを使用したカーネル調整を伴う1MM同時接続を処理するいくつかの仮想ネットワークインターフェイスを持つことができます。私のテストでは、1MMを超えて処理し、約700Bytesのペイロードを送信したとき、サーバーは約1.2MMの同時クライアントを更新するのに約10秒かかっていました。次に、いくつかの追加のNICを結合して仮想NICを破棄することにより、ネットワーク帯域幅を増やしました。ペイロード、帯域幅、およびすべてのクライアントを更新するための適切な時間を考慮すると、1.2MMを超えるクライアントとの擬似ほぼリアルタイムの通信を実現できます。
ハッピーチューニング!
マルセルの答えは本当に賛成する必要があります! ulimitsがデフォルト値の約1kに設定されている場合、max_connectionsは同じ値の周りに設定する必要があります。そうでない場合、max_connectionsを10kに設定してもメリットはありません。
「worker_connectionsがこれらのいずれよりも大きくなることができない場合、またはクライアント接続はnet.core.netdev_max_backlog-TCPキュー。"
Ulimitsが許す限り、単一のプロセスが接続を開くことができます。 num_workers * max_connectionsは式ですが、ロードバランサ/プロキシの最大接続数とulimitsの外側は、妥当な値を考慮に入れる必要があります。 max_connectionを本当に高い値に設定すると、ulimitsが制限要因になるため、逆効果になる可能性があります。
適切なサイジングは、Nginxが処理しているトラフィックのタイプに基づいて変化するため、テストを通じて発見できます。
理論的には、nginxは次を処理できます:最大クライアント数= worker_processes * worker_connections(* = multiply)およびworker_processes =プロセッサ数
プロセッサーを見つけるには、次のコマンドを使用します。grep processor/proc/cpuinfo | wc -l
リソースに制約がある場合は、下限を設定すると便利な場合があります。一部の接続、たとえば、キープアライブ接続(クライアントだけでなく 上流サーバーも も)は、リソースを無駄にしています(nginxが非常に効率的である場合でも) 、および汎用サーバーの正しい操作には必要ありません。つまり、サーバーを安全に削除して、残りの操作でより多くのリソースを使用できるようにすることができます。
したがって、リソース制限を低くすると、物理リソースが不足する可能性があることをnginxに示します。新しい接続に接続の確立に問題が発生する代わりに、使用可能な接続を新しい接続に割り当てる必要があります。より差し迫ったニーズに対応します。
推奨値は?これがデフォルトです。
デフォルトはすべてドキュメント内に記載されています。
デフォルト:worker_connections 512;
そして、 ソースコードレベルでevent/ngx_event.c
で確認 にすることもできます
13#define DEFAULT_CONNECTIONS 512