RabbitMQ二进制内存消耗

RabbitMQ二进制内存消耗,rabbitmq,ubuntu-14.04,Rabbitmq,Ubuntu 14.04,根据下面的图片(Rabbit 3.6.6-1),我想知道当“二进制引用”/“细分”上没有显示相同的内存使用情况时,“二进制文件”使用的所有内存在哪里 有人能开导吗? 我怀疑有些东西需要“清理”。。。但是什么呢 这种“二进制文件”的大量消耗也可以在有4个队列且没有消息的机器上看到 2017年7月17日编辑: 我们发现,这主要是因为我们打开和关闭了到rabbitmq的多个连接,这似乎无法以干净的方式释放内存 已使用内存的最大部分与任何特定消息(屏幕截图中的“二进制引用”部分)都没有关联,这表明此内

根据下面的图片(Rabbit 3.6.6-1),我想知道当“二进制引用”/“细分”上没有显示相同的内存使用情况时,“二进制文件”使用的所有内存在哪里

有人能开导吗? 我怀疑有些东西需要“清理”。。。但是什么呢

这种“二进制文件”的大量消耗也可以在有4个队列且没有消息的机器上看到

2017年7月17日编辑: 我们发现,这主要是因为我们打开和关闭了到rabbitmq的多个连接,这似乎无法以干净的方式释放内存


已使用内存的最大部分与任何特定消息(屏幕截图中的“二进制引用”部分)都没有关联,这表明此内存正由操作系统资源使用,而不是由RabbitMQ直接管理。我最大的怀疑是开放式连接

为了测试这个理论,您可以运行
netstat
,看看是否得到类似的结果(假设您在默认端口-5672上运行rabbitmq):

有趣的部分是显示“计时器关闭”的最后一列。这表明此连接没有使用keepalives,这意味着如果客户端死了,而没有机会正常关闭资源,它们将在那里晃来晃去,吃掉资源

有两种方法可以避免此问题:

  • TCP保留页
TCP保留页 这些由内核处理。每当一个连接在一定时间内没有看到包时,内核就会尝试发送一些探测,以查看另一端是否还在。 由于当前的Linux(例如4.12)超时默认值非常高(7200秒+9次探测每75秒>2小时),rabbitmq

要激活它们,必须将其添加到
rabbitmq.config

[
  {rabbit, [
    ⋮
    {tcp_listen_options,
         [
         ⋮
         {keepalive,     true},
         ⋮
         ]
    },
    ⋮
  ]},
  ⋮
].
并且可能将超时时间降低到一些更合理的值。类似的方法可能会奏效(但当然是YMMV):

应用协议心跳 这些由实际的消息传递协议(例如AMQP、STOMP、MQTT)处理,但需要客户端选择加入。由于每个协议都是不同的,因此必须检查以在客户端应用程序中设置它

结论 从避免悬空资源的角度来看,最安全的选择是TCP keepalives,因为您不必依赖客户端应用程序的行为。 但是,它们的通用性较差,如果在高通量但“突发”的系统上配置不当,可能会导致性能下降,因为误报会导致重新连接

如果您需要在保持系统性能的同时避免此问题,那么应用程序协议hearbeats是更细粒度的选项,但它们需要更多的协调,即客户端必须选择加入并选择自己的合理超时。
由于您永远无法100%确保您的客户端不会在不优雅地关闭连接的情况下死亡,因此启用TCP keepalives作为回退(即使有更高的超时)也可能是一个好主意。

这里有解决方案吗?我们在3.6.10中也看到了同样的情况。目前我们只是将其固定在一个PHP脚本中,但我们仍然需要对此进行更多的调查。。。可能是AMQP库或类似库
[
  {rabbit, [
    ⋮
    {tcp_listen_options,
         [
         ⋮
         {keepalive,     true},
         ⋮
         ]
    },
    ⋮
  ]},
  ⋮
].
root@rabbitmqhost:~# sysctl net.ipv4.tcp_keepalive_intvl=30
root@rabbitmqhost:~# sysctl net.ipv4.tcp_keepalive_probes=3
root@rabbitmqhost:~# sysctl net.ipv4.tcp_keepalive_time=60