Linux系统中CPU占用率较高问题排查思路与解决方法

这篇文章主要给大家介绍了关于Linux系统中CPU占用率较高问题排查思路与解决方法,文中通过示例代码介绍的非常详细,对大家学习或者使用Linux具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

前言


作为 Linux 运维工程师,在日常工作中我们会遇到 Linux服务器上出现CPU负载达到100%居高不下的情况,如果CPU 持续跑高,则会影响业务系统的正常运行,带来企业损失。


很多运维的同学遇到这种状况往往会不知所措,对于CPU过载问题通常使用以下两种方式即可快速定位:

方法一


第一步:查看系统进程,CPU资源占用情况,找到占用CPU过高的进程的pid

top命令,然后按shift+p按照CPU排序

第二步:找到进程中消耗资源最高的线程的id

top -H -p [进程id]

第三步:分析CPU过高的原因,将线程id转换为16进制(字母要小写)

echo ‘obase=16;[线程id]’ | bc或者printf “%x\n” [线程id]

bc是linux的计算器命令

第四步:查看 PID进程在内核调用情况

perf top -p 7574


如果是java应用可以使用jstack找到 CPU 消耗最多的线程方法堆栈,非 Java 应用可使用 perf


jstack [进程id] |grep -A 10 [线程id的16进制]”

方法二


第一步:查看系统进程,找到占用CPU过高的进程

top命令,然后按shift+p按照CPU排序

第二步:获取线程信息,并找到占用CPU高的线程

ps -mp pid -o THREAD,tid,time | sort -rn

第三步:将需要的线程ID转换为16进制格式

echo ‘obase=16;[线程id]’ | bc或者printf “%x\n” [线程id]

第四步:打印线程的堆栈信息

jstack pid |grep tid -A 30 [线程id的16进制]

案例分析


结合上面来做。

场景描述
生产环境下JAVA进程高CPU占用故障排查

解决过程
1、根据top命令,shift+p,发现PID为41673的Java进程占用CPU高达250%,出现故障。

在这里插入图片描述
2、找到该进程后,如何定位具体线程或代码呢,首先显示线程列表,并按照CPU占用高的线程排序:

[root@localhost ~]# ps -mp 41673 -o THREAD,tid,time | sort -rn


显示结果如下:

在这里插入图片描述

3.将需要的线程TID转换为16进制格式

[root@localhost ~]# printf "%x\n" 41846
a376


4、最后使用jstack命令打印出该进程下面的此线程的堆栈信息:

[root@localhost ~]# jstack 41673 |grep "a376" -A 30


解决办法

1、根据top命令,shift+p,发现PID为41673的Java进程占用CPU高达250%,出现故障。

在这里插入图片描述

2、根据pid查看他的进程看看是什么服务占用这么高

ps -ef |grep -v grep | grep 41673

在这里插入图片描述

3、查看到是一个java进程占用这么高,然后看看有没有用,没有用的话就杀掉它

kill -9 41673


4、再次top查看cpu整体就降下来了。


总结: 遇到CPU过高,首先定位哪个进程导致的,之后可以通过top -H -p pid命令定位到具体的线程。其次还要通jstack查看线程的状态,看看线程的个数或者线程的状态,如果线程数过多,可以怀疑是线程上下文切换的开销,我们可以通过vmstat和pidstat这两个工具进行确认。

CPU使用率过高的原因,大概有以下几种情况:
1、Java 内存不够或溢出导致GC overhead问题,GC overhead 导致的CPU 100%问题;
2、死循环问题,如常见的HashMap被多个线程并发使用导致的死循环 或者 死循环代码;
3、某些操作一直占用CPU
大多数都是因为线程无法终止或出现死循环等原因,但是仍然需要根据实际情况,具体问题具体分析

你可能感兴趣的:(linux,java,运维)