14 10 月 2026

服务器卡顿时,90% 的人第一反应是 top 看一眼 CPU,看到不高就说「不是服务器问题」。这是最常见的误判——CPU 不高但卡,往往是 IO、内存或网络的问题。

这篇把 top、vmstat、iostat 三个工具讲透,附一张「症状 → 工具 → 指标」对照表,从此排查不靠猜。

需要云服务器可以看看财富云计算:一键开服面板,NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上,主流游戏快速部署。

一、排查总纲:先定位瓶颈类型

服务器只有四个资源:CPU、内存、磁盘 IO、网络。任何卡顿都是其中一个(或组合)到顶了。

卡顿 → 看是哪种瓶颈
├── CPU 满载    → top (us/sy/wa 哪项高)
├── 内存不足    → free (available 低? swap 在用?)
├── 磁盘 IO 慢  → iostat (util%, await)
└── 网络打满    → iftop / ss

核心心法:不要只看一个指标。top 的 wa(IO 等待)高,说明 CPU 在等磁盘——这时候 CPU 使用率可能不高,但系统就是卡。工具组合着看。

二、top:CPU 与进程

交互界面怎么看

top - 21:30:00 up 5 days, load average: 2.50, 1.80, 1.20
Tasks: 120 total,   1 running, 119 sleeping
%Cpu(s):  8.5 us,  3.2 sy,  0.0 ni, 85.0 id,  2.8 wa,  0.0 hi,  0.5 si
MiB Mem :   3800 total,    200 free,   800 used,  2800 buff/cache
MiB Swap:   2048 total,   1024 free,   1024 used.   1500 avail Mem
指标含义警惕值
load average1/5/15 分钟平均等待进程数> CPU 核数持续 = 过载
us用户态 CPU(你的程序)高 = 程序吃 CPU
sy系统态 CPU(内核)高 = 系统调用多/中断多
waIO 等待> 20% = 磁盘是瓶颈
id空闲—
buff/cache缓存(可回收,不是浪费)—
avail Mem真正可用内存低 = 内存紧张
Swap usedswap 使用持续增长 = 内存不够

常用交互命令

1        # 展开每个 CPU 核心(多核必看!)
P        # 按 CPU 排序(默认)
M        # 按内存排序
e/E      # 切换内存单位
c        # 显示完整命令行
H        # 显示线程

多核必须按 1:4 核机器,单核 100% 但总使用率 25%,top 显示不高,实际已经有一个核心打满了。游戏服单线程吃满一个核很常见。

非交互用法(脚本里)

# 快照模式
top -bn1 | head -20

# 只看进程排序
top -bn1 -o %CPU | head -15

# 配合 watch 实时刷新
watch -n 2 'top -bn1 -o %CPU | head -15'

三、vmstat:系统整体健康度

vmstat(virtual memory statistics)是最被低估的工具——一行输出看穿 CPU、内存、IO、中断全貌。

# 每秒采样一次,共 5 次
vmstat 2 5

输出解读:

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  1   1024    200   800  2800     5    2    50    80   500  800  8  3 85  4  0
列含义判读
r运行队列进程数> CPU 核数 = CPU 不够
b不可中断睡眠(等 IO)持续 > 0 = IO 瓶颈
swpdswap 用量持续增长 = 内存泄漏
si/soswap 换入/换出持续非 0 = 内存真不够,在硬扛
bi/bo块设备读写(块/秒)突增 = 大量磁盘 IO
in/cs中断/上下文切换cs 暴涨 = 进程切换频繁(线程问题)
us/sy/id/waCPU 各项同 top

最经典的判读:b 列持续大于 0、wa 大于 20%,磁盘 IO 是瓶颈,这时候升级 CPU 没用,换 SSD 才有用。

内存专项:

# si/so 持续非 0,是内存不足的实锤
vmstat 2 10 | awk 'NR>2 {print "si="$7, "so="$8}'

四、iostat:磁盘 IO 细节

# 安装
apt install -y sysstat    # Debian/Ubuntu
yum install -y sysstat    # CentOS

# 每 2 秒一次,看每个设备
iostat -x 2 5

输出解读:

Device  r/s     w/s   rkB/s   wkB/s  rrqm/s wrqm/s  %util  await  r_await w_await
vda     50.0   100.0  2000.0  4000.0   5.0   10.0   85.0   12.5     5.0    15.0
指标含义警惕值
%util设备繁忙百分比> 80% = 磁盘饱和
awaitIO 平均等待(ms)SSD > 10ms / 机械盘 > 50ms 有问题
r/s + w/s每秒 IOPS机械盘 100–200,SSD 数千
rkB/s + wkB/s吞吐对比磁盘标称速度
svctm服务时间—

%util 100% + await 高 = 磁盘瓶颈实锤。这时候:

  • 机械盘 → 换 SSD(提升最大)
  • 优化程序:减少随机小 IO、加缓存(Redis)
  • 把日志、备份这类非关键 IO 错峰

