记录一次CPU 100% 问题排查

1. top命令上的 us 表示CPU已经使用的百分比

2. 拿到最高的java进程 pid执行 top -H -p 114369 查看该进程下的线程列表

3. 可以排序 ctrl +p , 找到CPU使用最高的线程,并记录他的PID,由于线程的PID是10进制的,jvm中是用16进制打印日志的。

就需要把线程PID转换成16进制

4. 使用jstack命令,将进程运行的日志打印到文件里 (参数放进程ID)。 jstack 114369 > jstack.txt,注意事项:执行命令的用户得是进程的所属用户

5. 查看线程 导致CPU百分百的线程的关键日志, cat jstack.txt | grep -A 10 -i nid=0x1bed9 。 这个地方放十六进制的线程PID

6. 结果分析:通过日志可以分析出是,log4j2引起的调用。com.lmax.disruptor.BusySpinWaitStrategy.waitFor 说明disruptor的策略采用的是BusySpinWaitStrategy,这种会导致多线程在等待锁的时候不停的自旋锁。导致占有CPU时间过长,和消耗CPU能效。

最后通过代码的pom文件发现引入了Ecs的log依赖

7.解决方案:通过查看源码查找到可以使用JVM参数修改disruptor的策略。

-DAsyncLogger.WaitStrategy=sleep 更改成

8. 加上后重启服务,使用top命令查看cpu百分比

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值