最大连接数受到客户端和服务器端的某些限制的影响,尽管略有不同。
在客户端:
增加临时端口范围,减少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
以上内容不应被解释为影响系统每秒建立出站连接能力的因素。但是,这些因素会影响系统在大量“活动”期间以可持续的方式处理并发连接的能力。
tcp_tw_recycle 和 tcp_tw_reuse 的典型 Linux 机器上的默认 Sysctl 值将是
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 状态下快速循环套接字并重新使用它们。但在您进行此更改之前,请确保这不会与您将用于需要这些套接字的应用程序的协议冲突。请务必阅读帖子"Coping with the TCP TIME-WAIT" from Vincent Bernat 以了解其含义。 net.ipv4.tcp_tw_recycle 选项对于面向公众的服务器来说是一个很大的问题,因为它无法处理来自同一 NAT 设备后面的两台不同计算机的连接,这是一个难以检测并等待咬你的问题。请注意,net.ipv4.tcp_tw_recycle 在 Linux4.12 中一直是 removed。
在服务器端:
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 和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 write 调用的次数。我自己的偏好是使用缓冲区,在其中我将希望发送到客户端的数据推送到客户端,然后在适当的时候将缓冲的数据写出到实际的套接字中。这种技术允许我使用大数据包,减少碎片,降低我在用户空间和内核级别的 CPU 使用率。