「零壹运维 · 零到壹,永不宕」
服务器卡住了、CPU 暴涨、磁盘 IO 异常、网络不通……遇到这些问题,你第一时间会怎么排查?
本文系统梳理 Linux 最常用的 5 大故障排查工具:top、htop、iostat、vmstat、netstat,每个工具的核心参数和实战用法一网打尽,帮你建立一套标准的排查思路。
一、工具速查表
| | |
|---|
| top | | P |
| htop | | F6 |
| iostat | | -x |
| vmstat | | 1 5 |
| netstat | | -tulpn |
二、top / htop:进程和 CPU/内存排查
2.1 top 常用操作
top
核心指标解读:
| |
|---|
load average | 系统负载(1分钟/5分钟/15分钟),超过核心数说明压力山大 |
%Cpu(s): us | |
%Cpu(s): sy | |
%Cpu(s): id | |
MiB Mem / %Mem | |
RES | |
%CPU | |
COMMAND | |
快捷键:
2.2 htop:top 的增强版
htop
相比 top 的优势:
快捷键:
2.3 实战场景
场景 1:CPU 飙高
top # 找到 CPU 占用最高的进程
- 如果是用户进程(
us 高):检查业务代码是否有死循环、计算密集操作 - 如果是系统进程(
sy 高):可能是频繁系统调用、上下文切换,用 vmstat 进一步看 cs(上下文切换次数)
场景 2:内存不足
top # 按 M 按内存排序
- 如果
available 接近 0,考虑释放缓存或增加内存
三、iostat:磁盘 IO 排查
3.1 基础用法
# 显示所有磁盘每秒 IO 状态,每 1 秒刷新
「零壹运维 · 零到壹,永不宕」
iostat -d -x 1
核心指标解读:
| |
|---|
%util | |
await | 平均 IO 响应时间(毫秒),SSD 应在 10ms 以内,HDD 在 20ms 以内 |
svctm | |
r/s | |
w/s | |
rkB/s | |
wkB/s | |
3.2 实战场景
场景:磁盘 IO 成为瓶颈
iostat -d -x 1
- 如果
%util 持续 > 80%,且 await 很高(> 50ms),说明磁盘 IO 是瓶颈 - 结合
top 确认是哪个进程在大量读写(top 按 d 输入设备名可以显示该设备的 IO)
四、vmstat:系统整体资源统计
4.1 基础用法
# 每秒采样一次,采样 5 次
「零壹运维 · 零到壹,永不宕」
vmstat 1 5
核心指标解读:
| |
|---|
r | 等待运行的进程数(超过 CPU 核心数说明 CPU 紧张) |
b | |
swpd | |
si | |
so | |
bi | |
bo | |
in | |
cs | 每秒上下文切换次数(过高可能是频繁创建/销毁线程或锁竞争) |
us/sy/id/wa | |
4.2 实战场景
场景 1:频繁 swap
vmstat 1 5
- 如果
swpd 不为 0,且 si/so 有数值,说明内存不足,系统在频繁使用 swap
场景 2:上下文切换过高
vmstat 1 5
- 如果
cs 持续很高(如 > 10000),可能原因:
五、netstat:网络排查
注意:现代 Linux 推荐使用 ss 替代 netstat,但 netstat 仍然广泛使用。
5.1 基础用法
# 查看所有监听的 TCP 端口
「零壹运维 · 零到壹,永不宕」
netstat -tlnp
# 查看所有网络连接
「零壹运维 · 零到壹,永不宕」
netstat -an
# 查看指定端口是否被占用
「零壹运维 · 零到壹,永不宕」
netstat -tlnp | grep 8080
参数含义:
5.2 输出解读
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1234/sshd
tcp 0 0 192.168.1.100:54321 10.0.0.1:443 ESTABLISHED 5678/curl
| |
|---|
Recv-Q | |
Send-Q | |
Local Address | |
Foreign Address | |
State | 连接状态:LISTEN(监听)、ESTABLISHED(已建立)、TIME_WAIT(等待关闭) |
5.3 实战场景
场景 1:检查端口是否被占用
netstat -tlnp | grep 8080
如果有输出,说明端口已被占用,PID/Program name 列显示占用进程。
场景 2:TIME_WAIT 连接过多
netstat -an | grep TIME_WAIT | wc -l
- TIME_WAIT 是 TCP 正常关闭后的状态,大量堆积可能原因:
- 解决:开启 SO_REUSEADDR、调整
net.ipv4.tcp_tw_reuse 和 net.ipv4.tcp_tw_recycle 参数
六、完整排查思路
遇到服务器异常,按以下顺序排查:
1. 先看整体负载
├── top / htop → CPU、内存、负载是否异常
└── vmstat 1 5 → 系统整体资源趋势
2. 定位瓶颈
├── CPU 高? → top 按 P 排序找进程
├── 内存高? → top 按 M 排序、检查 swap
├── 磁盘 IO 高? → iostat -d -x 1
└── 网络? → netstat 检查连接、流量
3. 深入分析
├── 查看进程日志
├── 检查业务代码逻辑
└── 结合系统日志(/var/log/messages、dmesg)
七、最佳实践
| |
|---|
| |
vmstat 1 5 | |
iostat -x | |
netstat -tlnp | |
| |
八、总结
Linux 故障排查的核心是从整体到局部,从现象到根因:
这五个工具是每个运维工程师的必备技能,熟练掌握后,服务器出问题时你就能快速定位、从容应对。
下一篇文章我们聊聊 Shell 脚本实战:日常运维必备脚本大全,敬请期待!