我正在运行一种性能测试,我有一个简单的 TCP 服务器,它有 4 个 IP 地址,正在侦听一个端口并从本地网络上的其他几台计算机获取连接。一切正常,最多只有 120,000 个活动连接,客户端能够从客户端获取消息并创建新连接。在略低于 120,000 的情况下,新连接将停止出现。服务器上没有日志活动,并且客户端在一段时间后开始超时。没有防火墙会阻碍。我已经调整了一堆设置:
/etc/sysctl.conf
net.core.netdev_max_backlog = 1000000
net.core.netdev_budget = 50000
net.core.netdev_budget_usecs = 5000
net.core.somaxconn = 1024000
net.core.rmem_default = 1048576
net.core.rmem_max = 16777216
net.core.wmem_default = 1048576
net.core.wmem_max = 16777216
net.core.optmem_max = 65536
net.ipv4.tcp_rmem = 4096 1048576 2097152
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.udp_rmem_min = 8192
net.ipv4.udp_wmem_min = 8192
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_max_syn_backlog = 3000000
net.ipv4.tcp_max_tw_buckets = 2000000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes = 6
net.ipv4.tcp_mtu_probing = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_rfc1337 = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
/etc/security/limits.conf
* soft nofile 6553600
* hard nofile 6553600
cat /proc/sys/fs/file-max
1621708
限制是故意的,完全是矫枉过正,因为它只是一个测试。我是否缺少其他一些可以启用更多连接的设置?CPU 和 RAM 都没有受到压力,所以我想继续推动硬件。服务器和客户端都在 AWS EC2 t3a.xlarge 实例上运行,如果这有什么不同的话。
原来这是 AWS 的限制。显然,在同一个 VPC 内的 EC2 实例之间进行通信的活动连接限制约为 120,000。让他们使用公共 IP 进行通信摆脱了限制。我在 Ubuntu 中没有遇到任何错误,因为操作系统没有限制任何东西。