【问题标题】:Reduce RabbitMQ memory usage减少 RabbitMQ 内存使用
【发布时间】:2011-09-22 19:56:24
【问题描述】:

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

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

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

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

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

编辑:

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

根据启动 RabbitMQ 之前的 htop/free,我坐在大约 453mb 的使用过的内存中,而在启动 RabbitMQ 之后,我大约是 650mb。增加近 200mb。会不会是 200mb 是 RabbitMQ 运行的下限?

编辑 2

Here are some screenshots 的 ps aux 和 free 在启动 RabbitMQ 之前和之后以及显示 RabbitMQ 启动时内存峰值的图表。

编辑 3

我还检查了没有启用插件,它几乎没有什么区别。看来我拥有的插件(管理及其先决条件)只增加了大约 8mb 的内存使用量。

编辑 4

我不再有这个服务器来测试,但是,有一个 conf 设置 delegate_count 设置为默认值 16。据我所知,这为 rabbitmq 生成了 16 个 sup-procs。在较小的服务器上降低此数字可能有助于减少内存占用。不知道这是否真的有效,也不知道它如何影响性能,但可以尝试一下。

【问题讨论】:

    标签: memory-management erlang rabbitmq


    【解决方案1】:

    在 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 版本上运行 - 理想情况下,您应该使用最新的稳定版本运行。

    【讨论】:

    • 当我使用vm_memory_high_watermark 时,它在日志中报告了正确的内存限制(基于 VPS 的实际 900mb,而不是我购买的 512mb)。当设置为 5% 时,日志显示为 45mb,但生成的每个 erlang 进程使用了​​ 20 到 25mb 的内存,这很快让我超过了 512mb 的分配。
    • 当你说“每个 erlang 进程”时,你是指 OS erlang 进程还是 erlang 内部进程?
    • 当我运行 htop 时,我看到大约 30 个 /usr/lib/erlang/erts-5.7.4/bin/beam.smp -W w -K true -A30 -P 1048576,然后是一些与 RabbitMQ 和 mnesia 相关的标志。
    • 不好。 RabbitMQ 应该只作为一个 OS 进程运行。您是否有可能在测试中遗留了一些实例。尝试killall beam.smp 摆脱它们。我刚刚验证了我可以在我的机器上运行一个 100MB 的 RabbitMQ 实例。
    • 当我停止 rabbitmq (/etc/init.d/rabbitmq-server stop) 时,所有进程都会消失。运行top 时,它显示单个rabbitmq-server 进程和单个beam.smp 进程。但是,当我运行 htop 时,我看到了所有的 beam.smp 过程。在我killall beam.smp 之后,rabbitmq-server 进程消失了。再次启动它后,我会得到与以前相同的结果。
    【解决方案2】:

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

    将预取限制降低到合理的值,比如 100,Rabbit 会将剩余的消息保留在服务器上的磁盘上,直到客户端真正准备好处理它们,并且您的内存使用量将大大降低客户端和服务器。

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

    【讨论】:

      猜你喜欢
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-19
      • 2020-01-01
      • 2021-06-30
      • 2016-04-19
      相关资源
      最近更新 更多