如何配置香港服务器的内核参数(sysctl.conf)支持百万级并发连接而不掉包?

去年我在香港机房上线了一套高并发的实时推送服务,理论上需要支撑接近 100万并发 TCP 长连接。刚开始部署时,服务器的网络接口明明是万兆网卡,但依旧频繁掉包、连接被 RST 重置、延迟飙升。我当时几乎一度怀疑是程序问题,但经过几天的排查,我最终通过优化 Linux 内核参数(sysctl.conf)解决了这个问题。下面,我把整个实操过程完整记录下来,供大家参考。
一、问题背景与现象
我的香港服务器配置如下:
- 操作系统:CentOS 7.9
- 内核版本:3.10.0-1160
- CPU / 内存:32 核 / 128GB
- 网络带宽:10 Gbps
部署后,使用压测工具模拟 80 万并发长连接 时,出现以下问题:
- netstat -s 显示 TCP 连接频繁被重置,SYN backlog 溢出严重。
- sar -n DEV 发现丢包率超过 3%。
- 应用日志显示有大量连接被动断开。
很明显,Linux 内核默认网络参数完全无法支撑这种规模的并发。
二、内核瓶颈分析
我首先从几个方向分析:
- 文件描述符限制:百万连接需要百万 FD,必须确认 ulimit -n 足够大。
- 端口及 TIME_WAIT 堆积:短连接或重连会迅速消耗本地端口,需要调优 ip_local_port_range 和 tcp_tw_reuse。
- SYN 队列和 Backlog:高并发场景容易触发半连接队列溢出。
- 缓冲区与内存:TCP 缓冲区默认值太小,会导致丢包或延迟。
- 通过 ss -s、netstat -s 和 dmesg 的观察,我确认主要问题是 内核 TCP 参数未优化,导致队列溢出和内存分配不足。
三、sysctl.conf 核心配置
经过多轮测试,我最终确定了如下 sysctl.conf 配置,可以稳定支撑 100 万并发连接:
# ---------------- 网络核心参数 ----------------
# 提高允许的最大文件描述符数
fs.file-max = 2097152
# ---------------- TCP 基础参数 ----------------
# 端口范围扩大,避免端口耗尽
net.ipv4.ip_local_port_range = 1024 65535
# TIME_WAIT 重用和回收(仅在 NAT 或高并发长连接场景慎用)
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_fin_timeout = 10
# ---------------- SYN 队列优化 ----------------
# 增大半连接队列和 backlog,避免 SYN flood
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
# ---------------- 内存与缓冲区 ----------------
# 增加接收和发送缓冲区范围
net.core.rmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_default = 262144
net.core.wmem_max = 16777216
# 增大 TCP 内核缓存
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# 提高系统全局队列限制
net.core.netdev_max_backlog = 262144
# ---------------- TCP 连接追踪 ----------------
# 避免过快进入 TIME_WAIT 堆积
net.ipv4.tcp_max_tw_buckets = 2000000
net.ipv4.tcp_orphan_retries = 1
# ---------------- SYN Cookie 防护 ----------------
net.ipv4.tcp_syncookies = 1
保存后执行:
sysctl -p
四、系统层面优化
除了 sysctl.conf,还需要配合以下系统调优:
1.文件描述符限制
在 /etc/security/limits.conf 中添加:
* soft nofile 1048576
* hard nofile 1048576
2.epoll 优化
使用 EPOLLET 边缘触发模式,减少 wakeup 次数。
3.网卡参数优化
使用 ethtool -G eth0 rx 4096 tx 4096 增大环形缓冲队列。
五、验证与效果
应用优化后的参数后,我再次进行压测:
- 并发数:100 万 TCP 长连接
- CPU 占用:约 50%
- 丢包率:低于 0.1%
- 平均 RTT:稳定在 2~3ms
问题彻底解决。
六、经验总结
香港服务器带宽充足,但内核参数是关键瓶颈。
百万并发需要系统级调优,包括文件描述符、TCP 队列、缓冲区、端口范围等。
调优一定要结合压测,盲目套用配置很容易适得其反。
这是我在真实项目中踩坑之后总结的完整解决方案,希望能帮到同样需要支撑百万级并发的同学。