在阿里云服务器(ECS)上,如果系统负载高但 CPU 使用率不高,这种情况其实是比较常见的。它说明系统资源的瓶颈不在 CPU 上,而可能是在其他方面,比如 I/O、内存、网络或进程调度等。
一、什么是系统负载?
系统负载(Load Average) 是指单位时间内处于可运行状态和不可中断状态的进程平均数。具体包括:
- 正在使用 CPU 的进程
- 等待 CPU 的进程
- 等待 I/O 的进程(如磁盘读写)
所以即使 CPU 使用率不高,只要有大量进程在等待 I/O 或其他资源,负载就会升高。
二、为什么负载高但 CPU 不高?
常见原因如下:
| 类型 | 原因描述 |
|---|---|
| I/O 瓶颈 | 磁盘性能不足(如普通云盘),导致大量进程阻塞在磁盘 I/O 上 |
| 内存不足 | 内存不够时会频繁使用 Swap,Swap 操作是磁盘 I/O,会导致负载上升 |
| Docker 容器/虚拟机问题 | 虚拟化层资源分配不合理或容器间争抢资源 |
| 网络延迟或阻塞 | 如访问远程数据库、API 接口慢,进程阻塞在网络请求上 |
| 锁竞争/死锁 | 多线程程序中出现锁竞争或死锁,导致进程等待 |
| 僵尸进程/大量短生命周期进程 | 创建和销毁进程本身也会增加负载 |
三、排查方法
1. 查看负载情况
uptime
输出类似:
load average: 5.00, 4.80, 4.70
这三个值分别代表过去 1 分钟、5 分钟、15 分钟的平均负载。
2. 查看 CPU 使用率
top 或 htop
观察 %CPU 和 wa(iowait)指标。
如果
wa很高,说明是 I/O 等待导致负载高。
3. 查看磁盘 I/O 情况
iostat -x 1
关注 %util 和 await 字段:
%util接近 100%,表示磁盘已经饱和。await很高,说明 I/O 响应时间长。
4. 查看哪些进程在等待 I/O
iotop
查看是否有进程占用大量磁盘 I/O。
5. 查看内存使用情况
free -h
如果 available 内存很低,且 used 高,可能是内存不足触发了 Swap。
6. 查看 Swap 使用情况
swapon --show
如果有启用 Swap,并且使用较多,也会影响性能。
7. 查看进程状态
ps aux | awk '$8 == "D" || $8 == "Z"'
- 状态为 D(不可中断睡眠)的进程通常是等待 I/O。
- 状态为 Z(僵尸进程)的进程需要排查是否程序有 bug。
四、解决方案建议
1. 升级磁盘性能
- 将普通云盘升级为 SSD 或 ESSD 云盘
- 使用 RAM Disk 缓存临时数据
2. 增加内存或关闭 Swap
- 增加 ECS 实例内存配置
- 如果不需要 Swap,可以考虑关闭 Swap 减少 I/O 干扰
swapoff -a
(注意:重启后会恢复)
3. 优化应用逻辑
- 减少不必要的磁盘读写操作(如日志过多)
- 优化数据库查询,减少慢 SQL
- 引入缓存(如 Redis)减少对后端存储的压力
4. 限制并发连接数或请求频率
- 使用 Nginx、HAProxy 等做限流控制
- 对外接口加入 Rate Limit 机制
5. 监控与告警
- 使用阿里云监控(CloudMonitor)
- 配合 Prometheus + Grafana 做更详细的性能分析
五、示例场景分析
假设你运行了一个 PHP 应用 + MySQL 数据库:
- 应用频繁写日志到磁盘
- 数据库执行大量慢查询
- 日志文件未切割,导致单个文件过大
- 每次访问都从磁盘加载大文件
这些都会造成:
iowait高- Load 高
- CPU 利用率不高
解决方式:
- 启用日志轮转(logrotate)
- 使用异步日志记录
- 优化 SQL 查询,添加索引
- 使用内存缓存热点数据
六、总结
| 指标 | 表示意义 | 关联问题 |
|---|---|---|
| Load 高 | 进程排队多 | CPU、I/O、内存、锁等 |
| CPU 不高 | 不是 CPU 瓶颈 | 可能是 I/O、内存、网络 |
| iowait 高 | 等待磁盘 I/O | 磁盘性能差、大量读写 |
| Swap 使用高 | 内存不足 | 加内存或调低应用内存使用 |
如果你愿意提供具体的负载数值、使用的工具(如 top、htop、iostat 等输出),我可以帮你进一步分析具体问题。
是否需要我帮你分析一段 top 或 iostat 的输出?
CLOUD技术博