RabbitMQ二进制内存消耗
根据下面的图片(Rabbit 3.6.6-1),我想知道当“二进制引用”/“细分”上没有显示相同的内存使用情况时,“二进制文件”使用的所有内存在哪里 有人能开导吗? 我怀疑有些东西需要“清理”。。。但是什么呢 这种“二进制文件”的大量消耗也可以在有4个队列且没有消息的机器上看到 2017年7月17日编辑: 我们发现,这主要是因为我们打开和关闭了到rabbitmq的多个连接,这似乎无法以干净的方式释放内存RabbitMQ二进制内存消耗,rabbitmq,ubuntu-14.04,Rabbitmq,Ubuntu 14.04,根据下面的图片(Rabbit 3.6.6-1),我想知道当“二进制引用”/“细分”上没有显示相同的内存使用情况时,“二进制文件”使用的所有内存在哪里 有人能开导吗? 我怀疑有些东西需要“清理”。。。但是什么呢 这种“二进制文件”的大量消耗也可以在有4个队列且没有消息的机器上看到 2017年7月17日编辑: 我们发现,这主要是因为我们打开和关闭了到rabbitmq的多个连接,这似乎无法以干净的方式释放内存 已使用内存的最大部分与任何特定消息(屏幕截图中的“二进制引用”部分)都没有关联,这表明此内
已使用内存的最大部分与任何特定消息(屏幕截图中的“二进制引用”部分)都没有关联,这表明此内存正由操作系统资源使用,而不是由RabbitMQ直接管理。我最大的怀疑是开放式连接 为了测试这个理论,您可以运行
netstat
,看看是否得到类似的结果(假设您在默认端口-5672上运行rabbitmq):
有趣的部分是显示“计时器关闭”的最后一列。这表明此连接没有使用keepalives,这意味着如果客户端死了,而没有机会正常关闭资源,它们将在那里晃来晃去,吃掉资源
有两种方法可以避免此问题:
- TCP保留页
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