CPU负载和CPU利⽤率的区别是什么?
⾸先,我们可以通过uptime , w 或者top 命令看到CPU的平均负载。

Load Average :负载的3个数字,⽐如上图的0.76,0.85,0.89,分别代表系统在过去的1分钟,5分
钟,15分钟内的系统平均负载。他代表的是当前系统正在运⾏的和处于等待运⾏的进程数之和。也指的
是处于可运⾏状态和不可中断状态的平均进程数。
如果单核CPU的话,负载达到1就代表CPU已经达到满负荷的状态了,超过1,后⾯的进⾏就需要排队等
待处理了。
如果是是多核多CPU的话,假设现在服务器是2个CPU,每个CPU2个核,那么总负载不超过4都没什么问
题。
怎么查看CPU有多少核呢?
通过命令cat /proc/cpuinfo | grep “model name” 查看CPU的情况。
通过cat /proc/cpuinfo | grep “cpu cores” 查看CPU的核数
CPU 利⽤率:和负载不同,CPU利⽤率指的是当前正在运⾏的进程实时占⽤CPU的百分⽐,他是对⼀段
时间内CPU使⽤状况的统计。
我举个栗⼦
!
:
假设你们公司厕所有1个坑位,有⼀个⼈占了坑位,这时候负载就是1,如果还有⼀个⼈在排队,那么负
载就是2。
如果在1个⼩时内,A上厕所花了10分钟,B上厕所花了20分钟,剩下30分钟厕所都没⼈使⽤,那么这⼀
个⼩时内利⽤率就是50%。
那如果CPU负载很⾼,利⽤率却很低该怎么办?
CPU负载很⾼,利⽤率却很低,说明处于等待状态的任务很多,负载越⾼,代表可能很多僵死的进程。
通常这种情况是IO密集型的任务,⼤量请求在请求相同的IO,导致任务队列堆积。
同样,可以先通过top 命令观察(截图只是示意,不代表真实情况),假设发现现在确实是⾼负载低使⽤
率。
然后,再通过命令ps -axjf 查看是否存在状态为D+ 状态的进程,这个状态指的就是不可中断的睡眠状
态的进程。处于这个状态的进程⽆法终⽌,也⽆法⾃⾏退出,只能通过恢复其依赖的资源或者重启系统
来解决。(对不起,我截不到D+的状态)
那如果负载很低,利⽤率却很⾼呢?
如果你的公司只有⼀个厕所,外⾯没⼈排队,却有⼀个⼈在⾥⾯上了⼤半个⼩时,这说明什么?
两种可能:他没带纸,或者⼀些奇怪的事情发⽣了?
这表示CPU的任务并不多,但是任务执⾏的时间很⻓,⼤概率就是你写的代码本身有问题,通常是计算
密集型任务,⽣成了⼤量耗时短的计算任务。
怎么排查?直接top 命令找到使⽤率最⾼的任务,定位到去看看就⾏了。如果代码没有问题,那么过段
时间CPU使⽤率就会下降的。
那如果CPU使⽤率达到100%呢?怎么排查?
- 通过top 找到占⽤率⾼的进程。

2. 通过top -Hp pid 找到占⽤CPU⾼的线程ID。这⾥找到958的线程ID
3. 再把线程ID转化为16进制, printf “0x%x\n” 958 ,得到线程ID 0x3be
4. 通过命令jstack 163 | grep ‘0x3be’ -C5 —color 或者 jstack 163|vim +/0x3be - 找
到有问题的代码




