linux-sre-handbook

06-性能调优案例

案例 1:CPU sy% 飙升 — Redis 慢查询

现象:CPU sy%(内核态)达到 70%

排查

mpstat -P ALL 1         # 确认 sy 高
perf top                # 发现大量 _raw_spin_lock
strace -p <PID> -c      # 发现大量 epoll_wait 调用

根因:Redis 单线程 + 大量短连接导致频繁 epoll 系统调用

解决:改用连接池,减少连接创建/销毁

案例 2:iowait 飙高 — 日志刷盘风暴

现象:iowait 50%,应用响应变慢

排查

iostat -x 1            # 发现写 IOPS 异常高
iotop                  # 定位到应用写日志线程
lsof -p <PID> | grep log  # 确认日志路径

根因:日志使用同步写(O_SYNC),大量小 IO

解决:改为异步写 / 缓冲写 / 写入 tmpfs 定期归档

案例 3:内存”消失” — Page Cache 过大的假象

现象free -h 显示内存 95% 已用,但应用没 OOM

排查

cat /proc/meminfo | grep -i cache   # Cached 占了大半
cat /proc/meminfo | grep MemAvailable  # 实际可用很多

根因:不是内存泄漏,而是 Page Cache 正常使用

解决:无需干预,内核在需要时会回收 Page Cache

案例 4:TIME_WAIT 堆积 — 短连接风暴

现象:客户端连接失败,”Cannot assign requested address”

排查

ss -s                  # TIME_WAIT 连接数过万
ss -tan state time-wait | wc -l

根因:微服务间使用短连接 HTTP/1.0,没有连接复用

解决:改为 HTTP/1.1 Keep-Alive,或启用 tcp_tw_reuse

案例 5:网卡软中断不均衡

现象:8 核机器,一个核 sy% 100%,其余核心空闲

排查

mpstat -P ALL 1        # 某核心 si% 特别高
cat /proc/interrupts   # 所有网卡中断都绑在 CPU0

根因:默认中断亲和性导致单核成为瓶颈

解决:配置 irqbalance 或手动设置 smp_affinity 分散中断

调优经验总结

  1. 不要盲目调优 — 先确认瓶颈,用数据说话
  2. 一次改一个参数 — 便于判断效果
  3. 流量录制回放 — 用 tcpcopy/goreplay 验证调优效果
  4. 做好回滚准备 — 配置文件版本控制

延伸阅读