上一篇 下一篇 分享链接 返回 返回顶部

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

发布人:Minchunlin 发布时间:2025-08-02 10:25 阅读量:618


去年我在香港机房上线了一套高并发的实时推送服务,理论上需要支撑接近 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 队列、缓冲区、端口范围等。

调优一定要结合压测,盲目套用配置很容易适得其反。

这是我在真实项目中踩坑之后总结的完整解决方案,希望能帮到同样需要支撑百万级并发的同学。

目录结构
全文