top
之后使用 shift + p 按照 cpu 排序,查到的pid 为 80136
接下来使用 top -Hp pid ,然后使用 shift+p 按cpu排序,查找出来占用 cpu 高的线程 threadId。
top -Hp 737
之后使用 shift + p 按照 cpu 排序
查到的对应 threadId 为 741.
接下来使用 printf ‘%xn’ threadId ,将上一步找到的 pid 转换成 16 进制;
printf ‘%xn’ 741
输出结果为2e5
之后使用 jstack 获取线程信息 jstack PID | grep threadId
jstack 737 | grep 2e5
我们就能找到是哪个线程占用 cpu 高
最后使用 jstack pid(进程pid)>stack.dump 将进程堆栈打印出来
jstack 737>stack.dump
然后分析一下对应线程里面堆栈的调用关系,看看我们业务代码哪个方法使用cpu高。
最后通过:eclipse memory analyzer 分析:如下图所示
ZooKeeper#ClientCnxn#EventThread 无界队列积压了太多的任务;导致消费不过来啦;
问题原因:
因为我们是通过Elastic-job执行任务的, 在业务代码中,有很多 耗时的长任务,但是他的触发时间为 1s执行一次,但是消费跟不上。积压的任务频繁的FULL-GC、CPU高居不下;
处理方法:
通过设置 Elastic-job 的 :misfire 设置为:false(默认为true),这样就不会有短时间大量的积压任务
参数解释:
1、如果一个任务JOB的调度频率为每10s一次,在某个时间,该job执行耗时用了33s(平时只需执行5s),按照正常调度,应该后续会触发3次调度,那该job后执行完,会连续执行3次调度吗?
答案:在33s这次任务执行完成后,如果后面的任务执行在10s内执行完毕的话,只会触发一次,不会补偿3次,因为ElasticJob记录任务错失执行,只是创建了misfire节点,并不会记录错失的此时,因为也没这个必要。



