CPU 负载高而 CPU 使用率不高的情况可能表明系统中存在一些问题,如大量的 I/O 等待、资源争用或系统瓶颈。这种现象通常意味着 CPU 并不是系统性能的瓶颈,而是其他因素导致了系统的阻塞或延迟。以下是一些可能的原因及排查步骤:
1. 检查 I/O 等待(I/O Wait)
I/O 等待是指 CPU 在等待磁盘或网络 I/O 操作完成时处于空闲状态。当系统中有大量的 I/O 操作(如磁盘读写、网络操作)时,CPU 可能需要等待 I/O 操作完成,这会导致负载升高,但 CPU 使用率不高。
说明一下,日常工作中确实其实有很多问题就是直接是 io 导致的;
排查步骤:
使用
top命令查看wa(I/O Wait)列。如果该值较高,表示系统中存在大量的 I/O 等待。使用
iostat命令(需要安装 sysstat 包)它们可以显示磁盘的响应时间和服务时间。
bash 复制代码 iostat -x 1 5检查是否有进程正在进行大量的磁盘读写操作,可以使用
iotop或iostat -p查看具体的磁盘活动。
2. 查看系统中断(Interrupts)
大量的硬件中断或软中断也可能导致 CPU 负载高,而实际 CPU 使用率不高。这可能是由于某些硬件设备频繁产生中断,或者系统中有高频的网络数据包处理。
排查步骤:
使用
vmstat查看
in(interrupts)列和
cs(context switches)列,看看中断和上下文切换是否异常高。
bash 复制代码 vmstat 1使用
cat /proc/interrupts查看各个 CPU 的中断分布情况,并检查是否有某个硬件设备产生大量中断。使用
mpstat(也需要安装
sysstat包)命令查看每个 CPU 的软中断(softirq)情况。
bash 复制代码 mpstat -I ALL 1
3. 检查内存和交换分区使用
内存不足导致频繁的交换(swap)操作也会引起 CPU 负载高但使用率低的情况。频繁的内存交换会导致系统性能下降,因为磁盘 I/O 操作远比内存访问慢。
排查步骤:
使用
free -m查看内存使用情况,检查是否有大量的交换分区使用(Swap)情况。
bash 复制代码 free -m使用
vmstat查看si(swap in)和so(swap out)列,判断是否有大量的内存换入/换出操作。如果内存不足,考虑增加物理内存或减少内存占用较大的进程。
4. 查看进程状态
有些进程可能处于阻塞状态(如等待 I/O、锁竞争等),导致 CPU 负载高但没有消耗大量的 CPU 资源。
排查步骤:
使用
ps aux或top查看系统中进程的状态,特别是D(不可中断睡眠状态)的进程,这通常表示进程在等待 I/O 操作。使用
strace跟踪某个高负载进程的系统调用,查看其是否在频繁地进行 I/O 操作或等待某些资源。
bash 复制代码 strace -p <pid>
5. 检查系统锁和竞争(Lock Contention)
某些进程可能在争用系统资源(如文件锁、网络端口等),导致频繁的上下文切换或阻塞,进而增加系统负载。
排查步骤:
- 使用
perf top或htop查看是否有大量的锁竞争或系统调用导致的 CPU 消耗。 - 使用
lsof查看文件锁定情况。 - 使用
dmesg或/var/log/messages查看系统日志中是否有关于锁竞争或资源争用的错误信息。
6. 检查网络瓶颈
如果系统中有大量的网络流量,可能会导致网络卡或驱动程序产生大量中断,导致 CPU 负载增加。
排查步骤:
- 使用
iftop或nload查看实时网络流量。 - 使用
sar -n DEV 1查看每个网络接口的流量情况。 - 使用
netstat -i查看网络接口的错误率和丢包情况。
总结
当 CPU 负载高但 CPU 使用率不高时,通常表明系统中存在 I/O 等待、内存不足、中断或锁竞争等问题。通过上述工具和方法,可以逐步排查并找出系统性能瓶颈的根源,并采取相应的优化措施。