sar、iostat、vmstat 和 mpstat 组合使用可全面监控 linux 系统性能:sar 查 cpu/内存/磁盘历史与实时,iostat 分析磁盘 i/o 性能,vmstat 观察进程调度与内存交换,mpstat 定位多核 cpu 负载不均衡。

Linux 系统性能监控中,sar、iostat、vmstat 和 mpstat 各有侧重,组合使用才能全面覆盖 CPU、内存、磁盘 I/O、网络(间接)、进程调度和多核负载。下面给出一套实用、可复用的监控组合模板,兼顾实时观测与历史回溯能力。
基础组合:5秒级实时诊断(适合线上问题快速定位)
当系统响应变慢、CPU 占用异常或服务卡顿时,用以下命令并行观察:
- sar -u 5 3 —— 每5秒采样1次,共3次,看整体 CPU 使用率(%user/%system/%iowait/%idle),重点关注 %iowait 是否持续 >10%
- iostat -x 5 3 —— 同步采样,重点看 %util(设备饱和度)、await(I/O 平均等待毫秒)、r_await/w_await、svctm(已弃用,但可辅助判断队列深度);若 %util 接近 100% 且 await 显著升高,说明磁盘瓶颈
- vmstat 5 3 —— 关注 r(运行队列长度)、b(阻塞进程数)、si/so(swap 进出 KB/s)、bi/bo(块设备读写 KB/s);r > CPU 核心数 × 2 或 so > 0 是严重信号
- mpstat -P ALL 5 3 —— 查看每颗逻辑 CPU 的使用分布,识别是否单核打满(如某 core %usr 达 95%+ 而其余 idle),排除不均衡调度或绑核问题
长期趋势采集:用 sysstat 后台守护 + 定时归档
确保 sysstat 已启用(ubuntu/debian 默认安装,RHEL/centos 需 yum install sysstat && systemctl enable sysstat),它会自动每10分钟运行 sar 并保存二进制数据到 /var/log/sysstat/。
- 每日凌晨自动轮转日志:
/etc/cron.d/sysstat中默认配置已包含 - 查看昨日全天 CPU 负载峰值:
sar -u -f /var/log/sysstat/sa$(date -d yesterday +%d) - 导出某日磁盘延迟趋势为 CSV(便于 excel 分析):
sar -d -f /var/log/sysstat/sa15 | grep -v 'Average|Linux' | awk '{print $1","$8","$9","$10}' > io-20240415.csv($8=await, $9=r_await, $10=w_await)
针对性排查场景速查表
根据现象快速选择组合子集:
- 高负载但 CPU idle 高 → 优先
vmstat 1看 r/b 列;若 r 大 b 小,可能是大量短时进程竞争;若 b 大,检查 I/O 或锁(如lsof +D /data) - 数据库响应慢 + iowait 高 →
iostat -x 1确认是哪块盘(如 nvme0n1);再pidstat -d 1找出 top I/O 进程;结合iotop -o实时验证 - Java 应用 GC 频繁 + 内存不足迹象 →
vmstat 2看 si/so 是否非零;sar -r 2查 %memused 和 kbmemfree;再用free -h和cat /proc/meminfo | grep -E "Active|Inactive|Swap"细查页回收状态 - 容器环境 CPU 使用率“虚高” →
mpstat -P ALL 1对比宿主机各核与容器内 top -H 输出线程绑定关系;注意 cgroup 限频导致的 %steal 升高(Xen/KVM 虚拟化下常见)
进阶技巧:一次命令聚合关键指标
避免反复敲多个命令,可用 shell 函数封装(加入 ~/.bashrc):
perfwatch() { echo "== CPU =="; mpstat -P ALL 1 2 | tail -n 2 echo -e "n== MEM/IO =="; vmstat 1 2 | tail -n 1 echo -e "n== DISK X =="; iostat -x 1 2 | grep -E "(nvme|sda|vda)|await" | tail -n +2 }
执行 perfwatch 即输出精简版四维快照,适合运维巡检或交接班记录。