在 Linux 中增加最大 TCP/IP 连接数

新手上路,请多包涵

我正在对服务器进行编程,我的连接数似乎受到了限制,因为即使我将连接数设置为“无限”,我的带宽也没有饱和。

如何增加或消除我的 Ubuntu Linux 机器一次可以打开的最大连接数?操作系统是否限制了这一点,还是路由器或 ISP?或者是别的什么?

原文由 jbu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 711
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 = 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 状态下快速循环套接字并重新使用它们。但在您进行此更改之前,请确保这不会与您将用于需要这些套接字的应用程序的协议冲突。请务必阅读 文森特·伯纳特 (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 之类的值。现在您可以通过将应用程序的侦听调用中的侦听积压变量修改为相等或更高的整数来利用这种增加。

 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_backlognet.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 利用率。

原文由 mdk 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