Linux性能监控与故障排查实战:top扶手、vmstat、iostat与ss定位瓶颈


一、服务器慢/卡,先别急着重启

"网站突然变慢""SSH 敲命令很卡""CPU 飙高不下",这是运维里最高频的诉求。很多人第一反应是重启,但重启只是掩盖问题,问题会反复出现。正确姿势是:现象 → 定位 → 归因 → 处置。Linux 自带一套强大的命令行性能观测工具,下面用一套"事件驱动"的思路,讲清楚如何用 top/vmstat/iostat/free/ss/pidstat 等命令一步步揪出瓶颈,而不是靠猜。

二、第一眼定级:uptime 与 top

先看系统负载和进程概貌:

uptime            # 输出 1/5/15 分钟平均负载 Load Average
top               # 动态查看 CPU/内存/进程
```
top - 10:20:01 up 12 days, 5:12, 2 users, load average: 3.61, 3.20, 2.80
Tasks: 210 total,   1 running ...
%Cpu(s): 62.5 us, 30.0 sy,  7.5 ni,  0.0 id ...
KiB Mem :  8169172 total,  1324000 free ...
```

Load average 三个数的解读有个误区:它不代表禁用词"CPU 使用率",而是"处于可运行或不可中断状态的进程数"。判断负载是否过高要结合 CPU 核数——8 核机器 load 4 很正常,2 核机器 load 4 就已饱和。top 里注意 us(用户态)、sy(内核态)、wa(I/O 等待),其中 wa 偏高往往指向磁盘或内存 Swap 问题。按 CPU 排序:进入 top 后按 Shift+P;按内存排序按 Shift+M;1 查看每核使用率;x 高亮当前排序列。

三、细分 CPU 与进程:pidstat / mpstat

需要精确到每个进程或每个内核的 CPU 消耗时,用 sysstat 家族的 pidstat 和 mpstat(Debian/Ubuntu 装 sysstat):

# 每个 CPU 的使用率(每秒刷新,共 3 次)
mpstat -P ALL 1 3

# 每个进程的 CPU 与内存占比,每 1 秒采样 5 次
pidstat -u -r 1 5

# 看某个进程及其线程的 CPU
pidstat -t -p PID 1 3

如果 us 高,找 pidstat 里的高热进程,多半是业务代码死循环或计算密集任务;如果 sy 高,通常是频繁系统调用(如大量文件读写、上下文切换),配合 pidstat -w 1 5 观察 cswch 上下文切换频率。

四、内存与 Swap:free 的正确理解

Linux 内存使用率容易被 free 的显示误导,很多新手看到 "used 7G" 吓一跳,其实其中大部分是缓存(buff/cache)可回收。正确看内存:

free -h
# 关键: Mem 行的 total/used/available;available 才是"还能用多少"
# 以及 Swap 行是否压力大

判断是否内存不足:看 available 长期告急,或 Swap 的 si/so 持续非零(说明在频繁换页)。用 vmstat 看整体:

vmstat 1 5
# procs 的 r(运行队列)/b(阻塞)
# memory 的 si/so(swap in/out)
# cpu 的 us/sy/wa/id

若 r 远高于 CPU 核数 = CPU 饱和;若 b 或 wa 偏高 = 磁盘 I/O 瓶颈;si/so 非零 = 内存吃紧在换页。r 才是判断 CPU 是否忙的最关键指标。

五、磁盘 I/O:iostat 与 df

网站卡顿除了 CPU 和内存,磁盘 I/O 也常被忽略。iostat 看设备负载、df 看容量:

df -h                              # 磁盘容量,别写到 100%
iostat -x 1 3                      # 磁盘详细 I/O:%util、await、svctm
# %util 高说明设备繁忙;await 高说明排队等待久(可能是磁盘慢)

数据库场景写多,I/O 瓶颈尤其常见。若 %util 持续很高但实际吞吐不大,可能是随机小 IO 太碎(如频繁 fsync 的小事务),可考虑把日志放 SSD 或调低 sync 频率。排查日志写入风暴也可用 iotop -P(需 root)直接看每个进程的磁盘读写速率。

六、网络与连接数:ss 结合排查

连接数被打满、端口异常,用 ss(替代已被逐步淘汰的 netstat):

ss -tlnp                            # 所有监听端口的进程
ss -s                               # socket 汇总:TCP 连接状态计数
ss -tan state established | wc -l   # 当前已建立连接数
ss -tan state time-wait | wc -l     # TIME_WAIT 数

TIME_WAIT 异常增多常见于高并发短连接场景,可通过开启 TCP time_wait 重用合理缓解;SYN 队列被打满则常是 SYN Flood 或服务线程不足。结合 netstat -s 看 TCP 重传、丢包统计,能快速判断网络质量。若大量连接集中在某端口,再回头看该服务的并发处理能力。

七、综合诊断:一次慢查询实战串联

把上面工具串起来,一次"网站突然变慢"的排查流程:

# 1. 看负载与整体
uptime; top -bn1 | head -20
# 2. 判断是 CPU / 内存 / IO
vmstat 1 5
# 3. IO / 进程 深挖
iostat -x 1 3; pidstat -u 1 5
# 4. 若是 Web,结合 Nginx access 日志和数据库慢查询(前面文章已讲)
tail -n 100 /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head

最后根据归因下手:CPU 高→优化代码或加核;内存紧张→调 buffer/参数或升配;IO 高→换 SSD 或优化 SQL;连接多→调 max_connections。这套"先定级、再细分、后归因"的节奏,能让排查不再靠猜,快速收敛到真正的根因。

写在最后

性能监控不是把一堆命令背下来,而是建立一套"观察→假设→验证"的方法。核心抓手就三个:负载/运行的进程数量(top、vmstat 的 r)、内存可用量(free 的 available、vmstat 的 si/so)、磁盘与网络的忙闲(iostat 的 %util、ss 的 TCP 计数)。记住 free 高 used 要看 available、load 要跟核数比、wa 高指向 IO、r 高指向 CPU。能稳定地完成"定位-归因",你才真正把服务器的健康状况握在了自己手里,而不是每次遇到问题只会按重启键。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

VPS服务器选购避坑指南:内存内存NVM带宽线路配置怎么选

Linux服务器防火墙实战:iptables与firewalld规则配置与排错全解

评 论
更换验证码