专项:看哪个进程在吃 IO

# iotop(需要安装)
apt install -y iotop
iotop -oP    # -o 只显示有 IO 的进程,- 显示线程

# 没有 iotop 时的替代
pidstat -d 2 5    # sysstat 包自带

五、三工具组合诊断表

这是本文的核心,症状对号入座:

症状看什么指标特征根因与解法
CPU 高,程序慢topus 高,单核 100%程序计算密集:优化代码/加核
CPU 不高但卡vmstatwa 高、b 高磁盘 IO 瓶颈:换 SSD、加缓存
内存不够free + vmstatavail 低、si/so 非 0加内存/加 Swap/砍服务
硬盘灯狂闪iostat -x%util 100%机械盘瓶颈,换 SSD
负载高但 CPU 闲vmstatr 高但 id 高等 IO 或锁竞争,查程序
网络卡iftop/ss带宽满/连接爆升级带宽/限流/CC 防护
偶发卡顿全看周期性指标尖峰定时任务/备份/GC,错峰
游戏服卡全看 + top -H单线程吃满游戏单核瓶颈,选高主频 CPU

六、实战:一次完整的排查

场景:玩家反馈「游戏服晚上 8 点准时卡,其他时间正常」。

# 1. 先看整体(晚高峰时)
vmstat 2 10
# 发现: b 列持续 3-5, wa 30-40% → IO 瓶颈

# 2. 看是谁在 IO
iotop -oP
# 发现: 每晚 8 点备份脚本 tar 打包存档,IO 打满

# 3. 确认磁盘类型
iostat -x 2 5
# vda %util 95%, await 45ms → 机械盘特征

# 4. 处置
# a. 备份任务改到凌晨 4 点(玩家少)
crontab -e
# 0 4 * * * /opt/scripts/backup.sh

# b. 备份时加 ionice 降优先级
ionice -c3 /opt/scripts/backup.sh

# c. 长期: 换 SSD 或把备份目录挪到数据盘

# 5. 验证: 第二晚同一时间再看
vmstat 2 10
# b 列回 0, wa 回 5% → 解决

这个案例说明:不装任何监控,三个命令就能定位问题。工具用熟了比一堆仪表盘都直接。

七、进阶:perf 和 pidstat

# perf: 看 CPU 到底耗在哪(需要内核支持)
perf top                 # 实时热点函数
perf record -g -p PID    # 记录调用栈
perf report              # 分析

# pidstat: 看每个进程的资源趋势(找内存泄漏神器)
pidstat -r 2 10          # 内存
pidstat -d 2 10          # IO
pidstat -u 2 10          # CPU
# 某进程 RSS 持续增长 = 内存泄漏

内存泄漏排查套路:

# 1. 确认哪个进程在涨
pidstat -r 2 20 | sort -k7 -rn | head

# 2. 看增长曲线
while true; do ps -o pid,rss,comm -p PID; sleep 60; done

# 3. 定期重启兜底(crontab),同时找根因

八、常见问题

Q:top 显示 CPU 不高,但就是卡,怎么查?
按顺序:vmstat 看 wa/b → iostat -x 看磁盘 → iftop 看网络 → free 看内存。基本能定位到。

Q:load average 多少算高?
持续超过 CPU 核数算高。4 核机器 load 8 = 有一半任务在排队。但 load 高不等于 CPU 高(等 IO 也会推高 load),配合 wa 看。

Q:%util 100% 但 await 很低?
队列深度问题或者 util 统计口径(多队列 SSD util 可能虚高)。看 await 和 svctm 更准。

Q:buff/cache 占满内存,是内存不够吗?
不是。缓存是系统主动占的,内存紧张时会自动释放。看 available 那列。

Q:这些数据能存起来做历史对比吗?
能,sar(sysstat 包)定时采样存盘,回看任意时间段:

sar -u -f /var/log/sysstat/sa14    # 看 14 号的 CPU
sar -b    # IO 历史

配 crontab 每 10 分钟采一次,排障时能回溯。更完整的方案见Linux 监控体系。

小结

性能排查记住这个顺序:vmstat 定方向 → top/iotop/iostat 找元凶 → perf/pidstat 深挖。90% 的卡顿能在这三个工具里找到答案,不需要装任何额外软件。排查完按「优化程序 → 错峰任务 → 升级配置」的顺序处理。

更多运维内容见财富云计算知识库:资源排查、监控体系、内核调优、网络排查工具全系列。需要云服务器可以看看财富云计算:一键开服面板,NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上。

延伸阅读
  1. 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
  2. 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
  3. 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
  4. 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
  5. 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
  6. RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
  7. 短链接服务搭建:Shlink 自托管,链接数据自己掌握
  8. 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道
更多阅读
  1. 上一篇:云服务器被攻击怎么办:黑洞、封禁、限速处理流程
  2. 下一篇:Ansible 批量运维入门:管十台像管一台
发表评论 4

取消回复