title: 记一次 RocketMQ broker 因内存不足导致的启动失败
date: 2021-01-12
updated: 2021-01-12
categories:
- RocketMQ
tags: - 消息中间件
- RocketMQ
背景
该小节交代问题发生的背景,急需解决问题的小伙伴,可以跳过本节,直接看下一小节。
因为项目提测,需要搭建一套测试环境。所以呢,是时候展示真正的技术啦!在搞定了容器、中间件、项目镜像后,小西登录系统对各大模块的功能进行测试。事情到了这里,小西本来应该会就这样愉快地完成了部署任务,可是生活总是会给你带来意想不到的“惊喜”。
-
在测试一类预警事件消息时,忽然发现压根没有消息,就去 RocketMQ 的控制台界面查看,发现控制台原本应该乖乖被监控的 broker 一个都不在了。
-
在不考虑 broker 不会自己罢工跑掉的情况下,登录服务器查看 broker 服务,发现服务没有启动成功。
-
再查看 broker 的启动日志,发现启动报错了。
于是,就有了这篇分享。
部署环境
操作系统:Centos7 Linux 系统
部署方式:Docker 容器 + docker-compose 容器编排
部署版本:RocketMQ 4.4.0
问题描述
开发环境访问 RocketMQ 控制台,发现 broker 服务宕机。登录服务器查看日志发现以下报错:
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 7163871232, 0) failed; error=
...
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 7163871232 bytes for Failed to commit area from 0x00000000c0000000 to
...
提示内存分配无法满足 7163871232 字节的需求。那为什么会出现这个问题呢?
问题定位
重启broker
刚开始没有排查日志时,以为环境被人停掉了,所以对 broker 进行了重启。
[root@172-30-1-135 nginx]# docker-compose restart
发现 broker 启动依旧失败,而 namesrv 和 console 启动正常。
分析启动脚本
登录 RocketMQ 的 docker 容器。
注意:因为 broker 无法启动,使用 docker exec 是无法进入容器的,需要使用 docker run 命令进入容器。
[root@37-128-2