您好,欢迎访问云老大官方网站!
24小时咨询 @luotuoemo    @yunlaoda360

服务器负载很高但CPU不高?排查这5个关键原因

时间:2026-07-10 10:17:44 点击:

开局就直奔主题:很多运维人员都经历过这样的场景——top命令显示 load average 飙高到核心数的数倍,服务响应迟缓,CPU 使用率却不到 50%。这种“服务器负载高CPU占用低”的排查原因往往不在 CPU 本身,而隐藏在磁盘 I/O、内存 swap 或进程锁竞争之中。本文基于实际运维案例,拆解 5 个关键排查方向。

一、为什么服务器负载高但CPU不高?

1. 什么是服务器负载?它和CPU使用率有何区别?

负载(load average)衡量的是系统在单位时间内处于运行或不可中断状态的平均进程数,本质是一个队列长度。CPU 使用率仅反映 CPU 被占用的时间比例。一个典型差异:当有 8 个进程同时等待磁盘响应时,8 核服务器的负载可能达到 8,但 CPU 使用率可能只有 20%——因为进程都卡在 I/O 上,根本不消耗算力。很多团队误把负载当 CPU 利用率来监控,导致扩容方向完全错误。

2. 哪些因素会导致负载虚高?

实际排查中,I/O 等待是最常见的元凶。一组实测数据显示,当磁盘 %wa 达到 35%、await 超过 80ms 时,系统负载会从 0.5 飙升到 15 以上(参考搜索案例 7)。此外,内存不足触发的 swap 频繁换入换出也会让不可中断进程数(vmstatb 列)暴涨,进而拉高负载。更隐蔽的是,虚拟线程或协程的上下文切换过多同样可能制造假性负载,但 CPU 占用很低。盲目升级 CPU 核心数只会浪费成本,根因往往在磁盘或内存层面。

二、服务器负载高CPU低的常见原因

1. 磁盘 I/O 瓶颈

当进程等待磁盘读写完成时,会进入不可中断睡眠状态(D 状态),直接推高系统负载,但 CPU 只花少量时间在 I/O 等待指令上。实测案例显示,磁盘 %util 接近 100%、await 超过 80ms 时,load average 可飙升至 CPU 核心数的 5–8 倍,而 CPU 使用率却不足 30%。此时 top 中的 %wa 列若持续高于 10%,基本可以锁定根因是磁盘而非算力不足。

2. 内存不足与 swap 频繁

物理内存耗尽后,系统会通过 swap 分区将部分内存页换出到磁盘。频繁的 swap in/out 会增加大量不可中断进程,因为每次换入/换出都伴随磁盘 I/O。通过 vmstat 1 观察 siso 列:若数值持续大于 0,说明内存已成为瓶颈。更严重时,OOM Killer 会随机杀死进程,导致负载瞬间暴增后回落,业务出现“Killed”信号——这种情况下的 CPU 占用通常很低,但系统响应已完全失控。

三、排查负载高的必备工具

遇到负载高但CPU不高的场景,手头工具的使用顺序往往决定排查效率。从业者容易犯的一个错误是只盯着 load average 数值,忽略进程状态和资源等待队列。以下三个工具组合能帮你快速缩小排查范围,避免在扩容上浪费成本。

1. top/htop:先看进程状态和 %wa

top 是最直接的入口,但重点不是CPU占用率,而是两个关键字段:进程状态列%wa(I/O wait)。实测案例中,当 %wa 持续超过 10%,且 top 里出现多个状态为 D(不可中断睡眠,通常表示等待磁盘I/O)的进程,基本可以断定负载来源是磁盘而非CPU。更激进的做法是用 htop 排序,按 %WA 列倒序排列,一眼看出哪些进程在“空转牵制”。记住,load average 在双核例上超过 4 且 %wa 接近 35% 时,磁盘大概率是瓶颈。

2. iostat -x 1:量化磁盘到底有多慢

top 指向磁盘后,用 iostat -x 1 每秒输出磁盘等待数据。需要关注的指标是 await(平均I/O响应时间)和 %util(磁盘繁忙度)。真实线上案例显示,当 await 超过 80ms、%util 接近 100% 时,系统负载会从正常的 1.5 飙升到 6 以上,但CPU用户态使用率反而不到 30%。avgqu-sz(平均队列长度)如果大于 2,说明请求已经开始排队。此时再去看具体的 r/sw/s——往往是写日志或数据库刷盘导致的密集随机写入,而非CPU算力不足。

3. vmstat 1:内存与swap的隐性杀手

即便CPU和磁盘看起来正常,负载仍可能因内存不足而虚高。vmstat 1 输出中,si(swap in)和 so(swap out)两列但凡持续大于 0,就说明系统物理内存不够,正在频繁换页。每次换页都会产生I/O,阻塞进程变成 D 状态,从而推高负载。更隐蔽的是 b 列(不可中断进程数),如果此列长期大于 1-2,且 free 列持续下降,需要立刻检查是否有内存泄漏或频繁触发的 OOM Killer。曾有一例业务中,b 列飙到 5 但CPU仅 20%,最终定位是某 Python 脚本未及时释放循环中的临时对象。

