问题描述
在生产环境中部署java程序CPU飙到了300%以上,直接上图,开始排查
原因分析:
- 使用top指令查看飙高的进程PID
2. 使用指令ps -mp pid -o THREAD,tid,time | sort -rn查看进程里面占用比较高的线程TID
前面几个居高不下,排查一下 - 然后将需要的线程ID转换为16进制格式,使用指令printf “%x\n” tid
- 最后打印线程的堆栈信息 到了这一步具体看堆栈的日志来定位问题了,使用指令jstack pid |grep tid -A 30
可以看到是因为这个线程在占用所导致的,查看其他几个也是这个disruptor在搞的鬼
百度了一下YieldingWaitStrategy,这是Disruptor下面的等待策略,怎么说呢,YieldingWaitStrategy性能是Disruptor里面最好,但是它的实现机制是让出cpu使用权,保证cpu不会空闲,从而使得cpu始终处于工作态,因此该策略会使用100%的CPU,建议慎用。修改成BlockingWaitStrategy策略
直接看对比12641对比27323