背景
公司核心交易链路业务使用RocketMQ承载,集群规模为NameSrv 2台,Broker 集群2组 为2主2从同时在线,异步刷盘,异步复制,打开写堆外内存。
起因
生产环境使用AWS日本云实例,RocketMQ B组Master节点所在物理机突然宕机,在处理过程中B组Master A节点在恢复服务不久后进程Crash导致离线(时间不等)。
过程
- 生产环境AWS宕机
- 切换RocketMQ B套Slave节点为Master恢复服务
- 控制台重启B套Master所在云实例
- 原B套Master节点修改为Slave节点
- 启动
- 运行一段时间后发现B套Slave(原Master)自动离线
分析
SSH终端进入机器后查看发现进程消失
查看日志发现无法分配内存。
查看GC log,期间运维多次重启。
查看GC log发现并无异常。
经排查,JVM分配内存并未超过实例内存总数,并且该节点机基本无其他进程。
cat /proc/<pid>/status
cat /proc/<pid>/maps |wc -l
查看后发现VM映射超限
cat /proc/sys/vm/max_map_count
65530
本实例max_map_count为65530,查询其余3个节点均为655360。
原因
sudo sysctl -w vm.max_map_count=655360
os.sh内核参数调优脚本中:sysctl -w参数为临时生效,重启后失效。
解决
执行os.sh或手动修改参数生效。
相关
事后在RocketMQ Issue发现同样问题。
Issue:https://github.com/apache/rocketmq/issues/1100
调优脚本链接:https://github.com/apache/rocketmq/blob/master/distribution/bin/os.sh