Linux 服务器响应迟缓需排查 CPU、内存、磁盘三类瓶颈:CPU 看 %us/%sy 与 r 值,内存重在 available 及 si/so,磁盘盯 %util、await 与 D 态进程,并通过多工具交叉验证和排除干扰项准确定位根因。

如果您观察到 Linux 服务器响应迟缓、服务超时或负载异常升高,则可能是由于 CPU、内存或磁盘中某一项或多项资源达到瓶颈。以下是针对这三类核心资源的综合排查技巧:
一、CPU 瓶颈识别与定位
CPU 瓶颈表现为高 %us(用户态)或 %sy(内核态)持续超过 80%,同时运行队列长度(r 值)长期大于 CPU 逻辑核数,说明任务积压严重。需区分是计算密集型、系统调用频繁还是 I / O 等待导致的假性高占用。
1、执行 top -b -n1 | head -n5 快速查看当前负载及 CPU 总体使用分布。
2、运行 mpstat -P ALL 1 3 检查各 CPU 核心是否出现不均衡占用,单核 100% 而其余空闲表明存在绑核或单线程瓶颈。
3、使用 ps aux –sort=-%cpu | head -n10 提取 CPU 消耗前 10 的进程,并记录其 PID。
4、对高 CPU 进程进一步分析:执行 top -H -p
二、内存瓶颈识别与定位
内存瓶颈不仅体现为可用内存(free)过低,更关键的是观察是否触发频繁换页(si/so 非零)、kswapd 持续活跃、或进程因 OOM 被内核杀死。当 vmstat 中wa值升高且伴随大量pgpgin/pgpgout,往往意味着内存不足引发 IO 放大效应。
1、运行 free -h 查看 Mem 和 Swap 总量与已用比例,重点关注 available 字段而非free。
2、执行 vmstat 1 5 观察si(swap-in)与so(swap-out)列是否持续大于 0,同时检查b(阻塞进程数)是否频繁非零。
3、使用 smem -r -c “pid user comm rss pss uss” 按实际物理内存占用(PSS)排序进程,识别内存泄漏嫌疑进程。
4、检查内核是否触发 OOM Killer:执行 dmesg -T | grep -i “killed process”,确认是否存在因内存耗尽强制终止进程的记录。
三、磁盘 I / O 瓶颈识别与定位
磁盘瓶颈的核心指标是 I / O 等待时间(%util 接近 100%、awai t 显著高于 svctm)、长队列(avgqu-sz > 1)、以及高 iowait CPU 占比。此时即使 CPU 空闲,系统仍卡顿,因大量进程处于 D 状态(不可中断睡眠)等待 IO 完成。
1、运行 iostat -dx 1 3 查看各块设备的 %util、await、svctm 与avgqu-sz,若 %util ≥ 95% 且await > 10ms(机械盘)或> 1ms(SSD),即存在 IO 压力。
2、执行 iotop -o 显示当前正在执行 I / O 操作的进程及其读写速率,定位具体发起大量 IO 的进程。
3、检查进程 IO 状态:对可疑 PID 运行 cat /proc/
4、确认是否存在 D 状态进程堆积:执行 ps aux | awk ‘$8 ~ /^D/ {print $0}’,输出结果中进程数过多(如>10)且长时间存在,表明底层存储响应异常。
四、多维交叉验证法
单一 工具 易误判,需结合多个维度交叉印证。例如:top 显示 CPU 高但 mpstat 发现仅 1 核满载,同时 iostat 显示某盘 %util=100%,则应优先排查该盘对应进程的 IO 行为,而非盲目优化 CPU 代码。
1、同步采集三类指标:在终端并行运行 vmstat 1、iostat -x 1、pidstat -u -r -d 1,观察数值联动变化。
2、检查等待链:对高 r 值场景,执行 cat /proc/loadavg 并比对 ps r 输出,确认运行态进程是否真实可调度,抑或大量处于 D 态造成虚假负载。
3、验证内存与 IO 关联:当 vmstat 中pgpgin激增且 iostat 中rkB/s同步飙升,大概率是因内存不足触发 Swap 读入,此时应优先处理内存问题而非磁盘性能。
4、使用 sar -q -r -u -d 1 5 一次性获取负载、内存、CPU、磁盘历史采样,避免工具切换引入时间偏差。
五、快速隔离干扰项
排除监控工具自身开销、日志刷盘、定时任务等临时扰动,确保所见即所得。例如 htop 本身可能短暂拉升 CPU,而某些日志轮转脚本会在整点集中写入 GB 级文件,掩盖真实业务瓶颈。
1、暂停非必要监控:临时停止 collectd、prometheus-node-exporter 等采集进程,再复测关键指标。
2、检查 cron 任务:执行 grep -r “>/dev/null” /etc/cron* 2>/dev/null | head -10,筛查是否存在未重定向输出的定时脚本在后台刷屏式写日志。
3、审计大文件写入:运行 find /var/log -type f -size +100M -mtime -1 定位近 24 小时内增长异常的日志文件。
4、禁用透明大页(THP):对数据库或 Java 服务,执行 echo never > /sys/kernel/mm/transparent_hugepage/enabled 防止周期性内存整理引发卡顿。