Linux 性能监控与调优:从 CPU 到磁盘的完整实战

系统讲解 Linux 性能监控与调优:性能分析四件套(CPU/内存/IO/网络)、perf 采样剖析、CPU 亲和与进程优先级、内存参数与 swap 调优、IO 调度与 sysctl 内核参数、以及一套完整的性能排查方法论。

引言

服务「偶尔卡一下」、CPU 飙到 100%、内存缓慢爬升、磁盘 IO 成为瓶颈——性能问题往往不是单点,而是多个子系统相互作用。Linux 性能调优的正确姿势不是盲目调参数,而是遵循「监控 → 定位 → 分析 → 调优 → 验证」的闭环。

本文以性能分析四件套(CPU/内存/IO/网络)为主线,介绍 sar/perf 等采样工具,深入 CPU 亲和与进程优先级、内存与 swap 调优、IO 调度与内核参数(sysctl),最后给出一套可复用的性能排查方法论与典型调优模板。

前置:https://plumephp.com/linux-process-management/(进程监控基础)。内核原理参考 [[os]] 专题。


目录


1. 性能调优的闭环方法论

1.1 黄金流程

1. 建立基线(正常态的性能数据)
2. 发现问题(监控告警/用户反馈)
3. 定位瓶颈(四件套逐步缩小范围)
4. 分析根因(perf/sar 深入)
5. 实施调优(单一变量原则,一次只改一项)
6. 验证回归(对比基线,确认无副作用)

1.2 单一变量原则

一次只改一个参数,记录前后数据对比。同时改多个参数会无法判断是哪个生效、哪个引入问题。

1.3 先看数据再下结论

性能调优三问:
1. 慢在哪里?(哪个子系统)
2. 有多少余量?(当前使用率 vs 上限)
3. 改什么最划算?(性价比排序)

2. 性能四件套:CPU/内存/IO/网络

2.1 快速四命令

# CPU/负载
top -d 1
uptime            # load average

# 内存
free -h
vmstat 1 5

# IO
iostat -x 1 5

# 网络
sar -n DEV 1 5
ss -s

2.2 判断瓶颈的信号

子系统关键指标瓶颈信号
CPU%us + %sy 高、load 高持续 > 80% us+sy,runqueue 大
内存swap si/so 非零换入换出频繁 → 内存不足
IO%util、await%util > 80%、await 增长
网络丢包、重传、带宽吞吐接近上限、重传率高

2.3 load average 的正确解读

load = 等待 CPU 的运行队列长度(含不可中断 IO)
单核 load=1 满载;8 核 load=8 满载
判断标准 = load / 核数

3. sar:历史性能采样

3.1 为什么需要 sar

top/vmstat 只看当下,故障往往发生在过去
sar 持久采集历史数据,事后回放定位

3.2 安装与采集

apt install sysstat
systemctl enable --now sysstat    # 每 10 分钟采集一次

# 查看今日历史
sar -u          # CPU
sar -r          # 内存
sar -b          # IO
sar -n DEV      # 网络

# 查看某时刻
sar -u -f /var/log/sysstat/sa20260925

3.3 实战回放

# 找出 CPU 高峰时段
sar -u | sort -k5 -rn | head -5

# 对比内存与 swap
sar -r -S | head -20

4. perf:性能剖析器

4.1 perf 能做什么

# 采样 CPU 调用栈(定位热点函数)
perf top
perf record -g -p <pid> -- sleep 10
perf report

# 查看采样统计
perf stat -p <pid> -- sleep 5

4.2 定位热点示例

# 1. 记录目标进程 10 秒
perf record -g -p 1234 -- sleep 10

# 2. 生成报告,看哪条调用链耗时最多
perf report --stdio
# 火焰图可视化:perf script | flamegraph.pl

4.3 perf 的适用场景

场景工具
定位 CPU 热点函数perf top / record
统计事件(cache miss/分支预测)perf stat
追踪系统调用strace -p
磁盘/IO 事件iostat / blktrace

注意:perf 需要 root 权限,部分容器环境受限。


5. CPU 调优:亲和与优先级

5.1 CPU 亲和(taskset)

# 查看进程亲和
taskset -p <pid>

# 绑定到 0-3 核
taskset -pc 0-3 <pid>

# 启动时绑定
taskset -c 0-3 ./app

适用:对延迟敏感的进程(如数据库、计算密集任务),绑定核可减少上下文切换。

5.2 进程优先级(nice/renice)

# 查看优先级
ps -o pid,ni,pri,cmd

# 以较低优先级启动(nice 值越大优先级越低)
nice -n 10 ./backup.sh

# 调整运行中进程
renice -n 5 -p <pid>
nice 值说明
-20 到 19数值越小优先级越高
0默认
19最低(后台任务推荐)

5.3 实时调度(谨慎)

# 实时优先级(一般应用不建议)
chrt -r 99 -p <pid>

6. 内存调优:swap 与缓存

6.1 理解内存分配

free -h
#              total     used     free   shared  buff/cache
# Mem:          15G      8.0G     1.5G    200M     6.0G
# Swap:         2.0G      100M    1.9G

6.2 调整 swap 倾向(vm.swappiness)

# 查看当前
cat /proc/sys/vm/swappiness
# 默认 60;服务器建议 10-30(尽量少用 swap)

# 临时
sysctl vm.swappiness=10

