记一次排查CPU高的问题

背景

将log4j.xml的日志级别从error调整为info后,进行压测发现CPU占用很高达到了90%多(之前也就是50%,60%的样子).

 

 

问题排查

 

排查思路:  看进程中的线程到底执行的是什么,导致CPU占用较高.

 

1. 使用top命令查看到底是哪个应用占用的cpu比较高

 

左边的图是日志级别为info CPU较高的服务器, 右边为输出级别为error cpu正常的服务器.

 

 

2. 使用top -Hp pid 命令查看进程中的线程

可以看到左边运行中的线程比右边要多(实际上左边运行状态的线程常态为30左右),接下来通过jstack命令查看这些线程到底在做什么

 

3. 将步骤2 找到的线程的pid 使用printf %x pid 转换为16进制,第四步使用

 

 

4. 使用jstack命令查找这个线程到底在做什么

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

示例: jstack 21125|grep -A 10 52f1 

-A 10表示查找到所在行的后10行。21233用计算器转换为16进制52f1,注意字母是小写。

 

这时候就可以看到具体线程执行的堆栈信息了, 可以看到有大量的线程都在执行一下的代码:

按照堆栈信息层层追踪找到了关键的属性:

 

 

查看配置文件:

 

该配置配置为true时log4j2将会获取堆栈的快照(snapshot),并遍历堆栈跟踪以查找位置信息,因此会消耗较多的时间.

 

将该配置关闭,解决了CPU高的问题

 

总结

 

排查CPU高的问题的思路:

1. 先查看对应的进程,看看是哪个进程消耗的多

2. 然后再去看进程中的线程到底在执行什么代码. 

3.找到了具体执行的代码就可以具体问题具体分析了.

posted @ 2021-11-05 15:34  lbr617  阅读(647)  评论(0编辑  收藏  举报