我正在对服务器进行编程,我的连接数似乎受到了限制,因为即使我将连接数设置为“无限”,我的带宽也没有饱和。
如何增加或消除我的 Ubuntu Linux 机器一次可以打开的最大连接数?操作系统是否限制了这一点,还是路由器或 ISP?或者是别的什么?
原文由 jbu 发布,翻译遵循 CC BY-SA 4.0 许可协议
我正在对服务器进行编程,我的连接数似乎受到了限制,因为即使我将连接数设置为“无限”,我的带宽也没有饱和。
如何增加或消除我的 Ubuntu Linux 机器一次可以打开的最大连接数?操作系统是否限制了这一点,还是路由器或 ISP?或者是别的什么?
原文由 jbu 发布,翻译遵循 CC BY-SA 4.0 许可协议
1 回答825 阅读✓ 已解决
1 回答690 阅读✓ 已解决
3 回答661 阅读✓ 已解决
1 回答1.4k 阅读
1 回答813 阅读✓ 已解决
2 回答572 阅读✓ 已解决
1 回答1k 阅读
最大连接数受到客户端和服务器端的某些限制的影响,尽管略有不同。
在客户端: 增加临时端口范围,并减少
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 个出站连接。要更改值:
以上不应解释为影响系统每秒建立出站连接能力的因素。但是,这些因素会影响系统在大量“活动”期间以可持续的方式处理并发连接的能力。
tcp_tw_recycle
&tcp_tw_reuse
的典型 Linux 机器上的默认 Sysctl 值将是这些不允许来自“已使用”套接字(处于等待状态)的连接,并强制套接字持续完整的
time_wait
循环。我建议设置:这允许在
time_wait
状态下快速循环套接字并重新使用它们。但在您进行此更改之前,请确保这不会与您将用于需要这些套接字的应用程序的协议冲突。请务必阅读 文森特·伯纳特 (Vincent Bernat) 的文章“应对 TCP TIME-WAIT” 以了解其含义。net.ipv4.tcp_tw_recycle
选项对于面向公众的服务器来说是非常有问题的,因为它不会处理来自同一 NAT 设备后面的两台不同计算机的连接,这是一个难以检测并等待咬你的问题。请注意,net.ipv4.tcp_tw_recycle
已从 Linux 4.12 中删除。在服务器端:
net.core.somaxconn
值具有重要作用。它限制排队到侦听套接字的最大请求数。如果您确定服务器应用程序的能力,请将其从默认的 128 提高到 128 到 1024 之类的值。现在您可以通过将应用程序的侦听调用中的侦听积压变量修改为相等或更高的整数来利用这种增加。txqueuelen
你的以太网卡的参数也有作用。默认值为 1000,因此如果您的系统可以处理,请将它们提高到 5000 甚至更多。同样提高
net.core.netdev_max_backlog
和net.ipv4.tcp_max_syn_backlog
的值。它们的默认值分别为 1000 和 1024。现在请记住通过在 shell 中增加 FD ulimts 来启动客户端和服务器端应用程序。
除了上述之外,程序员使用的一种更流行的技术是减少 tcp write 调用的数量。我自己的偏好是使用缓冲区,在其中我将希望发送到客户端的数据推送到客户端,然后在适当的点将缓冲的数据写出到实际的套接字中。这种技术允许我使用大数据包,减少碎片,降低我在用户空间和内核级别的 CPU 利用率。