定位 RabbitMQ 内存一直上涨的原因

前言

因业务需要,项目中用到了许多延时队列,采用 RabbitMQ 的延时队列插件实现。

ps

紧急情况下,可以修改内存阈值,重启生效

echo "vm_memory_high_watermark.relative = 0.8" >> /etc/rabbitmq/rabbitmq.conf

因为和内存有关自然而然就想到,会不会是因为节点是 RAM 节点导致的,但是单节点情况下默认是 DISK 节点,所以这个可以排除。

查看内存

点击节点
在这里插入图片描述
内存用了好多,快撑不住了。
在这里插入图片描述
查看内存使用情况
在这里插入图片描述
可以看到 internal database tables 占用了特别多的内存
在这里插入图片描述
有关 internal database tables ,顾名思义,就是内部数据库的表

使用 rabbitmqctl status 命令查看内存使用情况

在这里插入图片描述
发现 mnesia 占用了大部分内存。

通过官方文档发现 mnesia 和 internal database tables 的关系
https://www.rabbitmq.com/memory-use.html

Mnesia 是一个分布式数据库,RabbitMQ 使用它来存储有关用户、交换器、队列和绑定的信息。

网上大部分都会说,消息不存储在数据库中,但是 rabbitmq-server 的 mkuratczyk 在 issues 回复我说,延时队列是个例外。
https://github.com/rabbitmq/rabbitmq-server/issues/5080

获取 mnesia 中各个表中数据条数

rabbitmqctl eval 'mnesia:schema().' | grep -E 'Properties|size'
root@myRabbit2:/# rabbitmqctl eval 'mnesia:schema().' | grep -E 'Properties|size'
-- Properties for gm_group table ---
size -> 0
-- Properties for mirrored_sup_childspec table ---
size -> 0
-- Properties for rabbit_delayed_messagerabbit@myRabbit2 table ---
size -> 6008272
-- Properties for rabbit_delayed_messagerabbit@myRabbit2_index table ---
size -> 1051188
-- Properties for rabbit_durable_exchange table ---
size -> 12
-- Properties for rabbit_durable_queue table ---
size -> 5

可以看到延时队列的表数据量在600w左右,这些消息都是不满足延时条件的,一旦延时条件满足,这些消息就会回到队列中,等待被消费。

问题定位完毕,因为延时队列的特殊性,消息在延时条件满足前需要存在 mnesia 中,而 mnesia 的数据会加载到内存中。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
RabbitMQ是一种消息中间件,用于实现不同应用程序之间的通信。内存积压是指RabbitMQ中消息队列持续增加,消费者无法及时处理和消耗队列中的消息,导致队列中的消息越来越多,进而占用越来越多的内存空间。 造成RabbitMQ内存积压的原因可能有多种。首先,消费者处理消息的速度可能较慢或者不稳定,无法及时处理队列中的消息。其次,生产者发送消息的速度可能过快,导致消息队列迅速增长。此外,由于消费者异常退出或者网络问题,也可能导致消息队列中的消息不能及时消耗。 解决RabbitMQ内存积压的方法有多种。首先,可以通过增加消费者的数量,提高消息处理的速度。其次,可以优化消费者的处理逻辑,确保消费者能够高效地处理消息。另外,可以调整生产者的消息发送速度,避免过快地发送消息。如果遇到消费者异常退出的情况,可以及时处理并重启消费者,保证消息能够被正常消耗。 除了以上方法,还可以通过设置RabbitMQ的一些参数来调整内存使用情况,例如设置队列的最大长度和最大内存使用量,避免内存过载。另外,可以通过配置死信队列来处理无法被消费的消息,以防止消息堆积。 总之,解决RabbitMQ内存积压需要综合考虑消费者、生产者和RabbitMQ本身的因素,通过优化消息处理逻辑、调整消息发送速度和设置合适的参数,保证消息队列能够稳定地运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值