CPU负载很高利用率很低

负载和利用率

  • 负载:所有正在等待CPU资源的线程数 + CPU正在执行的线程数
  • 利用率:CPU执行时间 / (CPU空闲时间 + CPU执行时间)

CPU负载很高利用率很低

CPU负载很高,但是利用率却很低,说明等待的线程很多,但是真正执行的线程数又很少。产生这种情况的原因就是大量的线程都在等待IO,所以导致任务队列堆积。

场景一:磁盘读写请求过多

CPU的处理速度要远远超过磁盘的IO速度,所以当线程进行IO操作的时候,CPU就会转而去执行其他的线程或者空闲,而如果这种磁盘IO较多的话,就会使得很多线程都在等待IO而CPU却在空闲。也产生了CPU负载很高而利用率很低的现象。

如果产生了这种情况,可以使用如下两个Linux指令进行排查:

  1. 通过top 指令,查看CPU使用情况以及任务的执行情况。
  2. 通过ps -axjf 查看是否存在 D+状态的进程。该状态的进程即为不可中断睡眠态进程。

场景二:SQL执行过慢

在实际的生产过程中,大部分的数据都是存储在数据库中, 而数据库中的数据又是写在磁盘中,如果要获取,需要先将数据库中的数据读取到内存中,再进行处理。一旦表中数据量很大又没有索引或者SQL没有走索引的话,就会因为全表扫描而导致IO阻塞。

那么面对这种情况,我们有什么好的解决方法呢:

  1. 打开慢查询日志:MySQL会将执行较慢的SQL自动记录到慢查询日志中,但是这个功能默认是关闭的,需要手动开启。

关于慢查询日志可以看这篇文章:https://www.cnblogs.com/kerrycode/p/5593204.html

  1. 使用explain 分析查询较慢的SQL,该优化优化,该建索引建索引。

你可能感兴趣的:(CPU负载很高利用率很低)