服务器卡顿时,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 average | 1/5/15 分钟平均等待进程数 | > CPU 核数持续 = 过载 |
| us | 用户态 CPU(你的程序) | 高 = 程序吃 CPU |
| sy | 系统态 CPU(内核) | 高 = 系统调用多/中断多 |
| wa | IO 等待 | > 20% = 磁盘是瓶颈 |
| id | 空闲 | — |
| buff/cache | 缓存(可回收,不是浪费) | — |
| avail Mem | 真正可用内存 | 低 = 内存紧张 |
| Swap used | swap 使用 | 持续增长 = 内存不够 |
常用交互命令
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 瓶颈 |
| swpd | swap 用量 | 持续增长 = 内存泄漏 |
| si/so | swap 换入/换出 | 持续非 0 = 内存真不够,在硬扛 |
| bi/bo | 块设备读写(块/秒) | 突增 = 大量磁盘 IO |
| in/cs | 中断/上下文切换 | cs 暴涨 = 进程切换频繁(线程问题) |
| us/sy/id/wa | CPU 各项 | 同 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% = 磁盘饱和 |
| await | IO 平均等待(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 高,程序慢 | top | us 高,单核 100% | 程序计算密集:优化代码/加核 |
| CPU 不高但卡 | vmstat | wa 高、b 高 | 磁盘 IO 瓶颈:换 SSD、加缓存 |
| 内存不够 | free + vmstat | avail 低、si/so 非 0 | 加内存/加 Swap/砍服务 |
| 硬盘灯狂闪 | iostat -x | %util 100% | 机械盘瓶颈,换 SSD |
| 负载高但 CPU 闲 | vmstat | r 高但 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 机型省一半以上。
延伸阅读
- 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
- 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
- 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
- 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
- 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
- RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
- 短链接服务搭建:Shlink 自托管,链接数据自己掌握
- 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道

[...]lsof +D /var/log 2>/dev/null | head # 谁开着日志文件在写更多工具组合见Linux 性能分析三板斧和进程调试实战。三、常见卡顿场景与解法3.1 游戏服存档写入卡现象:每到自动存档时刻全服卡一下,平时也偶尔顿。原因:游戏把整个世界刷盘,机械盘或低 IOPS 云盘扛不住。解法:# 1. 确认磁盘类型(控制台看,或简单测速)[...]
2026-10-15 回复
[...]uptime # load做成 cron 每日邮件报告,模板见服务器日常巡检清单与自动化。监控告警体系见Prometheus 监控体系。排查口诀:先 uptime 看 load,再 top 找 CPU,ps 看状态位,iostat 看磁盘,dmesg 看内核,crontab 查根。按顺序来,没有查不到的问题。进程异常大多有迹可循:僵尸找爹、[...]
2026-10-15 回复
[...]# https://z0w.cn/wiki/process-debug-perf.html排查思路汇总见服务器资源排查实战,游戏场景特化版见开服卡顿掉线排查手册。七、常见疑问Q:top 里 %CPU 超过 100% 正常吗?多核机器上,一个多线程进程可以吃掉 400%(4 核全占)。按 1 展开看单核,才知道是不是单核瓶颈。Q:load average 三个数字看哪个?1 分钟看当下,5 分[...]
2026-10-18 回复
[...]netsh advfirewall firewall add rule name="GameRange" dir=in action=allow protocol=UDP localport=26901-26903完整的 Windows 环境准备(远程桌面连接、运行库安装、SteamCMD 用法、开机自启、8 个常见坑)见:《Windows 云服务器开服通用前置教程》→ htt[...]
2026-10-18 回复