异常信息
Caused by: org.apache.rocketmq.client.exception.MQBrokerException: CODE: 14
DESC: service not available now, maybe disk full, CL: 0.94 CQ: 0.94 INDEX: 0.94, maybe your broker machine memory too small.
异常背景
一个项目里面用到了rocketmq,往rocketmq里面发送数据的时候报错。
异常分析
该异常表明 RocketMQ Broker 服务不可用,主要与磁盘空间和内存资源相关。从异常信息里面看,mq服务不可用了,报错的可能原因是磁盘满了或者内存不足。
报错中的 CL: 0.94 CQ: 0.94 INDEX: 0.94 表示 CommitLog、ConsumeQueue 和索引文件的磁盘使用率已达94%。
CommitLog是消息的物理存储核心组件,所有消息按顺序追加写入CommitLog文件持久化(固定大小,通常1GB)。
ConsumeQueue 是逻辑消费队列,按Topic和队列维度构建索引文件,存储指向CommitLog的指针(含消息物理偏移量、大小等)。
解决办法
临时方法1:
清理磁盘空间,给RocketMQ 腾出足够的磁盘空间,博主这里就是因为C盘的空间满了。删除RocketMQ安装目录/logs/下的历史日志文件和清理RocketMQ安装目录/store/中已消费的消息文件,清理这两个大文件后释放了很多空间。
临时方法2:
修改 runbroker.cmd文件,文件最后增加一行:
JAVA_OPT="$JAVA_OPT -Drocketmq.broker.diskSpaceWarningLevelRatio=0.99"
放宽磁盘警戒比例至99%,重启RocketMQ服务。
长期优化方案1:
以windows环境为例,根据机器配置修改JVM参数,修改 runbroker.cmd文件(注意不是runserver.cmd),文件最后增加一行(示例为8GB内存机器):
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx2g -Xmn512m -XX:MetaspaceSize=128m"
内存分配比例
-Xms1g -Xmx2g:堆内存初始1GB,最大2GB(占总内存25%)
-Xmn512m:新生代设为堆内存的25%-50%(推荐512MB)
这个比例并不是固定不变的,根据实际情况进行调优。
长期优化方案2:
日志路径分离,将日志文件存储到独立磁盘中。