性能调优方法论
不要一上来就改参数。先建立性能基线,用工具定位瓶颈,再针对性优化。USE 法(Utilization/Saturation/Errors)是排查的黄金法则。
1. 工具链速查
| 层面 | 工具 | 用途 |
|---|---|---|
| CPU | top / htop / mpstat / perf | 使用率、进程分布、火焰图 |
| 内存 | free / vmstat / smem | 使用率、Swap、OOM |
| 磁盘 I/O | iostat / iotop / blktrace | IOPS、吞吐、延迟 |
| 网络 | ss / netstat / iftop / tcpdump | 连接、流量、丢包 |
| 全栈 | atop / bcc / bpftrace | 全景性能指标 |
2. CPU 性能分析
# 查看 CPU 使用率
mpstat -P ALL 1 5
# 生成火焰图
perf record -F 99 -g -p ${PID} -- sleep 30
perf script | stackcollapse-perf.pl | flamegraph.pl > flame.svg
# 系统调用追踪
strace -c -p ${PID}
3. 内存优化
# 查看内存详情
free -h
cat /proc/meminfo | grep -E "^(MemTotal|MemFree|Buffers|Cached|SwapTotal|SwapFree)"
# 调整 Swap 倾向(0-100,越小越不用 Swap)
sysctl vm.swappiness=10
# 查看 OOM 日志
dmesg | grep -i "killed process"
4. 磁盘 I/O 调优
# 查看磁盘 I/O
iostat -x 1 3
# 调整 I/O 调度器
echo mq-deadline > /sys/block/sda/queue/scheduler
# 或对于 NVMe SSD
echo none > /sys/block/nvme0n1/queue/scheduler
# 调整读缓存
sysctl vm.dirty_ratio=10
sysctl vm.dirty_background_ratio=5
5. 内核参数优化
# /etc/sysctl.conf 常用优化
# TCP 优化
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_tw_reuse = 1
# 文件描述符限制
fs.file-max = 2097152
fs.nr_open = 2097152
# 内存管理
vm.overcommit_memory = 1
vm.swappiness = 10
# 应用配置
sysctl -p # 重新加载
6. bpftrace 实战
# 追踪文件打开调用
bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s %s\n", comm, str(args->filename)); }'
# 统计系统调用耗时分布
bpftrace -e 'kprobe:vfs_read { @start[tid] = nsecs; } kretprobe:vfs_read /@start[tid]/ { @us = hist((nsecs - @start[tid]) / 1000); delete(@start[tid]); }'
总结
性能调优不是玄学,而是一套系统化的工程方法。先用工具定位瓶颈,用数据说话,小步迭代验证效果。记住:过早优化是万恶之源,但不优化则是走向灾难。