这是《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
方向:
- 优化算法和热点代码;
- 减少锁竞争;
- 调整线程数;
- 使用异步和非阻塞 IO;
- 增加缓存;
- 削峰限流;
- 扩容。
容器:
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
方向:
- 调整应用堆和缓存上限;
- 修复泄漏;
- 减少大对象;
- 控制并发;
- 使用流式处理;
- 扩容内存;
- 增加水位告警。
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
方向:
- 减少短连接;
- 使用连接池;
- 开启 keepalive;
- 增大 backlog;
- 修复丢包;
- 调整缓冲区;
- 优化协议和序列化;
- 扩容带宽。
监听队列:
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
适合优化:
- 高 PPS 网络服务;
- 数据库;
- 低延迟系统;
- 特定硬件加速场景。
必须评估:
- CPU 利用率分布;
- 跨 NUMA 内存;
- 中断分布;
- 弹性伸缩;
- 故障时的接管能力。
27.10 基准测试
工具:
| 场景 | 工具 |
|---|---|
| HTTP | wrk、wrk2、vegeta |
| CPU | stress-ng |
| IO | fio |
| 内存 | stream、stress-ng |
| 网络 | iperf3、sockperf |
压测要点:
- 明确目标;
- 固定版本;
- 预热;
- 记录环境;
- 从低到高压;
- 找拐点;
- 观察错误率;
- 保留原始数据;
- 不压生产依赖。
27.11 变更与回滚
优化上线前:
[ ] 基线记录
[ ] 测试通过
[ ] 参数说明
[ ] 生效方式明确
[ ] 回滚命令
[ ] 监控看板
[ ] 灰度范围
[ ] 停止条件
配置管理示例:
- name: Tune somaxconn
ansible.posix.sysctl:
name: net.core.somaxconn
value: "65535"
sysctl_set: true
reload: true
本章小结
性能调优必须以指标和瓶颈为依据。CPU、内存、IO 和网络的常见优化方向不同,但流程相同:目标、基线、假设、验证、灰度、回滚和沉淀。没有压测和监控的参数不建议进入生产。
思考题
- 为什么调优前必须建立基线?
- CPU throttling 应如何优化?
- IO 调优有哪些方向?
- 短连接高并发场景要关注什么?
- 设计一次服务容量压测方案。