当load飙升时问题排查思路
load:系统平均负载被定义为在特定时间间隔内运行队列中(在CPU上运行或者等待运行多少进程)的平均进程数。如果一个进程满足以下条件则其就会位于运行队列中:
- 它没有在等待I/O操作的结果
- 它没有主动进入等待状态(也就是没有调用’wait’)
- 没有被停止(例如:等待终止)
我们可以通过系统命令uptime、w、top等查看当前load average情况
[root@CNC-BJ-5-3N1 ~]# w
20:01:55 up 76 days, 8:20, 6 users, load average: 1.30, 1.48, 1.69
-
第一位1.30:表示最近1分钟平均负载
-
第二位1.48:表示最近5分钟平均负载
-
第三位1.69:表示最近15分钟平均负载
PS. linux系统是5秒钟进行一次Load采样
load统计的是总的数据,需要每个看到的数值都除以逻辑cpu数,然后和0.7对比。重点看15分钟,也就是第三个数值。
查看cpu
1、查看CPU信息
# 总核数 = 物理CPU个数 X 每颗物理CPU的核数
# 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X
超线程数
# 查看物理CPU个数
cat
/proc/cpuinfo| grep "physical id"| sort|
uniq| wc -l
物理CPU:主板上实际插入的cpu数量
# 查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq
cpu核数:单块CPU上面能处理数据的芯片组的数量
#
查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc
-l
逻辑cpu数:一般情况下,逻辑cpu=物理CPU个数×每颗核数,如果不相等的话,则表示服务器的CPU支持超线程技术(HT:简单来说,它可使处理器中的1 颗内核如2 颗内核那样在操作系统中发挥作用。这样一来,操作系统可使用的执行资源扩大了一倍,大幅提高了系统的整体性能,此时逻辑cpu=物理CPU个数×每颗核数x2)
# 查看CPU信息(型号)
cat
/proc/cpuinfo | grep name | cut -f2 -d:
| uniq -c
----------------------------------------------------------------------------------------------------------------------
排查思路:
1、top 查看当前cpu情况,找到占用cpu过高的进程PID,如123
2、top -Hp123 找出占用cpu过高的线程,记录下PID 如1,2,转换成十六进制。printf "%x\n" 21742
3、jstack -l 123>test.txt打印出当前进程的线程栈。
4、查找到对应第二步两个线程运行栈,分析代码。
实际