Linux で TCP/IP 接続の最大数を増やす 質問する

Linux で TCP/IP 接続の最大数を増やす 質問する

私はサーバーをプログラミングしていますが、接続数を「無制限」に設定しても帯域幅が飽和しないため、接続数が制限されているようです。

Ubuntu Linux ボックスが一度に開くことができる接続の最大数を増やすか、または減らすにはどうすればよいですか? これは OS によって制限されているのでしょうか、それともルーターまたは ISP による制限でしょうか? あるいは、他の何かによる制限でしょうか?

ベストアンサー1

最大接続数は、多少の違いはあるものの、クライアント側とサーバー側の両方における特定の制限の影響を受けます。

クライアント側:一時ポートの範囲を広げ、tcp_fin_timeout

デフォルト値を確認するには:

sysctl net.ipv4.ip_local_port_range
sysctl net.ipv4.tcp_fin_timeout

一時ポート範囲は、ホストが特定の IP アドレスから作成できる送信ソケットの最大数を定義します。fin_timeoutこれらのソケットが状態 (一度使用した後は使用不可) に留まる最小時間を定義しますTIME_WAIT。通常のシステム デフォルトは次のとおりです。

  • net.ipv4.ip_local_port_range = 32768 61000
  • net.ipv4.tcp_fin_timeout = 60

これは基本的に、システムが(61000 - 32768) / 60 = 4701 秒あたり ソケット以上を一貫して保証できないことを意味します。これで満足できない場合は、 を増やすことから始めることができますport_range。 範囲を に設定することは、15000 61000最近ではかなり一般的です。 を減らすことで可用性をさらに高めることができますfin_timeout。 両方を行うと、1 秒あたり 1500 を超える送信接続がより簡単に表示されるはずです。

値を変更するには:

sysctl net.ipv4.ip_local_port_range="15000 61000"
sysctl net.ipv4.tcp_fin_timeout=30

上記は、1 秒あたりの送信接続を行うシステムの能力に影響を与える要因として解釈されるべきではありません。むしろ、これらの要因は、長時間の「アクティビティ」で持続可能な方法で同時接続を処理するシステムの能力に影響を与えます。

典型的なLinuxボックスのデフォルトのSysctl値はtcp_tw_recycle次のtcp_tw_reuseとおりです。

net.ipv4.tcp_tw_recycle=0
net.ipv4.tcp_tw_reuse=0

これらは、「使用済み」ソケット (待機状態) からの接続を許可せず、ソケットが完全なtime_waitサイクルを持続するように強制します。次の設定をお勧めします。

sysctl net.ipv4.tcp_tw_recycle=1
sysctl net.ipv4.tcp_tw_reuse=1 

これにより、ソケットのtime_wait状態を高速に循環させて再利用できます。ただし、この変更を行う前に、これらのソケットを必要とするアプリケーションで使用するプロトコルと競合しないことを確認してください。影響を理解するには、Vincent Bernat の投稿「TCP TIME-WAIT への対処」を必ずお読みください。このnet.ipv4.tcp_tw_recycle オプションは、パブリック向けサーバーにとっては非常に問題があります。同じ NAT デバイスの背後にある 2 台の異なるコンピューターからの接続を処理できないためです。これは検出が難しく、問題を引き起こす可能性があります。Linux 4.12 では削除されnet.ipv4.tcp_tw_recycleていることに注意してください。

サーバー側:このnet.core.somaxconn値は重要な役割を果たします。この値は、listen ソケットにキューイングされるリクエストの最大数を制限します。サーバー アプリケーションの能力が確かな場合は、この値をデフォルトの 128 から 128 ~ 1024 などに増やします。これで、アプリケーションの listen 呼び出しで listen backlog 変数を同等以上の整数に変更することで、この増加を活用できるようになります。

sysctl net.core.somaxconn=1024

txqueuelenイーサネット カードのパラメータも役割を果たします。デフォルト値は 1000 なので、システムが処理できる場合は 5000 以上に上げてください。

ifconfig eth0 txqueuelen 5000
echo "/sbin/ifconfig eth0 txqueuelen 5000" >> /etc/rc.local

net.core.netdev_max_backlog同様に、 との値を増やしますnet.ipv4.tcp_max_syn_backlog。デフォルト値はそれぞれ 1000 と 1024 です。

sysctl net.core.netdev_max_backlog=2000
sysctl net.ipv4.tcp_max_syn_backlog=2048

ここで、シェルで FD ulimts を増やして、クライアント側アプリケーションとサーバー側アプリケーションの両方を起動することを忘れないでください。

上記に加えて、プログラマーが使用するもう 1 つの一般的な手法は、TCP 書き込み呼び出しの数を減らすことです。私は、クライアントに送信したいデータをプッシュするバッファを使用し、適切な時点でバッファされたデータを実際のソケットに書き出すことを好みます。この手法により、大きなデータ パケットを使用し、断片化を減らし、ユーザー ランドとカーネル レベルの両方で CPU 使用率を減らすことができます。

おすすめ記事