最大连接数受到客户端和服务器端某些限制的影响,尽管略有不同。
在客户端:增加临时端口范围,并减少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 = 470
每秒套接字数。如果您对此不满意,可以从增加port_range
。将范围设置为15000 61000
如今这很常见。您可以通过减少fin_timeout
。假设您同时执行这两项操作,您应该会更容易地看到每秒超过 1500 个出站连接。
更改值:
sysctl net.ipv4.ip_local_port_range="15000 61000"
sysctl net.ipv4.tcp_fin_timeout=30
上述内容不应被解释为影响系统每秒进行出站连接的能力的因素。相反,这些因素会影响系统在长时间“活动”中以可持续的方式处理并发连接的能力。
典型 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” https://vincent.bernat.ch/en/blog/2014-tcp-time-wait-state-linux了解其中的含义。这net.ipv4.tcp_tw_recycle
该选项对于面向公众的服务器来说是相当有问题的,因为它无法处理来自同一 NAT 设备后面的两台不同计算机的连接,这是一个很难发现并等着咬你的问题。注意net.ipv4.tcp_tw_recycle
已经removed https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=4396e46187ca5070219b81773c4e65088dac50cc从Linux4.12开始。
在服务器端:
The net.core.somaxconn
价值有着重要的作用。它限制排队到侦听套接字的最大请求数。如果您确定服务器应用程序的功能,请将其从默认的 128 提高到 128 到 1024 之类的值。现在,您可以通过将应用程序的监听调用中的监听积压变量修改为相等或更大的整数来利用这一增加。
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
and net.ipv4.tcp_max_syn_backlog
。它们的默认值分别是 1000 和 1024。
sysctl net.core.netdev_max_backlog=2000
sysctl net.ipv4.tcp_max_syn_backlog=2048
现在请记住通过在 shell 中增加 FD ulimts 来启动客户端和服务器端应用程序。
除了上述之外,程序员使用的一种更流行的技术是减少TCP写来电。我自己的偏好是使用缓冲区,其中我将希望发送到客户端的数据推送到客户端,然后在适当的时候将缓冲的数据写到实际的套接字中。这项技术允许我使用大数据包、减少碎片、降低用户态和内核级的 CPU 利用率。