Erlang 编写器消耗了 RabbitMQ 内存,并且没有内容被分页到磁盘

Erlang 编写器消耗了 RabbitMQ 内存,并且没有内容被分页到磁盘

我遇到过这样的情况:RabbitMQ 使用的总内存为 6.2 GB,其中 6.1 GB 由 Erlang 编写器使用。但是,我在硬盘上找不到这个大小的分页。如果 RabbitMQ 崩溃会发生什么?我会丢失所有数据吗?

内存利用率

请检查以下 rabbitmqctl 状态

{memory,

 [{total,6692084888},

  {connection_readers,99864},

  {connection_writers,25697536},

  {connection_channels,95040},

  {connection_other,1942280},

  {queue_procs,189536},

  {queue_slave_procs,0},

  {plugins,645288},

  {other_proc,14228968},

 {mnesia,101896},

  {mgmt_db,615664},

  {msg_index,14967232},

  {other_ets,5246072},

  {binary,6598589536},

  {code,22475925},

  {atom,883633},

  {other_system,6306418}]},

  {alarms,[memory]},

  {listeners,

 [{clustering,25672,"::"},

  {amqp,5672,"127.0.0.1"},

  {'amqp/ssl',5671,"::"},

  {'stomp/ssl',61614,"::"}]},

   {vm_memory_high_watermark,0.4},

   {vm_memory_limit,6687214796},

  {disk_free_limit,819462080},

  {disk_free,2658975744},

 {file_descriptors,

 [{total_limit,924},

  {total_used,23},

  {sockets_limit,829},

  {sockets_used,19}]},

  {processes,[{limit,1048576},{used,407}]},

   {run_queue,0},

   {uptime,151129}]
  1. 当 RabbitMQ 出现故障或崩溃时会发生什么?队列中的消息会丢失吗?或者发生什么情况?
  2. msg_store_persistent 和 msg_store_transient 有什么区别?

Erlang R16B03(erts-5.10.4)

RabbitMQ 版本 3.4.2

谢谢

答案1

  1. “当 RabbitMQ 出现故障或崩溃时会发生什么?队列中的消息会丢失吗?”

    这取决于您告诉 RabbitMQ 的内容。

    如果您使用持久队列,并且发布者发送持久消息,则丢失数据的风险很小,因为持久消息一到达持久队列就会写入磁盘。此外,RabbitMQ 还提供“确认”扩展让发布者知道消息何时真正排队,以及何时写入磁盘。

    如果您不使用持久队列和持久消息,则当代理重新启动或崩溃时消息将会丢失。

  2. “msg_store_persistent 和 msg_store_transient 之间有什么区别?”

    • msg_store_persistent包含持久队列中排队的持久消息。这些消息一进入队列就会写入磁盘。此外,在代理重新启动或崩溃后,它们仍然可用。
    • msg_store_transient包含已分页到磁盘以释放一些内存的其他消息。此消息存储在 RabbitMQ 启动期间基本上被清空。

关于您看到的内存消耗,自 3.4.2 版以来,RabbitMQ 中已修复了几个内存泄漏问题。如果您在较新版本中仍看到此行为,请详细描述您的工作负载。

相关内容