记一次排查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.找到了具体执行的代码就可以具体问题具体分析了.
喜欢我的博客就请点赞+【关注】一波
分类:
工作积累
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构