四、一步步排查:服务器负载高CPU低的实战步骤

1. 第一步:用 top 定位高负载进程及状态分布

执行 top 后,首要看 load average 三个值与 CPU 核心数的比值——若超过核心数×2 说明严重堵塞。接着观察 %wa(I/O wait)列,高于 10% 提示磁盘瓶颈;进程状态列中若出现大量“D”(不可中断睡眠,通常等待 I/O)或“Z”(僵尸),则进一步指向具体问题。实测案例中,%wa 达到 35% 时,系统负载飙升至 12,但 CPU 使用率仅 45%——这个差值正是磁盘等待的代价。

2. 第二步:用 iostatvmstat 锁定磁盘与内存瓶颈

iostat -x 1 重点关注 %util(接近 100% 说明磁盘饱和)、await(>30ms 时队列过长)和 avgqu-sz(>2 表示请求排队)。配合 vmstat 1 查看 b 列(不可中断进程数),若持续高于 1,说明大量进程在争夺磁盘或锁。同时观察 si/so 是否大于 0——只要持续非零,表明 swap 频繁进出,内存不足导致负载虚高。例如某业务在内存为 8GB 但活跃数据超过 10GB 时,si 一度达 2000/s,负载从 2 飙至 8。

3. 第三步:定位并清理僵尸进程与 swap 占用

僵尸进程本身不消耗 CPU,但会占据进程表条目,积累过多时加剧调度开销。执行 ps aux | grep 'Z' 找到僵尸进程的 PPID,然后 kill -9 其父进程或重启服务。若父进程无法被杀(如内核线程),需重启整机。同时,检查 swap 使用量:free -mused 接近最大值时,考虑调整 vm.swappiness(建议临时设为 10)或增加物理内存。避免 OOM Killer 在内存耗尽时无故终止重要进程——这是负载周期性飙升的常见诱因。

五、真实案例:一次负载高CPU低的排查过程

1. 现象描述与初步判断

某电商后台服务在晚高峰时段出现页面加载时间从200ms飙升至3s的异常。运维人员执行top后发现,4核CPU的load average达到8.5,但CPU使用率仅为28%。%wa(I/O wait)标红显示35%,进程状态列出现多个D(不可中断睡眠)。初步判断CPU并非瓶颈,问题很可能出在磁盘I/O上——这与搜索结果第7条案例中“%wa达35%、磁盘await达80ms”的描述高度吻合。

2. 使用工具定位根因

使用iostat -x 1持续监控,发现磁盘%util接近100%,平均await达到80ms,avgqu-sz(平均队列长度)高达12。同时vmstat 1显示b列(不可中断睡眠进程数)长期维持在5以上,而si/so为0(未触发swap),彻底排除了内存不足的可能性。进一步查看进程详情,发现大量java进程在等待日志文件写入锁和MySQL连接池等待锁,确认根因是磁盘I/O过高叠加锁竞争。

3. 具体优化措施

首先将应用日志从机械盘迁移至SSD,磁盘await从80ms降至2ms,%util降至15%。其次针对数据库连接池锁,将maxActive从200调低至100,并启用连接复用超时机制。优化后load average从8.5降至1.2,服务响应恢复至250ms以内。这一案例验证了“负载高但CPU不高时,优先排查磁盘I/O和锁等待”的排查路线——盲目升级CPU只会徒增成本。

六、如何预防服务器负载异常?

1. 合理配置监控告警

监控不能只盯CPU使用率。建议将%wa(I/O等待)、磁盘awaitavgqu-sz纳入核心指标,并设置分级阈值:例如%wa连续超过10%触发警告,await超过30ms或avgqu-sz大于2立即告警。某电商平台在“双11”期间曾因磁盘await高达80ms导致负载飙至30但CPU仅20%,由于未监控I/O指标,运维团队花了2小时才定位到SSD老化问题。另外,vmstatsi/sob列也应接入告警,避免swap和不可中断进程积累。

2. 优化应用与数据库

多数负载虚高由应用层I/O或锁竞争引发。优先排查慢查询和事务冲突:MySQL的show processlist中大量“Waiting for table metadata lock”或PostgreSQL的pg_stat_activity中长事务,都会导致进程进入D状态。实测案例显示,一个未优化的全表扫描查询可使磁盘%util持续100%,负载上升5倍而CPU仍低于30%。定期执行慢查询日志分析、添加索引、拆分大事务,能显著降低I/O等待。同时,限制单机连接数和worker线程数,防止进程爆炸——当进程数超过CPU核心数的50倍时,上下文切换开销会推高负载。

客服中心

骆驼云 @luotuoemo

云老大  @yunlaoda360

内容图片
合作伙伴 Logo
TG 咨询 获取代理价(更低折扣)
更低报价 更低折扣 代金券申请
咨询客服 :@luotuoemo