减少RabbitMQ内存使用量

时间:2011-06-26 02:17:38

标签: memory-management erlang rabbitmq

我正在尝试在小型VPS(512mb RAM)上运行RabbitMQ以及Nginx和其他一些程序。我已经能够毫无困难地调整其他所有内存的使用情况,但我似乎无法让RabbitMQ使用更少的RAM。

我认为我需要减少Erlang用于RabbitMQ的线程数,但是我无法让它工作。我还尝试将vm_memory_high_watermark设置为低于默认值(40%)的几个不同值,即使低至5%。

部分问题可能是VPS提供程序(MediaTemple)允许我查看我分配的内存,因此当使用free或top时,它显示服务器大约有900mb。

有什么建议可以减少RabbitMQ的内存使用量,或者限制Erlang创建的线程数量?我相信Erlang正在使用30个线程,基于我在进程命令中看到的-A30标志。

理想情况下,我希望RabbitMQ内存使用率低于100mb。

修改

vm_memory_high_watermark设置为5%(或配置文件中为0.05),RabbitMQ日志报告RabbitMQ的内存限制设置为51mb。我不确定51mb来自哪里。当前VPS分配的内存为924mb,因此其中5%应为46mb左右。

根据启动RabbitMQ之前的htop / free,我坐在453mb左右的ram上,启动RabbitMQ后我大约650mb。增加近200mb。可能是200MB是RabbitMQ运行的下限吗?

修改2

启动RabbitMQ之前和之后的ps辅助和释放的{p> Here are some screenshots以及启动RabbitMQ时显示内存峰值的图表。

编辑3

我也检查过没有启用插件,但它没什么区别。似乎我拥有的插件(管理及其先决条件)仅增加了大约8mb的RAM使用。

编辑4

我不再需要使用此服务器进行测试,但是,有一个conf设置delegate_count设置为默认值16.据我所知,这会为rabbitmq产生16个sup-proc。在较小的服务器上降低此数字可能有助于减少内存占用。不知道这是否真的有效,或者它如何影响性能,但这是值得尝试的。

2 个答案:

答案 0 :(得分:9)

在RabbitMQ中限制内存使用的适当方法是使用vm_memory_high_watermark。你说:

  

我也试过设置   vm_memory_high_watermark为几个   低于默认值的不同值(   40%),甚至低至5%。

应该有效,但可能没有您期望的那样。在日志中,您将找到一条线,告诉您绝对内存限制是什么,如下所示:

=INFO REPORT==== 29-Oct-2009::15:43:27 ===
Memory limit set to 2048MB.

您需要根据需要调整内存限制 - 如果您在VPS环境中运行,Rabbit可能会将您的系统视为拥有比您想象的更多的RAM。

有时候,Rabbit无法分辨你所使用的系统并使用1GB作为基点(因此默认情况下你的限制为410MB)。

另外,请确保您运行的是支持vm_memory_high_watermark设置的RabbitMQ版本 - 理想情况下,您应该使用最新的稳定版本运行。

答案 1 :(得分:1)

确保设置适当的QoS预取值。默认情况下,如果有客户端,Rabbit服务器会将其为该客户端队列发送的任何消息发送给客户端。这导致客户端和客户端上的大量内存使用。服务器。

将预取限制降低到合理的范围,例如100,并且Rabbit会将剩余的消息保留在服务器上的磁盘上,直到客户端真的准备好处理它们为止,并且你的内存使用量将会减少。客户&服务器。

请注意,100的建议只是一个合理的起点 - 它确实胜过无穷大。要真正优化该数字,您需要考虑客户端能够处理的消息/秒,网络的延迟以及每条消息的平均大小。