RabbitMQ队列msg_store_transient耗尽磁盘空间故障咨询
RabbitMQ msg_store_transient磁盘占用过高问题排查与解决方案
问题根因方向
msg_store_transient是RabbitMQ存储非持久化消息(delivery-mode=1)的目录,正常情况下消费完成的消息会被自动清理,出现磁盘占用持续暴涨重启后恢复的情况,主要分为业务消费逻辑异常和版本兼容bug两类原因。
排查步骤
- 执行命令查看队列堆积情况:
rabbitmqctl list_queues name messages messages_unacknowledged consumers
重点检查是否存在队列消息总量远超业务预期、未确认消息占比极高的情况。如果是该问题,优先排查消费者逻辑:是否存在消费后未手动ack、消费者进程阻塞无法返回ack的问题,未确认的消息无论是否持久化都不会被RabbitMQ删除,会持续占用存储空间。 - 执行命令查看临时存储的有效数据大小:
rabbitmqctl eval 'rabbit_msg_store:info(msg_store_transient).'
如果返回的有效数据量远小于磁盘实际占用的10G,即可确认是RabbitMQ与Erlang版本兼容导致的临时消息存储垃圾回收失效bug。你所使用的Erlang 1:24.0.2-1与RabbitMQ 3.8.16-1存在已知兼容问题:Erlang 24.0.x的底层I/O逻辑变更,和RabbitMQ 3.8.x的临时存储碎片回收逻辑不兼容,已消费的消息不会被真正从磁盘文件中删除,只有服务重启时才会释放对应磁盘空间,完全匹配你遇到的现象。
解决方案
过渡方案
- 修改
/etc/rabbitmq/rabbitmq.conf配置,添加以下参数:msg_store_transient_gc_threshold = 100MB调低临时存储垃圾回收阈值,强制触发碎片整理disk_free_limit.absolute = 2GB配置磁盘最低预留空间,避免磁盘完全占满导致服务崩溃
- 低峰期定时重启RabbitMQ释放磁盘空间,可作为临时过渡手段。
永久修复方案
- 方案1:将RabbitMQ升级到3.9.x及以上稳定版本,该版本已适配Erlang 24.x的I/O逻辑,修复了临时存储泄漏bug
- 方案2:如果无法升级RabbitMQ版本,将Erlang降级到23.x稳定版本,Erlang 23.x与RabbitMQ 3.8.16不存在该兼容问题。
内容的提问来源于stack exchange,提问作者Rajat Jain
相关产品推荐
相关产品推荐

