当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、查找到对应第二步两个线程运行栈,分析代码。

实际

posted @ 2019-02-22 16:34  贱贱的小帅哥  阅读(366)  评论(0编辑  收藏  举报