在这里先对load值简单说明一下,它是linux系统或unix系统下cpu的待处理和正在处理的任务的任务队列,有两个因素会导致load打高:
(1)cpu处理不过来
(2)io处理不过来导致等待处理的线程数飙升

load是系统平均负载被定义为在特定时间间隔内运行队列中(在CPU上运行或者等待运行多少进程)的平均进程数。如果一个进程满足以下条件则其就会位于运行队列中:
  a. 它没有在等待I/O操作的结果
  b. 它没有主动进入等待状态(也就是没有调用’wait’)
  c. 没有被停止(例如:等待终止)


常用的系统命令uptime、w、top等可以查看当前load average情况

[root@master01 ~]# w
10:45:18 up 1 day, 15:04,  1 user,  load average: 0.35, 0.31, 0.27
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.102.248  10:29    0.00s  0.02s  0.00s w

其中load average中:
第一位0.35:表示最近1分钟平均负载
第二位0.31:表示最近5分钟平均负载
第三位0.27:表示最近15分钟平均负载

PS. linux系统是5秒钟进行一次Load采样:load统计的是总的数据,需要每个看到的数值都除以逻辑cpu数,重点看load_15分钟,即第三个数值。

查看CPU信息
总核数 = 物理CPU个数 X 每颗物理CPU的核数
总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数

查看物理CPU个数
物理CPU:主板上实际插入的cpu数量

cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

查看每个物理CPU中core的个数(即核数)
请在这里输入引用内容cpu核数:单块CPU上面能处理数据的芯片组的数量

cat /proc/cpuinfo| grep "cpu cores"| uniq

查看逻辑CPU的个数
逻辑cpu数:一般情况下,逻辑cpu=物理CPU个数×每颗核数,如果不相等的话,则表示服务器的CPU支持超线程技术(HT:简单来说,它可使处理器中的1 颗内核如2 颗内核那样在操作系统中发挥作用。这样一来,操作系统可使用的执行资源扩大了一倍,大幅提高了系统的整体性能,此时逻辑cpu=物理CPU个数×每颗核数x2)

cat /proc/cpuinfo| grep "processor"| wc -l

查看CPU信息(型号)

cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c

排查思路:

1、top 查看当前cpu情况,找到占用cpu过高的进程PID,如123

2、top -Hp123 找出占用cpu过高的线程,记录下PID 如1,2,3 转换成十六进制。printf "%x\n" 21754

3、jstack -l 123>test.txt打印出当前进程的线程栈。

4、查找到对应第二步两个线程运行栈,分析代码。