使用 java jstack 排查 storm 空闲时占用过高 cpu

By | 2022年8月25日

1. jstack 找出 cpu 过高线程

top 命令可以看到 Storm Workder 进程号是 81895,空闲状态却一直占用着 16% CPU:

用 java 堆栈跟踪工具 jstack 打印线程信息,命令是:/home/jdk1.8.0_171/bin/jstack 81895 > 81895.jdump 。发现线程一直在 waiting,其中的 0x1406b 等是十六进制表示的线程号:

上图有个 82299 的线程号是将十六进制转十进制后的。

执行命名 top -H -p 81895 显示进程 81895 下的线程信息:

可以看到,81895 里CPU使用率较高线程有:82025(16进制:14069)、82027(16进制:1406b)、82299(16进制:1417b),头两个线程名是 disruptor-flush 。

2. 两个disruptor-flush 线程CPU过高的处理

分析 storm 源码,最终可通过配置 stom.yml 的 topology.disruptor.batch.timeout.millis: 100 (默认为1ms)降低CPU,此配置会在实例化DisruptorQueue 时传入。这个值控制 disruptor-flush-trigger 线程每隔多久执行 disruptor-flush-pool。改后效果(disruptor-flush 没了):

3. 剩下 Thread9 和 Thread-15,结合日志分析与 spout 有关

2021-09-16 00:41:22.111 o.a.s.d.executor Thread-15-$mastercoord-bg0-executor[1 1] [INFO] Opened spout $mastercoord-bg0:(1)
2021-09-16 00:41:22.112 o.a.s.d.executor Thread-9-$mastercoord-bg1-executor[2 2] [INFO] Opened spout $mastercoord-bg1:(2)
2021-09-16 00:41:22.116 o.a.s.d.executor Thread-9-$mastercoord-bg1-executor[2 2] [INFO] Activating spout $mastercoord-bg1:(2)
2021-09-16 00:41:22.117 o.a.s.d.executor Thread-15-$mastercoord-bg0-executor[1 1] [INFO] Activating spout $mastercoord-bg0:(1)

修改配置 topology.sleep.spout.wait.strategy.time.ms: 100 (默认1ms)后,Thread9 和Thread15 也线程不再消耗CPU。

发表回复

您的电子邮箱地址不会被公开。