服务器变慢、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-n1>top_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 | 上下文切换次数 | 突然变高 → 检查是否线程过多 |
| wa | CPU 等待 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 可以随时释放给业务用,不用慌。
# 清理缓存(慎用,仅测试环境)sync&&echo3>/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| 字段 | 含义 | 异常值 |
|---|---|---|
| await | IO 平均等待时间(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 问题 → top(us/sy)+ vmstat(r) 内存问题 → free(available)+ vmstat(si/so) 磁盘问题 → iostat(%util/await)+ vmstat(wa) 历史问题 → sar 回看生产环境建议把sar采集开着,出问题时先看历史曲线,再结合当下命令定位,效率翻倍。
💡 觉得有用的话,点赞 + 关注【张老师技术栈】吧!