3

非常に重い負荷の下では、サーバーは TCP 接続を十分に迅速に「リサイクル」していないようです。

複数のマシンを使用するのではなく、1 つのマシンでノード サーバーの複数のインスタンスを作成することにより、Docker を使用して API への 1 秒あたりのリクエスト数を通常よりも多く処理することを検討しています。

次の sysctl 設定が設定されている場合、リサイクルはより高速に行われるように見えますが、存在できるソケットの数には依然として厳しい制限があります。

net.ipv4.ip_local_port_range='1024 65000'
net.ipv4.tcp_tw_reuse='1'
net.ipv4.tcp_fin_timeout='15

複数の docker インスタンスを実行している場合、tcp 接続の合計上限は、「親」マシンが処理できる最大 tcp 接続の数と同じですか?

4

1 に答える 1

5

はい、TCP 接続の合計上限は Docker ホストによって制限されます。

ただし、大きく異なる 3 つの制限があります。

  • 開いている接続の合計上限 (ソース/宛先 IP アドレスに関係なく)。これは、ファイル記述子の最大数に関連しており、非常に高くなる可能性があります (つまり、数百万)
  • 特定のローカル IP アドレスのアウトバウンド接続の合計上限 (ローカル IP アドレスごとに 64K に制限)
  • netfilter によって追跡される接続の合計上限

TCP ポートのリサイクルは、2 番目の制限に対処します。ホストとコンテナーで使用するnetstat -ntと、それに近づいているかどうかを簡単に確認できるはずです。その場合は、使用した sysctl が大いに役立つはずです。

コンテナが外部トラフィックを処理している場合、その制限の対象にはなりません。ただし、3つ目はヒットする可能性があります。追跡された接続の数を で確認できます。conntrack -S必要に応じて、微調整して接続の最大数を増やすことができます/proc/sys/net/ipv4/netfilter/ip_conntrack_max

サーバーが接続を十分に高速にリサイクルしていないと思われる、どのような症状が見られるかを示していただけると助かります。

于 2013-11-04T14:24:01.630 に答える