阿里云服务器系统负载高,但 CPU 使用率不高,这种情况其实并不少见。系统负载(Load)高并不一定意味着 CPU 是瓶颈。系统负载是衡量系统“等待资源”的综合指标,通常包括:
- CPU 使用
- 磁盘 I/O
- 内存交换(Swap)
- 网络延迟
- 锁竞争、线程阻塞等
一、什么是系统负载?
在 Linux 中,load average 表示的是 处于可运行状态或不可中断状态的进程平均数。
- 可运行状态:正在使用 CPU 或等待 CPU 的进程。
- 不可中断状态:通常是等待 I/O(如磁盘读写)、锁或其他资源。
所以即使 CPU 空闲,如果有大量进程在等待 I/O,系统负载也会升高。
二、常见原因分析
1. 磁盘 I/O 高
- 大量读写操作导致磁盘成为瓶颈。
- 使用
iostat,iotop查看磁盘 I/O 情况。
# 安装 sysstat
yum install -y sysstat
# 查看磁盘 I/O 统计
iostat -xmt 1
关键指标:
%util:设备利用率,接近 100% 表示饱和。await:单次 I/O 平均等待时间,过高说明磁盘慢。
2. 内存不足 + Swap 使用
- 如果物理内存不够,系统会使用 Swap(虚拟内存),而 Swap 会导致大量磁盘 I/O。
- 使用
free -m和vmstat查看内存和 swap 使用情况。
free -m
vmstat 1
如果 si/so(swap in/out)持续不为 0,说明正在使用 Swap。
3. 网络延迟或连接阻塞
- 应用依赖远程服务(如数据库、API、NFS),响应慢会造成请求堆积。
- 使用
netstat,ss,tcpdump分析网络连接。
# 查看当前连接状态
netstat -antp | grep :80 | awk '{print $6}' | sort | uniq -c
# 查看 TCP 连接统计
ss -s
4. D 状态进程(不可中断睡眠)
- 通常是因为等待磁盘、网络或硬件驱动问题。
- 使用
top或ps查看是否有 D 状态进程:
ps aux | awk '$8 == "D"'
5. 文件锁或资源锁竞争
- 多线程或多进程应用中,频繁争抢锁也可能导致负载高但 CPU 低。
- 可通过
pidstat,strace跟踪具体进程行为。
三、排查步骤建议
-
查看负载趋势
uptime -
查看负载来源
top观察 load average 和 CPU idle 百分比是否匹配。
-
检查 I/O 状况
iostat -xmt 1 -
检查内存与 Swap
free -m vmstat 1 -
查找 D 状态进程
ps -eo stat,pid,cmd | grep D -
跟踪某个进程的行为
strace -p <PID> -
查看进程 I/O 使用情况
iotop
四、解决方案建议
| 原因 | 解决方案 |
|---|---|
| 磁盘 I/O 高 | 升级磁盘类型(如从 HDD 到 SSD)、优化代码减少磁盘访问、使用缓存 |
| Swap 使用高 | 增加内存、关闭 Swap(测试环境可用)、优化内存使用 |
| 网络延迟 | 检查 DNS、数据库连接、远程 API 接口、切换到更快的网络节点 |
| 文件锁竞争 | 优化并发模型、使用更高效的同步机制 |
| D 状态进程多 | 检查磁盘挂载、NFS 挂起、内核 bug |
五、阿里云特定建议
- 使用阿里云监控平台查看 ECS 实例的 磁盘 IO、网络带宽、内存使用。
- 如果是云盘性能问题,可以升级为 SSD 云盘 或 ESSD 云盘。
- 开启 VPC 内网通信,避免走公网带来的延迟。
- 若使用 RDS、OSS 等服务,确认访问路径是否最优。
如果你能提供以下信息,我可以帮你更具体分析:
uptime输出top截图或输出iostat -xmt 1输出- 是否有大量 D 状态进程
- 应用类型(Web、数据库、爬虫等)
需要我帮你分析具体数据吗?你可以把命令输出贴出来。
云知识