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
    
  • 检查是否有进程正在进行大量的磁盘读写操作,可以使用 iotopiostat -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 auxtop 查看系统中进程的状态,特别是 D(不可中断睡眠状态)的进程,这通常表示进程在等待 I/O 操作。

  • 使用

    strace
    

    跟踪某个高负载进程的系统调用,查看其是否在频繁地进行 I/O 操作或等待某些资源。

    bash
    复制代码
    strace -p <pid>
    

5. 检查系统锁和竞争(Lock Contention)

某些进程可能在争用系统资源(如文件锁、网络端口等),导致频繁的上下文切换或阻塞,进而增加系统负载。

排查步骤:

  • 使用 perf tophtop 查看是否有大量的锁竞争或系统调用导致的 CPU 消耗。
  • 使用 lsof 查看文件锁定情况。
  • 使用 dmesg/var/log/messages 查看系统日志中是否有关于锁竞争或资源争用的错误信息。

6. 检查网络瓶颈

如果系统中有大量的网络流量,可能会导致网络卡或驱动程序产生大量中断,导致 CPU 负载增加。

排查步骤:

  • 使用 iftopnload 查看实时网络流量。
  • 使用 sar -n DEV 1 查看每个网络接口的流量情况。
  • 使用 netstat -i 查看网络接口的错误率和丢包情况。

总结

当 CPU 负载高但 CPU 使用率不高时,通常表明系统中存在 I/O 等待、内存不足、中断或锁竞争等问题。通过上述工具和方法,可以逐步排查并找出系统性能瓶颈的根源,并采取相应的优化措施。