服务器变慢、CPU 飙高、磁盘打满怎么定位Linux 自带全家桶监控命令top、vmstat、iostat、free、sar。这篇全部实战演示。一、top实时看 CPU 和内存top# 按 1 看每个 CPU 核# 按 P 按CPU排序 按 M 按内存排序 按 q 退出关键信息解读%Cpu(s): us 用户态占用高说明在跑业务 sy 系统态占用高说明系统调用多 id 空闲越低越忙 wa 等待IO高说明磁盘是瓶颈 si/so 换入换出大于0说明内存不足 %MEM 那一列是进程内存占用RES 是实际物理内存# 只刷新关键进程top-p12345# 输出重定向到文件排查历史top-b-n1top_snapshot.txt二、vmstat综合性能工具vmstat15# 每1秒采样共5次procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 0 208188 2140 4561260 0 0 0 0 1880 3720 1 1 98 0 0关键字段字段含义异常值r运行队列长度等待CPU的进程数持续 CPU核数 → CPU 不够b阻塞进程数等待IO持续 0 → 磁盘瓶颈si/so交换内存换入换出 0 → 物理内存不足bi/bo块设备读写大 → 磁盘繁忙cs上下文切换次数突然变高 → 检查是否线程过多waCPU 等待 IO 30% → 磁盘是瓶颈# 判断是否 CPU 瓶颈vmstat1# 看 r 列如果经常 CPU核数说明 CPU 处理不过来# 判断是否内存瓶颈# 看 si/so 列只要持续大于0先加内存三、free内存使用free-htotal used free shared buff/cache available Mem: 7.6G 2.1G 208M 845M 5.3G 5.2G Swap: 2.0G 0B 2.0G注意available才是真正可用内存free空闲那栏很小但 buff/cache 可以随时释放给业务用不用慌。# 清理缓存慎用仅测试环境syncecho3/proc/sys/vm/drop_caches四、iostat磁盘性能iostat-x1# 扩展模式每秒一次Device r/s w/s rkB/s wkB/s await %util sda 12.5 18.2 512.3 901.2 8.5 35.2字段含义异常值awaitIO 平均等待时间(ms) 50ms → 磁盘太慢%util设备忙的时间占比 80% → 磁盘瓶颈r/s w/s每秒读写次数结合 IOPS 判断# 检查是否磁盘瓶颈iostat-x1# %util 长期 80%或 await 50ms → 该上 SSD / 加读写分离了五、sar查看历史性能重点top 只能看当下排查线上问题需要看历史# 查看昨天全天 CPU 使用率sar-u-f/var/log/sa/sa10# 实时查看网络流量sar-nDEV1# 查看内存历史sar-r-f/var/log/sa/sa10六、完整排查流程服务器变慢第一步按顺序看 1. top → 谁在占 CPU/内存按 P / 按 M 排序 2. vmstat 1 → 是 CPU(r) 还是磁盘(b/wa) 还是内存(si/so) 瓶颈 3. free -h → available 是否告急 4. iostat -x → 磁盘 %util / await 5. sar → 回看历史找突变时间点 定位到进程后 ps aux | grep pid 看进程详情 top -Hp pid 看线程占用 jstack pid 如果是Java程序看线程栈总结监控命令搭配记忆CPU 问题 → topus/sy vmstatr 内存问题 → freeavailable vmstatsi/so 磁盘问题 → iostat%util/await vmstatwa 历史问题 → sar 回看生产环境建议把sar采集开着出问题时先看历史曲线再结合当下命令定位效率翻倍。 觉得有用的话点赞 关注【张老师技术栈】吧