# 永久
echo 'vm.swappiness = 10' >> /etc/sysctl.conf
sysctl -p

6.3 缓存与脏页

# 脏页回写阈值(默认大,突发写时 IO 高)
sysctl -w vm.dirty_ratio=20
sysctl -w vm.dirty_background_ratio=5

# 查看当前
sysctl vm.dirty_ratio vm.dirty_background_ratio

6.4 内存泄漏排查

# 观察 RSS 持续增长
watch -n2 'ps -p <pid> -o pid,rss,vsz,%mem'

# 定位占用 TOP
ps -eo pid,rss,cmd --sort=-rss | head -10

# 更精细:查看 /proc/<pid>/smaps
grep -E 'Rss:' /proc/<pid>/smaps | sort -k2 -rn | head

7. IO 调优:调度器与队列

7.1 查看与切换调度器

# 查看当前调度器
cat /sys/block/sda/queue/scheduler
# 输出示例: [mq-deadline] none

# 切换(临时)
echo none > /sys/block/sda/queue/scheduler

7.2 调度器选型

调度器适用
mq-deadline通用,兼顾读写(默认推荐)
none(NOOP)NVMe SSD、虚拟化环境(交给硬件/虚拟机)
kyber高 IOPS 场景

7.3 IO 队列与 readahead

# 调整队列深度(NVMe 常见)
echo 1024 > /sys/block/nvme0n1/queue/nr_requests

# 调整预读(顺序读优化)
blockdev --setra 4096 /dev/sda

7.4 定位 IO 瓶颈

iostat -x 1 5        # 看 %util、await
iotop                # 看哪个进程在 IO
pidstat -d 1         # 按进程看 IO 速率

8. sysctl 内核参数

8.1 查看与设置

# 查看所有可调参数
sysctl -a | grep -E 'tcp|vm'

# 临时设置
sysctl -w net.core.somaxconn=1024

# 永久设置
echo 'net.core.somaxconn = 1024' >> /etc/sysctl.conf
sysctl -p

8.2 常用调优参数速查

参数默认建议说明
vm.swappiness6010-30减少 swap
vm.dirty_ratio2020-30脏页上限
net.core.somaxconn1281024监听队列(高并发 Web)
net.ipv4.tcp_fin_timeout6030加速 TIME_WAIT 回收
net.ipv4.tcp_tw_reuse01复用 TIME_WAIT 连接
fs.file-max自动65535+最大打开文件数

8.3 高并发 Web 模板

# /etc/sysctl.conf 追加
net.core.somaxconn = 1024
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_keepalive_time = 600
fs.file-max = 65535
sysctl -p   # 生效

警告:sysctl 改动全局生效,改错可能影响所有进程。生产环境逐项小改、逐步验证。


9. 典型调优场景实战

9.1 场景一:Web 服务器 CPU 高但响应慢

现象:load 高、%us 高、网络吞吐上不去
排查:
1. top 定位高 CPU 进程
2. perf record -g 看调用栈
3. 若应用层无热点 -> 看上下文切换(vmstat cs 列)
调优:
- 减少不必要锁、降低切换
- CPU 亲和绑定热点线程
- 升级到更快 I/O(cache 友好)

9.2 场景二:数据库 IO 等待高

现象:%util > 80%、await 高、吞吐受限
排查:iostat -x 定位高 IO 设备与进程
调优:
- 调整调度器(NVMe 用 none)
- 提升磁盘 cache、增大预读
- 数据库层优化:索引/缓冲池/慢查询

9.3 场景三:内存在增长

现象:used 爬升、free 减少、swap 开始使用
排查:ps RSS 排序找泄漏进程,观察多窗口趋势
调优:
- 修复泄漏 / 重启回收
- 下调 swappiness,避免过早 swap
- 扩容或限制(systemd MemoryMax)

9.4 调优前后对比模板

# 调优前基线
vmstat 1 5 > before.txt
# 调优后
vmstat 1 5 > after.txt
# 对比关键列(cs/swap/si/so)

10. 总结:性能调优的心智模型

10.1 一句话心法

性能调优 = 先看数据(监控)→ 定位瓶颈(四件套)→ 单点调优(一次一项)→ 验证对比(回归基线)

10.2 优先级排序

1. 先治「明显问题」:泄漏、死锁、磁盘满
2. 再调「配置参数」:swappiness、somaxconn、调度器
3. 最后改「应用架构」:缓存、异步、连接池
(从廉价到昂贵,从快见效到需重构)

10.3 自检清单

检查项是否掌握
能用四件套快速定位瓶颈☐
能配置 sar 历史采集☐
能用 perf 定位热点☐
能理解 swappiness/调度器☐
能安全修改 sysctl 参数☐

延伸阅读

  • https://plumephp.com/linux-process-management/ — 进程监控基础
  • https://plumephp.com/linux-filesystem-disk/ — 磁盘与 IO 管理
  • https://plumephp.com/linux-network-commands/ — 网络与端口调优
  • [[os]] 专题 — 内核调度、内存与 IO 原理
  • Linux Performance(Brendan Gregg) — 性能分析全图
  • sysctl 官方文档 — 参数完整参考

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「linux」更多文章

  1. Linux 高级文件系统:XFS、Btrfs、ZFS 与存储进阶
  2. Linux 高可用与负载均衡:HAProxy、Keepalived 与集群方案
  3. Linux 防火墙与 nftables:规则集、链、NAT 与网络安全防护