我正在使用 gatling 进行 30000TPS(每秒交易量)的负载测试,遇到以下错误
i.n.c.u.Errors$NativeIoException: newSocketStream(..) failed: 99128 (99.43%) Too many open files > j.n.ConnectException: connect(..) failed: Cannot assign reques 570 ( 0.57%) ted address
似乎我的负载测试虚拟机中的 TCP 端口已经用完了
我尝试调整 /etc/sysctl.conf 中的内核配置。
net.ipv4.tcp_max_syn_backlog = 40000
net.core.somaxconn = 40000
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_moderate_rcvbuf = 1
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_mem = 134217728 134217728 134217728
net.ipv4.tcp_rmem = 4096 277750 134217728
net.ipv4.tcp_wmem = 4096 277750 134217728
net.core.netdev_max_backlog = 300000
net.ipv4.ip_local_port_range=1025 65535
还配置了 ulimit -n 65k,但没有运气,我仍然遇到了 tcp 连接问题。
有人可以告诉我如何快速重用 TCP 端口吗?
参考 :
耗尽了 tcp udp 端口 [关闭] -https://serverfault.com› 问题 › 用完了 tcp-udp...
答案1
“打开的文件过多”是一个显而易见的故事,所以我们把它放在这个答案的范围之外——我不觉得自己有天赋为一个已经解释过几千次的案例添加新内容。
但“无法分配请求的地址”是一个全新的案例。它通常表示您的客户端实际上已达到唯一 IP 端口四元组(ipsrc-srcport-ipdst-dstport)的端口限制,并且它应该在给定的网络堆栈中是唯一的,只是为了能够区分一个连接与另一个连接。由于您正在从唯一的客户端 IP 对某些服务进行负载测试,因此最后两个成员(ipdst-dstport)被固定,第一个成员也是如此,这意味着只有第二个成员是可变的。理论上它可以从 0 到 65535 不等,但实际上客户端端口是从 sysctl net.ipv4.ip_local_port_range
oid 中选择的,其开箱即用的值为“32768 60999”,因此不到一半的端口可用。
可能的解决方法:
- 设置
net.ipv4.ip_local_port_range
为“1024 65535”。这将增加可用的客户端端口范围(在您的情况下可能是 2 倍)。 - 使用多个 IP 和多个 FIB 来启动与给定服务器 IP 的新连接。这样,您从每个新 IP 获得 +64K 个连接。
关于 TCP 端口/连接的重用 - 长话短说 - 不要。关闭/完成的连接应在一段时间内保持 TIME-WAIT 状态,否则可能会发生不好的事情(例如,但不限于 - 来自该客户端端口上“较旧”TCP 连接的重新排序或延迟的 TCP 数据包可能会导致连接中断或事件关闭)。Linux 甚至曾经有一个允许 TCP 连接重用的 sysctl oid,但使用它的负面影响是如此巨大,以至于它被一劳永逸地从内核中删除。