客户那遇 storm 处理日志延迟较为严重问题,然后做了以下调整。
在固定 kafka 分区数 100 的情况下,spout 并发数从 30 增到 60,开始几分钟,延迟维持在10秒较合理,5分钟后再看延迟500秒了,反比 spout 并发数 30 时还高,几次测下来都是如此,但CPU利用率明显提上来了。
查看 supervisor 容器的 worker.log 日志有 “received invalid message for unknown tasks….. “警告,导致了 supervisor 容器重启,另外日志里同时伴有警告 “Thread-4 [WARN] <<<WARNING>>>: 90% of memory used: max:742M used:730。“,因此判断此问题很可能是由内存不足引起的。
映射出 supervisor 容器的 storm.yaml,然后添加如下设置:
# 对每个worker的java内存参数进行调整(注意冒号后面必须加空格,否则 supervisor 跑步起来) worker.childopts: "-Xmx4096m" worker.heap.memory.mb: 4096 topology.worker.max.heap.size.mb: 4096.0
更多 storm 默认参数请参考官方此配置:defaults.yaml
改好后重启 k8s supervisor 容器,检查 supervisor.log 日志,能找到 worker.childopts: “-Xmx4096m”、worker.heap.memory.mb: 4096、topology.worker.max.heap.size.mb: 4096.0 三处,说明配置生效了。
于是再次使用刚才的 spout 并发数 60 来测试,大半天过去,结果延迟维持在5秒以内,非常满意:
测试附表:
Kafka分区数 | StormLogSpout 数 | 5分钟观察延迟 | 10分钟观察延迟 | supervisor 进程 cpu峰值 |
100 | 30(tasks:128、workers:1) | 10-40秒 | 170-250秒 | 280% |
100 | 60(tasks:248、workers:1) | 1-3秒 | 1-8秒 | 450% |
Storm调优可参考:Storm调优(optimiaze)
另外,测试过程中, spout 进程数增加会导致 连不上 zookeeper,这是因为 zookeeper 默认并发连接数是60,改成0就就不受此限制了。