1.美图

设备 cpu使用率SNMP java cpu使用率-1%_CPU负载

1.概述

1.1 CPU负载和CPU利用率的区别是什么?

首先,我们可以通过uptime,w或者top命令看到CPU的平均负载。

设备 cpu使用率SNMP java cpu使用率-1%_CPU负载_02


设备 cpu使用率SNMP java cpu使用率-1%_利用率_03

Load Average :负载的3个数字,比如上图的4.86,5.28,5.00,分别代表系统在过去的1分钟,5分钟,15分钟内的系统平均负载。他代表的是当前系统正在运行的和处于等待运行的进程数之和。也指的是处于可运行状态不可中断状态平均进程数

如果单核CPU的话,负载达到1就代表CPU已经达到满负荷的状态了,超过1,后面的进行就需要排队等待处理了。

如果是是多核多CPU的话,假设现在服务器是2个CPU,每个CPU2个核,那么总负载不超过4都没什么问题。

怎么查看CPU有多少核呢?

通过命令cat /proc/cpuinfo | grep "model name"查看CPU的情况。

设备 cpu使用率SNMP java cpu使用率-1%_利用率_04


通过cat /proc/cpuinfo | grep "cpu cores"查看CPU的核数

设备 cpu使用率SNMP java cpu使用率-1%_CPU负载_05


CPU 利用率:和负载不同,CPU利用率指的是当前正在运行的进程实时占用CPU的百分比,他是对一段时间内CPU使用状况的统计。

1.1.1 特别好的例子

我举个栗子🌰:

负载:假设你们公司厕所有1个坑位,有一个人占了坑位,这时候负载就是1,如果还有一个人在排队,那么负载就是2。

利用率:如果在1个小时内,A上厕所花了10分钟,B上厕所花了20分钟,剩下30分钟厕所都没人使用,那么这一个小时内利用率就是50%。

1.2 那如果CPU负载很高,利用率却很低该怎么办?

CPU负载很高,利用率却很低,说明处于等待状态的任务很多,负载越高,代表可能很多僵死的进程。通常这种情况是IO密集型的任务,大量请求在请求相同的IO,导致任务队列堆积。

同样,可以先通过top命令观察(截图只是示意,不代表真实情况),假设发现现在确实是高负载低使用率。

设备 cpu使用率SNMP java cpu使用率-1%_利用率_06


然后,再通过命令ps -axjf查看是否存在状态为D+状态的进程,这个状态指的就是不可中断的睡眠状态的进程。处于这个状态的进程无法终止,也无法自行退出,只能通过恢复其依赖的资源或者重启系统来解决。(对不起,我截不到D+的状态)

设备 cpu使用率SNMP java cpu使用率-1%_利用率_07

1.3.那如果负载很低,利用率却很高呢?

如果你的公司只有一个厕所,外面没人排队,却有一个人在里面上了大半个小时,这说明什么?

两种可能:他没带纸,或者一些奇怪的事情发生了?

这表示CPU的任务并不多,但是任务执行的时间很长,大概率就是你写的代码本身有问题,通常是计算密集型任务,生成了大量耗时短的计算任务。

怎么排查?直接top命令找到使用率最高的任务,定位到去看看就行了。如果代码没有问题,那么过段时间CPU使用率就会下降的。

1.4 那如果CPU使用率达到100%呢?怎么排查?

  1. 通过top找到占用率高的进程。

设备 cpu使用率SNMP java cpu使用率-1%_linux_08


2. 通过top -Hp pid找到占用CPU高的线程ID。这里找到958的线程ID

设备 cpu使用率SNMP java cpu使用率-1%_linux_09


3. 再把线程ID转化为16进制,printf "0x%x\n" 958,得到线程ID 0x3be

设备 cpu使用率SNMP java cpu使用率-1%_利用率_10

  1. 通过命令jstack 163 | grep '0x3be' -C5 --color 或者 jstack 163|vim +/0x3be - 找到有问题的代码

设备 cpu使用率SNMP java cpu使用率-1%_100_11