这就是我在rabbitmq消息代理中得到的
=信息报告==== 2015 年 1 月 13 日::12:40:24 === vm_memory_high_watermark 设置。使用内存:478063864 允许:415868518
=警告报告==== 13-Jan-2015::12:40:24 === 在节点“rabbit@matchpointgps-141110”上设置内存资源限制警报。
* 发布者将被阻止,直到此警报清除*
这种情况在我们的服务器上发生过两次。 我仍然无法找到正确的解决方案。
当队列长度变得非常高并且它尝试将消息写入磁盘但速度不够快时,我们遇到了类似的问题。在我们的测试中,当我们使用SSD驱动器时,没有出现这个问题。
对我们来说最简单的解决方案是通过在消息上设置 Durable=true 将消息立即写入磁盘。这也是一个好主意,因为如果兔子重新启动,队列中的数据不会丢失。
我在 docker 上运行的rabbitMQ 服务器中遇到了类似的问题。一切都被封锁了,兔子不会接受任何消息。
我只是重新配置了磁盘可用空间限制:
rabbitmqctl set_disk_free_limit 1GB
这改变了“xx GiB低水位线”并解决了问题。
如果您使用“bitnami/rabbitmq”docker 镜像,您可以使用以下命令设置此变量:
RABBITMQ_DISK_FREE_ABSOLUTE_LIMIT: "1GB"
看看这篇关于 RabbitMQ 队列如何使用内存的博客文章:http://www.rabbitmq.com/blog/2011/10/27/performance-of-queues-when-less-is-more/
TL;DR 尽量让队列保持空
终于找到了一些更好的rabbitmq队列配置。
我在 celery 配置中添加了以下行,因为它为每个任务创建一个额外的队列。
CELERY_IGNORE_RESULT = True
还为我的任务创建了单独的队列。 这可以保持内存空闲并准备好承担更繁重和更长的任务
默认情况下,如果 RabbitMQ 开始使用超过 40% 的可用内存,它将阻止传入消息。如果您打开“rabbitmq.conf”文件(通常保存在计算机上的 AppData 文件夹中),您可以增加该文件。我通过添加以下行将其更改为 90%:
vm_memory_high_watermark.relative = 0.9
执行此操作后,您必须重置 RabbitMQ 服务才能看到效果。