线上服务器突然变慢,CPU飙高、内存吃紧、磁盘IO打满、网络异常——这些都是运维人日常面对的"经典场景"。掌握Linux性能监控四大神器:top、vmstat、iostat、netstat,能帮你快速定位问题根因。本文从实战角度,逐一拆解这四个工具的核心用法。
一、top:实时进程与系统资源监控
top是Linux下最常用的实时监控工具,它以交互式界面展示系统整体负载和各进程资源占用情况。
1.1 核心输出解读
top - 14:23:01 up 30 days, 3:21, 2 users, load average: 0.52, 0.38, 0.31
Tasks: 128 total, 1 running, 127 sleeping, 0 stopped, 0 zombie
%Cpu(s): 12.5 us, 3.2 sy, 0.0 ni, 83.1 id, 1.2 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 7852.0 total, 2341.2 free, 3829.5 used, 1681.3 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 3215.4 avail Mem
关键指标解读:
- load average:1/5/15分钟平均负载。经验值:不超过CPU核心数。4核机器,持续高于4就要警惕。
- %Cpu(s) us:用户态CPU占比。持续高于70%说明有计算密集型进程。
- %Cpu(s) sy:内核态CPU占比。过高(>30%)说明系统调用频繁,可能是IO或锁竞争。
- %Cpu(s) wa:IO等待占比。这是排查磁盘瓶颈的关键指标,持续高于5%说明磁盘IO是瓶颈。
- %Cpu(s) id:空闲CPU。低于20%需要关注。
1.2 常用交互快捷键
| 快捷键 | 功能 |
|---|---|
| P | 按CPU使用率排序 |
| M | 按内存使用率排序 |
| 1 | 展开/折叠多核CPU视图 |
| c | 显示完整命令行 |
| k | 输入PID终止进程 |
| q | 退出 |
1.3 实战:找出占用CPU最高的进程
# 批处理模式输出,取前10个进程
top -b -n 1 | head -20
# 只看某个用户的进程
top -u nginx
# 指定刷新间隔为2秒
top -d 2
实战技巧:遇到CPU飙高,先按P排序找到占CPU最高的进程PID,再用 strace -p PID 查看系统调用,或用 perf top -p PID 分析热点函数。
二、vmstat:虚拟内存与系统状态统计
vmstat以简洁的表格形式展示CPU、内存、IO和系统的综合状态,特别适合做趋势分析。
2.1 基本用法
$ vmstat 1 5 # 每秒采样1次,共5次
procs -----------memory---------- ---cpu-- ---io---
r b swpd free buff cache si so bi bo us sy id wa st
2 0 0 2341200 1681300 3829500 0 0 12 18 12 3 83 1 0
1 0 0 2341100 1681300 3829600 0 0 0 0 15 4 80 1 0
3 0 0 2340900 1681300 3829700 0 0 0 24 25 6 68 1 0
2.2 核心列解读
| 列名 | 含义 | 异常判断 |
|---|---|---|
| r | 运行队列中的进程数 | 持续大于CPU核心数,CPU饱和 |
| b | 阻塞在IO上的进程数 | 持续大于0,磁盘IO瓶颈 |
| swpd | 已使用的swap大小 | 持续增长说明内存不足 |
| si/so | swap换入/换出速率 | 非零说明内存压力严重 |
| bi/bo | 每秒读/写块数 | 结合wa判断IO方向 |
| us/sy | 用户/内核态CPU | us高=应用问题,sy高=系统问题 |
| wa | IO等待CPU占比 | >5%需关注磁盘性能 |
| id | 空闲CPU | <20%需要扩容 |
2.3 实战场景:内存泄漏排查
# 持续监控swap和内存变化
vmstat 1 60 | awk '{print strftime("%H:%M:%S"), $3, $4, $5, $6}'
# 如果swpd持续增长且si/so非零,说明物理内存不足
# 结合以下命令定位内存占用最高的进程
ps aux --sort=-%mem | head -10
排查思路:r高+b高 → CPU和IO双重瓶颈;si/so持续非零 → 内存不足正在使用swap;wa高+bi/bo高 → 磁盘IO瓶颈。
三、iostat:磁盘IO性能统计
iostat是分析磁盘IO性能的利器,能精确到每块磁盘的读写吞吐和延迟。
3.1 安装与基本用法
# 安装
yum install -y sysstat # CentOS/RHEL
apt install -y sysstat # Ubuntu/Debian
# 基本用法:每秒采样,显示扩展统计
iostat -x 1
# 只看磁盘,不看CPU
iostat -d -x 1 3
3.2 扩展统计输出
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 0.02 1.50 0.15 2.80 3.2 17.2 13.8 0.03 2.1 0.8 0.24
sdb 0.00 0.20 0.05 0.30 0.8 1.2 5.6 0.01 1.5 0.5 0.18
3.3 关键指标判断标准
| 指标 | 含义 | 健康范围 | 告警阈值 |
|---|---|---|---|
| %util | 磁盘利用率 | <60% | >80%持续则瓶颈 |
| await | IO平均等待时间(ms) | <10ms | >20ms需关注 |
| svctm | 平均服务时间(ms) | <5ms | >10ms硬件问题 |
| r/s + w/s | 每秒IO次数(IOPS) | 看磁盘规格 | SSD>10K, HDD>200 |
| avgqu-sz | 平均队列长度 | <2 | >3需关注 |
3.4 实战:定位磁盘IO瓶颈
# 查看哪块磁盘负载高
iostat -x 1 5
# 结合pidstat找出哪个进程在疯狂读写磁盘
pidstat -d 1
# 查看磁盘队列深度
iostat -x 1 | grep -E "Device|sda"
# 如果%util高且await高:
# 1. 检查是否有大量随机IO(数据库、日志)
# 2. 考虑升级到SSD或NVMe
# 3. 调整IO调度器:echo noop > /sys/block/sda/queue/scheduler
关键判断:%util高但await低 → 磁盘满载但响应快,可接受;%util高且await也高 → 磁盘确实存在性能瓶颈,需要优化或升级。
四、netstat/ss:网络连接与端口监控
netstat用于查看网络连接、路由表、接口统计等。在现代Linux中,推荐使用更快的ss命令。
4.1 常用netstat命令
# 查看所有TCP监听端口
netstat -tlnp
# 查看所有TCP连接及状态
netstat -ant
# 统计各状态的TCP连接数
netstat -ant | awk '{print $6}' | sort | uniq -c | sort -rn
# 查看某个端口的连接情况
netstat -an | grep :80 | wc -l
4.2 ss命令(推荐替代)
# 查看所有TCP监听端口(比netstat快10倍以上)
ss -tlnp
# 查看所有TCP连接
ss -ant
# 统计各状态连接数
ss -ant | awk '{print $1}' | sort | uniq -c | sort -rn
# 查看某个端口的连接数
ss -ant | grep :80 | wc -l
# 查看socket统计摘要
ss -s
4.3 TCP连接状态分析
| 状态 | 含义 | 异常判断 |
|---|---|---|
| LISTEN | 等待连接 | 正常 |
| ESTABLISHED | 已建立连接 | 数量异常多需排查 |
| TIME_WAIT | 连接关闭等待 | 过多需调整内核参数 |
| CLOSE_WAIT | 被动关闭等待 | 过多说明应用未正确关闭连接 |
| SYN_RECV | 收到SYN等待ACK | 过多可能是SYN Flood攻击 |
4.4 实战:排查TIME_WAIT过多
# 查看TIME_WAIT数量
ss -ant | grep TIME-WAIT | wc -l
# 如果TIME_WAIT超过数千个,调整内核参数:
cat >> /etc/sysctl.conf << 'EOF'
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_max_tw_buckets = 5000
EOF
sysctl -p
CLOSE_WAIT过多排查:这通常是应用代码bug——服务端发送FIN后,应用没有调用close()。需要检查应用的连接池配置和超时处理逻辑。使用 lsof -i:端口 定位是哪个进程。
五、综合实战:服务器变慢排查流程
当服务器响应变慢,按以下流程快速定位:
第一步:看整体负载
# 一眼看全局
uptime
# load average: 5.2, 4.8, 3.1 (8核机器,已超载)
第二步:CPU分析
# 看CPU分布
top -b -n 1 | head -5
# 重点看 us/sy/wa/id
# us高 → 找进程:top -b -n 1 | sort -k9 -rn | head
# wa高 → 转到磁盘IO分析
第三步:内存分析
# 看内存和swap
free -h
vmstat 1 5
# swap使用 → 内存不足,找进程:ps aux --sort=-%mem | head
第四步:磁盘IO分析
# 看磁盘负载和延迟
iostat -x 1 3
# %util高+await高 → 磁盘瓶颈
# 找进程:pidstat -d 1
第五步:网络分析
# 看连接数和网络状态
ss -s
ss -ant | awk '{print $1}' | sort | uniq -c | sort -rn
# TIME_WAIT/CLOSE_WAIT异常 → 调内核参数或排查应用
六、总结:监控速查表
| 问题现象 | 首选工具 | 关键指标 | 排查方向 |
|---|---|---|---|
| CPU飙高 | top | us/sy | 找进程→strace/perf |
| 系统变慢 | vmstat | r/b/wa | r高=CPU,b高=IO |
| 磁盘慢 | iostat -x | %util/await | 升级SSD/优化IO |
| 连接异常 | ss -ant | TIME_WAIT等 | 调内核参数/查应用 |
| 内存不足 | free/vmstat | swap si/so | 加内存/查泄漏进程 |
掌握这四大工具,结合系统化的排查思路,90%以上的Linux性能问题都能快速定位。建议在服务器正常时多做基线记录,出问题时才能快速对比发现异常。
相关推荐: