系统偶尔变得响应迟缓、命令迟迟不出结果,或者 SSH 连上去都卡顿——这类“卡顿”问题通常并非单一瓶颈造成,而是 CPU、内存、IO 等环节互相影响。要快速定位,需要一套从宏观到微观的排查流程。
1. 从负载入手:系统在“忙”什么?uptime 或 top 的第一行会显示 1 分钟、5 分钟、15 分钟的平均负载(load average)。简单理解:负载大致等于 正在运行 + 正在等待 CPU 或 I/O 的进程数。如果 1 分钟负载远高于 CPU 核心数,说明有任务在排队,系统出现了饱和。
- 较高负载,但 CPU 使用率(
top中的us和sy)不高:很可能瓶颈在 I/O 等待,此时top里的wa(iowait)会显著上升。 - 负载和 CPU 使用率同时飙高:说明计算资源紧张,需要进一步分解是用户态程序还是内核态消耗。
2. CPU 瓶颈定位
使用 top 或 htop 观察:
us(用户态)高:某个应用程序占用大量 CPU,如计算密集型脚本、压缩/解压、加密算法。记下高 CPU 进程,用strace -p PID或perf top查看它在忙什么。sy(系统态)高:内核处理系统调用、中断、上下文切换过于频繁,往往与大量短连接、频繁的文件操作有关。可以用vmstat 1观察sy和cs(每秒上下文切换次数),超过几万次值得关注。wa(iowait)高:CPU 在等待磁盘或网络 I/O 完成,此时 CPU 本身并不忙,但任务卡在 I/O 上。需要转向 I/O 层面的排查。
实用命令:
top -c # 按CPU使用率排序,显示完整命令行
vmstat 1 10 # 每秒采样一次,观察r(运行队列)、cs、in(中断)、us、sy、wa
3. 内存压力排查
卡顿有可能因为内存不足,系统被迫使用交换空间(swap),内存和磁盘之间的频繁换页会严重拖慢系统。
free -h:查看内存和 swap 使用量。如果 swap 的used持续增长且available内存很少,系统正在承受内存压力。top或htop中关注进程的RES(物理内存)、VIRT(虚拟内存)、SHR(共享内存)。按内存排序(M键)找出占用大户。- 检查是否有大量页面回收活动:
cat /proc/vmstat | grep pgsteal持续增加表示内存回收频繁,dmesg | grep -i oom看是否触发了 OOM killer。 - 更精细的分析可以用
smem观察进程的实际物理内存占用(USS / PSS),区分共享内存的影响。
4. I/O 子系统定位
磁盘 I/O 延迟往往是系统在“感觉上”卡顿的元凶——命令响应慢,文件读写不动。
iostat -x 1:重点关注util(磁盘使用率,表示有 IO 请求的时间比例)、await(平均 IO 响应时间,包括排队)、svctm(已废弃但部分版本仍显示)、r/s/w/s(读写请求数)。如果util接近 100% 且await很高,说明磁盘已达极限。- 用
iotop或pidstat -d 1找出哪个进程在疯狂读写,并查看其读写速率。 - 区分是吞吐量饱和还是 IOPS 饱和:传统机械硬盘
rkB/s很高但 IOPS 低也可能达到瓶颈,而 SSD 往往先达到 IOPS 极限。 - 对于定位特定应用的阻塞,可以使用
strace跟踪文件操作和 fsync、fdatasync 调用,或用perf record -e block:*查看块层延迟。
5. 综合实战:一条组合命令快速收集
(echo "=== uptime ===" ; uptime ; echo "=== free ===" ; free -h ; echo "=== top ===" ; top -bn1 | head -20 ; echo "=== vmstat ===" ; vmstat 1 5 ; echo "=== iostat ===" ; iostat -x 1 3)
该命令一次性输出负载、内存、进程快照、系统上下文切换和 I/O 统计,可以粘贴到日志里用于回溯分析。
6. 全链路思考与关联
卡顿极少只由一个环节引起。例如:内存不足导致 swap 读写,增加 I/O 压力,进而拉高 iowait 和负载;而高负载又可能拖慢 OOM killer 的处理速度。因此,定位时需要交叉比对:
- CPU 低但负载高 + 高 iowait → 磁盘瓶颈。
- CPU 高 + 大量上下文切换 → 可能是线程过多、锁争用或中断风暴。
- swap 占用大 + 磁盘持续繁忙 → 内存不足引发的连锁反应,优先解决内存大户或增加物理内存。
一旦确定瓶颈所在,对症的措施可能是:优化慢查询、增加内存、换用 SSD、调整内核参数(如 vm.swappiness)、限制进程资源(cgroup)或扩容硬件。通过这套从负载、CPU、内存到 I/O 的顺序排查方法,你能够在五分钟内将大部分卡顿问题锁定到具体层面,避免盲目重启,真正解决问题。