编辑
2023-04-04
运维
00
请注意,本文编写于 533 天前,最后修改于 533 天前,其中某些信息可能已经过时。

目录

前言
方法一
方法二
案例分析
场景描述
解决过程
解决办法

前言

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

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

方法一

第一步:使用

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

找到占用CPU过高的进程的pid

第二步:使用

top -H -p [进程id]

找到进程中消耗资源最高的线程的id

第三步:使用

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

将线程id转换为16进制(字母要小写)

bc是linux的计算器命令

第四步:执行

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

查看线程状态信息

方法二

第一步:使用

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

找到占用CPU过高的进程

第二步:使用

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

获取线程信息,并找到占用CPU高的线程

第三步:使用

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

将需要的线程ID转换为16进制格式

第四步:使用

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

打印线程的堆栈信息

案例分析

结合上面来做。

场景描述

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

解决过程

1、根据top命令,shift+p,发现PID为41673的Java进程占用CPU高达250%,出现故障。 在这里插入图片描述2、找到该进程后,如何定位具体线程或代码呢,首先显示线程列表,并按照CPU占用高的线程排序:

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

显示结果如下: 在这里插入图片描述 3.将需要的线程TID转换为16进制格式

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

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

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

解决办法

1、根据top命令,shift+p,发现PID为41673的Java进程占用CPU高达250%,出现故障。 在这里插入图片描述 2、根据pid查看他的进程看看是什么服务占用这么高

bash
ps -ef |grep -v grep | grep 41673

在这里插入图片描述 3、查看到是一个java进程占用这么高,然后看看有没有用,没有用的话就杀掉它

bash
kill -9 41673

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

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Gustav

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!