Appearance
Day 10: 单 CPU 打满瓶颈 (Single CPU Saturation)
所属阶段:阶段 4 — CPU 与软中断
今日目标
5 万连接全部加上业务流量(每连接每秒发一条消息),观测到一个新问题:只有 1 个 CPU 核在干活。
前置状态
- FD/TCP 参数已优化,5 万连接承载无问题
- 但之前测试都是"连接建立后空闲",没加业务流量
预期 vs 实际
| 预期 | 实际 | |
|---|---|---|
| CPU 分布 | 8 核均匀分担 | CPU0 100%,其他核几乎空闲 |
| QPS | 随核数线性提升 | 受限于单核 |
撞上了什么
bash
# 启动 5 万连接 + 每连接每秒发一条消息
./echo-client --conn 50000 --mode long --rate 1 --duration 60
# 在服务器上观测
mpstat -P ALL 1输出类似:
bash
CPU %usr %sys %soft %idle
0 5 15 80 0 ← CPU0 打满!
1 2 1 1 96
2 1 1 1 97
...
7 1 1 1 97关键发现:%soft 高达 80%——问题出在软中断!
诊断步骤
bash
# 1. 查看软中断分布
cat /proc/softirqs
# NET_RX 行 → CPU0 列数值巨大,其他列为 0
# 2. 查看硬中断分布
cat /proc/interrupts | grep eth0
# 所有网卡中断都在 CPU0
# → 根因: 网卡中断全部路由到一个 CPU根因分析
默认情况下,网卡只有 1 个收发队列,所有网络数据包的中断都发到 CPU0。CPU0 的 %soft 飙升是因为内核在软中断上下文中处理网络协议栈(TCP/IP → socket → 唤醒 epoll)。
关键指标记录
| 指标 | 值 |
|---|---|
| CPU0 %soft | ~80% |
| 其他核 %soft | ~1% |
| NET_RX 软中断/CPU0 | 极高 |
| PPS | 受单核限制 |
一句话总结:给连接加业务流量后,CPU 的失衡立刻暴露——不是你的 8 核机器性能不行,而是所有软中断都挤在一个核上,另外 7 个核在围观。这是明天要解决的问题。