# 性能分析:CPU、内存、IO ## 场景 服务器变慢,但不知道卡在 CPU、内存还是磁盘。 ## 前置条件 - 有 root 或 sudo - 装了 `sysstat`(sar/iostat)、`procps`(top/vmstat) - 知道业务高峰时段 ## 配置 ```bash dnf install -y sysstat perf # 实时总览 top # 按 1 看每核,按 c 看完整命令行 vmstat 1 10 # CPU pidstat -u 1 5 perf top # 内存 free -h vmstat -s # 磁盘 IO iostat -xz 1 5 iotop -o # 历史数据 sar -u 1 5 sar -r 1 5 sar -d 1 5 sar -n DEV 1 5 ``` 判断方向: | 现象 | 可能原因 | | --- | --- | | `us` 高 | 应用计算密集,看 `perf top` 的热点函数 | | `sy` 高 | 系统调用多,看是不是网络/文件操作太碎 | | `wa` 高 | 磁盘成瓶颈,看 `iostat -x` 的 `%util` 和 `await` | | 内存不足 | `swap` 使用增长、频繁 `si/so` | | `load` 高但 CPU 不高 | IO 等待或 D 状态进程,`ps aux | grep " D "` | ## 验证 ```bash sar -u -f /var/log/sa/sa今天 iostat -x 1 3 pidstat -d 1 5 ``` ## 回滚 只读操作,无副作用。`perf` 采集数据会占一点 CPU,跑完 Ctrl+C 即可。 ## 坑 - **只看 `top` 的第一行**,不看每核,单核打满会漏掉。 - `wa` 高不一定是磁盘坏,也可能是文件系统缓存不足。 - `free` 的 `available` 才是可用内存,别被 `free` 列吓到。 - `iostat -x` 的 `%util` 接近 100% 才是真饱和,`await` 高说明队列在排。 - `sar` 默认只保留 7 天,`/etc/sysconfig/sysstat` 里可以调。 - `perf` 需要 debuginfo 才能看到函数名,否则全是地址。