用 cpustat 定位 CPU 瓶颈,再针对网络栈做精准优化
定位思路与工具分工
- cpustat 用于高精度采样并汇总进程/系统的 CPU 利用率、上下文切换、中断 等,帮助判断网络高峰是否引发 CPU 饱和;它并不直接测量网络吞吐、时延、丢包等网络指标。网络层建议配合 iftop、nload、nethogs、tcpdump 等工具联合观测,以形成“CPU ↔ 网络”的因果链。这样能明确是网络本身受限,还是网络处理在 CPU 侧成为瓶颈。
安装与快速观测
- 安装工具:
- 系统自带的 cpustat(来自 sysstat):sudo apt update && sudo apt install sysstat
- 网络观测:sudo apt install iftop nload nethogs tcpdump
- 典型观测组合(两个终端并行):
- 终端1(CPU 视角):sudo cpustat -p ALL 1
- 终端2(网络视角):sudo iftop -i eth0 或 sudo nload eth0 或 sudo nethogs eth0
- 观察要点:当网络流量突增时,若 %usr + %sys 同步接近 100% 且软中断(si)升高,多半是网络栈/驱动在消耗 CPU;若 CPU 不高但吞吐上不去,更可能是 带宽/链路/对端/协议 限制。此时应转用带宽与时延工具进一步验证。
常见瓶颈与优化对照表
| 现象(由 cpustat 等观测到) |
可能原因 |
优化动作 |
| %sys 高、软中断(si)高,网络吞吐上不去 |
软中断集中在少数 CPU,NIC 中断未充分分散 |
启用/调优 RPS/RFS(将网卡中断在多核间分发);升级驱动并使用 多队列 NIC;必要时绑定中断与队列(irqbalance/手动 affinity) |
| %usr 高,伴随 nethogs 看到某进程占用高 |
应用层加密、压缩、序列化等计算密集 |
开启 Gzip/TLS 硬件加速(如支持)、使用 零拷贝/异步 I/O、优化协议与序列化、考虑多进程/多线程并行 |
| %idle 高但 RTT 大/丢包 |
带宽或链路/对端瓶颈,非 CPU 问题 |
升级链路/带宽、优化路由与 QoS、就近接入/更换运营商、应用层限速与重试退避 |
| 上下文切换(cs)高、运行队列(prun)大 |
进程/线程过多、锁竞争、短连接风暴 |
合并请求、连接复用(长连接/连接池)、降低锁粒度、使用 epoll/异步 模型、限流与队列化 |
面向网络性能的 sysctl 调优示例
- 增大套接字缓冲,减少短连接与大流量下的丢包与重传:
- net.core.rmem_max = 16777216
- net.core.wmem_max = 16777216
- net.ipv4.tcp_rmem = 4096 87380 16777216
- net.ipv4.tcp_wmem = 4096 65536 16777216
- 加速连接回收,降低端口/内存占用(短连接高并发场景):
- net.ipv4.tcp_tw_reuse = 1
- net.ipv4.tcp_fin_timeout = 30
- net.ipv4.ip_local_port_range = 1024 65535
- 缓解 SYN 洪泛与连接建立压力:
- net.ipv4.tcp_syncookies = 1
- 应用生效:sudo sysctl -p
- 说明:以上为通用起点,需结合业务与压测微调;过大缓冲可能增加延迟与内存占用。
cpustat 采样与排障脚本示例
- 高分辨率采样 200ms、汇总 2s,持续 60s,输出 CSV,便于事后分析“网络高峰→CPU”关系:
- sudo cpustat -x -D -a 0.2 300 > cpustat_$(date +%F_%H%M%S).csv
- 同时采集网络侧关键指标(示例:每 1s 采样 iftop 的 10s 汇总,后台记录):
- sudo iftop -i eth0 -t -s 10 >> iftop_$(date +%F_%H%M%S).log &
- 若使用 Go 版 cpustat(uber-common/cpustat),通常需要 root 权限(netlink taskstats 接口):
- 分析建议:在 CSV 中关注 usr/sys/iowait 的峰值区间,与 iftop 日志的带宽峰值对齐,定位是 CPU 计算、内核网络栈 还是 外部带宽 成为主因。