概述
本文分析在使用storm过程中可能出现的问题,及其解决办法。
实战问题和解决办法
修改worker节点上的工作进程(worker process)数量
问题描述
我们知道,每个worker节点上都可能有多个工作进程(worker process)运行,每个工作进程运行storm的spout或bolt服务。
有时,我们需要增加或减少worker节点上的工作进程数量。
解决办法
在storm.yaml配置文件中,有一个参数:supervisor.slots.ports,该参数定义了一个工作进程(worker process)监听消息的端口列表。例如:
supervisor.slots.ports
- 6701
- 6702
- 6703
- 6704
若要增加一个工作进程,只需要再该列表中添加一个端口即可。修改配置文件后,需要重启Supervisor进程:
/opt/storm/bin/storm supervisor
- 说明
storm的work节点会默认在这些端口上:6701, 6702, 6703, 和6704分别开启一个工作进程。当添加端口时需要通过netstat等命令检查该端口是否已经被占用。
另外,还需要查看系统打开文件最大数是否有限制。
修改工作进程的占用内存(jvms)
问题描述
有时我们需要增加或减少在worker节点上运行的worker process的jvm的内存。在storm.yaml配置文件中修改如下参数:
supervisor.childopts: "... -Xms512m -Xmx1024m ..."
另外,要注意,选项:–Xms和–Xmx最好相同。
查看toplogy运行的工作节点/进程
可以通过stromUI来查看toplogy的运行节点,和运行的进程情况。
可以通过查看Executors这一栏来知晓。
worker节点上的CPU抢占
问题描述
若Storm拓扑的吞吐量低于预期,可能需要检查运行拓扑的工作节点以查看是否存在CPU争用。
其中一个简单查看CPU使用情况的命令就是sar命令:
sar -u 1 3
参数-u:表示检查所有CPU的使用情况,参数1:表示每隔1秒检查一次,参数3:表示共检查3次
解决办法
若发现CPU的使用率很高,我们可以从以下几个方面来解决这个问题:
- 增加worker节点的可用CPU数量,该操作在虚拟机环境下比较实用。
- 换成更加强大的CPU。
- 添加更多的worker机器节点,减少每个worker节点上的工作进程数量。
减少worker进程的数量的场景
在以下两种情况下可以减少worker节点上的工作进程数量:
- 在你的storm集群节点上,有没有使用的工作进程,此时可以在对应的节点上减少工作进程

说明:图中,黑色的方块表示topology A的工作进程,灰色的方块表示topology B的工作进程,白色表示没有使用的工作进程。
解读:根据上图,我们知道:该集群有4个worker节点,每个节点都有4个工作进程,但其中有两个节点的4个工作进程都是没有使用的,而另外两个节点的4个工作进程分别被toplogy A和B占满了,说明在这两个工作节点上发生了CPU抢占。
解决办法:看右图,把每个节点上的工作进程减少到2,正好满足要求,此时工作进程平均分配在4个工作节点上。
- 在集群的worker节点上,已经没有任何可以使用的工作进程了,此时需要添加worker节点来扩展集群。

说明:上图的黑色表示toplogy A的工作进程,而灰色表示toplogy B的工作进程。
从图上可以看出:4个工作节点都被工作进程占满,此时需要扩展工作节点(见右图)。可以看到,每个工作节点上的工作进程减少了,当然CPU负载也会相应的减少。
小结:若在使用云例如AWS,进行CPU的扩展是很轻松的事情,但要是CPU不能修改,只能添加更多的工作节点来分担计算任务。
工作节点上的I/O抢占
工作节点上的I/O抢占可以分为以下两类:
- 磁盘的I/O抢占:文件系统的读写操作
- 网络I/O抢占:从网络的socket中读写数据
对于某些toplogy来说,通常会发生这两种I/O抢占问题,我们要做的第一步是要确定工作节点是否发生了I/O抢占,进而确定发生了哪一种I/O抢占。
如何查找I/O抢占
- 通过sar
查看是否发生I/O抢占简单的方式是通过命令sar,这和检测是否发生CPU抢占的命令一样,但关注的列不同。
sar -u 1 3
我们需要关注的列是:%iowait这一列。
CPU空闲的时间百分比,在此期间系统具有未完成的磁盘I/O请求。若该值大于10%,则说明遇到了I/O抢占,此时的性能可能会下降。若大于20%,说明就比较严重了。
网络/socket I/O的抢占
- 由于打开文件数量的限制
在运行toplogy时,需要通过网络传输数据,也需要开启大量的端口。而很多OS对开启端口的数量都有限制,默认情况下是1024个。这个数量级的端口很快会被占用,所以需要在运行storm的工作节点上修改这个限制。
# 查看运行toplogy的进程号
-bash-3.2$ ps aux | grep MY-TOPOLOGY-NAME
stormuser 12345 18.2 …
# 查看该进程下的打开文件数的限制
-bash-3.2$ cat /proc/12345/limits
...
Max open files 1024 1024 files
...
- 解决办法
可以通过两种办法来解决这个问题:
(1) 添加工作节点
(2) 修改操作系统对打开文件数量的限制
修改/etc/security/limits.conf文件:
* soft nofile 128000
* hard nofile 25600
建议数量不要大于128k。
磁盘I/O抢占
-
问题描述
可以通过iotop命令来查看各个进程读写磁盘的性能。若发现storm频繁的读写磁盘,需要对toplogy进行修改。 -
解决办法
- 写少量的数据到磁盘
- 使用更快的磁盘
- 不要把数据写入到NFS文件系统,因为这样会消耗网络资源,让写入性能更慢。
总结
本文对storm在实际过程中常用的一些问题和解决办法进行了说明。