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百分比