LinuxNotes

第 27 章:性能调优

zjc 于 2026-01-27 发布

这是《Linux 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 性能调优不是复制参数,而是定义目标、建立基线、定位瓶颈、验证收益和控制风险。一次合格的优化必须有前后指标、适用条件和回滚方案。

27.1 调优流程

1. 定义指标和目标
2. 采集基线
3. 定位瓶颈
4. 提出假设
5. 测试环境验证
6. 小流量上线
7. 对比指标
8. 固化配置
9. 持续监控

目标示例:

P99 从 800ms 降到 300ms
单机支持 QPS 从 2000 到 3000
磁盘 await 从 40ms 降到 10ms
错误率不超过 0.1%

27.2 容量评估

峰值 QPS
  -> 单实例容量
     -> 实例数
        -> 冗余系数

需要考虑:

项目 说明
CPU 峰值、限流、批任务
内存 工作集、缓存、堆外
磁盘 IOPS、吞吐、延迟
网络 带宽、PPS、连接数
依赖 DB、缓存、队列
发布 摘流后剩余容量

推荐保留 20% 到 30% 的余量,具体按业务风险决定。

27.3 CPU 优化

定位:

pidstat -u 1
top -H -p <pid>
perf record -F 99 -g -p <pid> -- sleep 30

方向:

  1. 优化算法和热点代码;
  2. 减少锁竞争;
  3. 调整线程数;
  4. 使用异步和非阻塞 IO;
  5. 增加缓存;
  6. 削峰限流;
  7. 扩容。

容器:

cat /sys/fs/cgroup/<path>/cpu.stat

如果 throttled 增长,应提高 limit 或降低实例流量,而不是只改应用参数。

27.4 内存优化

定位:

free -h
vmstat 1
pidstat -r 1
ps -eo pid,rss,cmd --sort=-rss | head

方向:

  1. 调整应用堆和缓存上限;
  2. 修复泄漏;
  3. 减少大对象;
  4. 控制并发;
  5. 使用流式处理;
  6. 扩容内存;
  7. 增加水位告警。

Java 容器示例:

java -XX:MaxRAMPercentage=65.0 -jar app.jar

剩余内存要留给元空间、线程栈、直接内存、页缓存和系统。

27.5 IO 优化

定位:

iostat -xz 1
pidstat -d 1
cat /proc/<pid>/io

方向:

问题 优化
小随机 IO 多 批量写、顺序化
fsync 频繁 组提交、批量刷盘
日志过大 降低级别、异步日志
读放大 索引、缓存
云盘规格不足 升级规格
快照影响 错峰

参数必须在真实 workload 下验证:

cat /sys/block/vdb/queue/scheduler
cat /sys/block/vdb/queue/read_ahead_kb

27.6 网络优化

定位:

ss -ti
nstat -az | grep -Ei 'retrans|drop|overflow'
ethtool -S eth0

方向:

  1. 减少短连接;
  2. 使用连接池;
  3. 开启 keepalive;
  4. 增大 backlog;
  5. 修复丢包;
  6. 调整缓冲区;
  7. 优化协议和序列化;
  8. 扩容带宽。

监听队列:

sysctl net.core.somaxconn
sysctl net.ipv4.tcp_max_syn_backlog

应用自身 backlog 也必须同步设置。

27.7 内核参数管理

查看:

sysctl -a

配置:

/etc/sysctl.d/99-app.conf

应用:

sudo sysctl --system

示例方向:

net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.core.netdev_max_backlog = 16384

每个参数要写注释说明来源、适用条件、验证指标和回滚方式。

27.8 限流与隔离

在线服务:

核心接口
  -> 独立资源

离线任务
  -> 低优先级
  -> 独立时段
  -> IO / CPU 限制

systemd:

[Service]
CPUWeight=50
IOWeight=50
Nice=10
CPUQuota=50%

Kubernetes 使用 requests / limits、PriorityClass 和 dedicated node 隔离。

27.9 NUMA 与中断亲和

查看:

lscpu | grep NUMA
numactl --hardware
cat /proc/interrupts

适合优化:

  1. 高 PPS 网络服务;
  2. 数据库;
  3. 低延迟系统;
  4. 特定硬件加速场景。

必须评估:

  1. CPU 利用率分布;
  2. 跨 NUMA 内存;
  3. 中断分布;
  4. 弹性伸缩;
  5. 故障时的接管能力。

27.10 基准测试

工具:

场景 工具
HTTP wrk、wrk2、vegeta
CPU stress-ng
IO fio
内存 stream、stress-ng
网络 iperf3、sockperf

压测要点:

  1. 明确目标;
  2. 固定版本;
  3. 预热;
  4. 记录环境;
  5. 从低到高压;
  6. 找拐点;
  7. 观察错误率;
  8. 保留原始数据;
  9. 不压生产依赖。

27.11 变更与回滚

优化上线前:

[ ] 基线记录
[ ] 测试通过
[ ] 参数说明
[ ] 生效方式明确
[ ] 回滚命令
[ ] 监控看板
[ ] 灰度范围
[ ] 停止条件

配置管理示例:

- name: Tune somaxconn
  ansible.posix.sysctl:
    name: net.core.somaxconn
    value: "65535"
    sysctl_set: true
    reload: true

本章小结

性能调优必须以指标和瓶颈为依据。CPU、内存、IO 和网络的常见优化方向不同,但流程相同:目标、基线、假设、验证、灰度、回滚和沉淀。没有压测和监控的参数不建议进入生产。

思考题

  1. 为什么调优前必须建立基线?
  2. CPU throttling 应如何优化?
  3. IO 调优有哪些方向?
  4. 短连接高并发场景要关注什么?
  5. 设计一次服务容量压测方案。