阶段 3:TCP 内核参数瓶颈(Day 7-9)
⏳ 状态:规划中(阶段 1/2 完成后下一步执行,预计 Day 7-9)。
撞上的问题:FD 瓶颈修复后,连接数跑到 3 万时开始出现建连超时,部分连接建不起来,已有的连接偶尔出现丢包。
背景
10K 连接稳定后,继续向上爬升。这时候操作系统默认的 TCP 参数不够用了。
每日概览
| 天 | 主题 | 关键操作 | 产出 |
|---|---|---|---|
| Day 7 | 建连超时与端口范围 | 3 万连接时出现 connect() 超时,发现 ip_local_port_range 默认只有 32768-60999(约 2.8 万可用端口) | 端口耗尽现象记录 |
| Day 8 | TCP 缓冲区与内存 | tcp_rmem/tcp_wmem 默认值偏小导致吞吐受限,调优缓冲区 | 吞吐对比(优化前 vs 后) |
| Day 9 | somaxconn 与 SYN 积压 | net.core.somaxconn 默认 128,高并发建连时 SYN 队列溢出 | scripts/03-tcp-kernel-params.sh |
问题诊断路径
bash
3 万连接 → connect() 超时 → 检查 ip_local_port_range(28000 端口)
→ 扩到 1024-65535 → 超时消失
5 万连接 → 吞吐下降 → 观察 tcp_rmem/tcp_wmem(默认 128KB)
→ 调大缓冲区 → 吞吐恢复
高并发建连 → ss -s 看到 SYN_RECV 堆积 → somaxconn=128 太小
→ 调高 somaxconn → SYN 队列正常完工验证清单
- [ ]
ip_local_port_range= 1024 65535 - [ ]
somaxconn≥ 65535 - [ ] TCP 读写缓冲区 ≥ 4MB
- [ ] 5 万连接稳定运行
一句话总结:FD 只是第一关,TCP 内核参数是第二关——端口范围、缓冲区大小、监听队列长度,每个默认值在高并发下都是瓶颈,但你必须先撞上才能理解为什么需要改它们。