apache storm停用拓扑会导致高cpu利用率

xqk2d5yq  于 2021-06-24  发布在  Storm
关注(0)|答案(1)|浏览(420)

我遇到了一个问题,停用apachestorm拓扑的cpu使用率很高。我可以使用下面的步骤可靠地重新创建问题,但我还没有确定确切的原因或解决方案。
该环境是一个storm集群,其中有1个拓扑正在运行(拓扑非常简单,我使用了感叹号示例)。它是非活动的。最初,cpu的使用是正常的。然而,当我杀死所有管理器上的所有拓扑jvm进程并让storm再次重新启动它们时,我发现一段时间后(约9小时),每个jvm进程的cpu使用率上升到近100%。我已经测试了一个活动的拓扑结构,它不会发生这种情况。我还测试了多个拓扑,并在它们处于非活动状态时观察到相同的结果。
重新创建步骤:
在apache storm集群上运行1拓扑
停用它
杀死所有管理器上的所有拓扑jvm进程(storm将重新启动它们)
观察所有非活动拓扑jvm进程在supervisors上的cpu使用率几乎达到100%。
环境
apache storm 1.1.0运行在3个虚拟机、1个nimbus和2个管理器上。
群集摘要:
主管:2人
已用插槽:2个
可用插槽:38
插槽总数:40
执行人:50人
任务:50
拓扑有2个worker和50个executors/task(线程)。
目前调查情况:
除了能够可靠地重新创建问题之外,对于受影响的拓扑jvm进程,我还确定了使用最多cpu的线程。进程中总共有102个线程,97个被阻止,5个在本地。使用最多cpu的线程是相同的,共有23个线程(均处于阻塞状态):

Thread 28558: (state = BLOCKED)
 - sun.misc.Unsafe.park(boolean, long) @bci=0 (Compiled frame; information may be imprecise)
 - java.util.concurrent.locks.LockSupport.parkNanos(long) @bci=11, line=338 (Compiled frame)
 - com.lmax.disruptor.MultiProducerSequencer.next(int) @bci=82, line=136 (Compiled frame)
 - com.lmax.disruptor.RingBuffer.next(int) @bci=5, line=260 (Interpreted frame)
 - org.apache.storm.utils.DisruptorQueue.publishDirect(java.util.ArrayList, boolean) @bci=18, line=517 (Interpreted frame)
 - org.apache.storm.utils.DisruptorQueue.access$1000(org.apache.storm.utils.DisruptorQueue, java.util.ArrayList, boolean) @bci=3, line=61 (Interpreted frame)
 - org.apache.storm.utils.DisruptorQueue$ThreadLocalBatcher.flush(boolean) @bci=50, line=280 (Interpreted frame)
 - org.apache.storm.utils.DisruptorQueue$Flusher.run() @bci=55, line=303 (Interpreted frame)
 - java.util.concurrent.Executors$RunnableAdapter.call() @bci=4, line=511 (Compiled frame)
 - java.util.concurrent.FutureTask.run() @bci=42, line=266 (Compiled frame)
 - java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) @bci=95, line=1142 (Compiled frame)
 - java.util.concurrent.ThreadPoolExecutor$Worker.run() @bci=5, line=617 (Interpreted frame)
 - java.lang.Thread.run() @bci=11, line=745 (Interpreted frame)

我通过使用 jstack 要获取进程的线程转储,请执行以下操作:

jstack -F <pid> > jstack-<pid>.txt

以及 top 要标识使用最多cpu的进程内的线程,请执行以下操作:

top -H -p <pid>

以前有人遇到过这个或类似的问题吗?任何帮助都将不胜感激。

lo8azlld

lo8azlld1#

发生此问题的原因是disruptorqueue中的ringbuffer已满,并且当发布线程试图声明一个插槽时,它们实际上在执行locksupport.parknos(1l)时被卡住了。根据我对风暴吉拉的评论

相关问题