RabbitMQ内存消耗

RabbitMQ内存消耗

0cool

RabbitMQ提供rabbitmqctl status命令用来查看rabbitmq消耗内存的情况,这是在本机上执行的结果:

[{pid,11911},
 {running_applications,
     [{rabbitmq_management_visualiser,"RabbitMQ Visualiser","3.3.5"},
      {rabbitmq_tracing,"RabbitMQ message logging / tracing","3.3.5"},
      {rabbitmq_management,"RabbitMQ Management Console","3.3.5"},
      {rabbitmq_management_agent,"RabbitMQ Management Agent","3.3.5"},
      {rabbit,"RabbitMQ","3.3.5"},
      {os_mon,"CPO  CXC 138 46","2.2.7"},
      {rabbitmq_web_dispatch,"RabbitMQ Web Dispatcher","3.3.5"},
      {webmachine,"webmachine","1.10.3-rmq3.3.5-gite9359c7"},
      {mochiweb,"MochiMedia Web Server","2.7.0-rmq3.3.5-git680dba8"},
      {amqp_client,"RabbitMQ AMQP Client","3.3.5"},
      {xmerl,"XML parser","1.2.10"},
      {inets,"INETS  CXC 138 49","5.7.1"},
      {mnesia,"MNESIA  CXC 138 12","4.5"},
      {sasl,"SASL  CXC 138 11","2.1.10"},
      {stdlib,"ERTS  CXC 138 10","1.17.5"},
      {kernel,"ERTS  CXC 138 10","2.14.5"}]},
 {os,{unix,linux}},
 {erlang_version,
     "Erlang R14B04 (erts-5.8.5) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:30] [kernel-poll:true]\n"},
 {memory,
     [{total,67385688},
      {connection_procs,5408},
      {queue_procs,5408},
      {plugins,611776},
      {other_proc,9372568},
      {mnesia,64360},
      {mgmt_db,50248},
      {msg_index,34160},
      {other_ets,1131704},
      {binary,33200},
      {code,17757687},
      {atom,1619705},
      {other_system,36699464}]},
 {alarms,[]},
 {listeners,[{clustering,25672,"::"},{amqp,5672,"0.0.0.0"}]},
 {vm_memory_high_watermark,0.8},
 {vm_memory_limit,1573470208},
 {disk_free_limit,1000000000},
 {disk_free,10575826944},
 {file_descriptors,
     [{total_limit,65435},
      {total_used,3},
      {sockets_limit,58889},
      {sockets_used,1}]},
 {processes,[{limit,1048576},{used,187}]},
 {run_queue,0},
 {uptime,526}]

执行结果中memory部分就是当前内存的消耗情况,可以清楚地了解到总的内存消耗以及分布情况,主要细分成了以下几个类别:

 

连接

这部分主要包含了连接和通道(channel)所消耗的内存,也包含了SSL系统所使用的内存。

队列

队列占用的内存指的是队列进程消耗的,并不包含消息体(在二进制中)。当内存不足时,这部分的内存将交换到磁盘上。

插件

插件使用的内存不包含连接rabbit服务器的Erlang客户端和数据库所占用的部分,通常包含像一些协议插件如STOMP和MQTT。

其它进程内存

除了上面所提到的以外的进程所消耗的部分,这里的进程是erlang虚拟机中的概念,最近被GC回收的内存会展现在这里。

Mnesia

Mnesia保存了一份磁盘上的数据拷贝到内存,意味着当有大量队列、交换机、绑定、用户信息或虚拟主机时会消耗大量的内存。

message store索引

保存了所有消息的索引,包括那些被交换到磁盘上的消息。

管理数据库

前提是启用了管理插件,在集群中它只会出现在一个节点中。

其它ETS表

除了上面三个集合以外的内存表。

二进制

erlang虚拟机所使用的共享二进制数据,消息体的内存消耗包含在这部分。

代码

代码所消耗的内存,一般为常量。

Atoms

atoms消耗的内存,一般为常量。

其它系统内存

Erlang所消耗的其他内存,比如可用文件描述符的统计。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RabbitMQ是一种消息中间件,用于实现不同应用程序之间的通信。内存积压是指RabbitMQ中消息队列持续增加,消费者无法及时处理和消耗队列中的消息,导致队列中的消息越来越多,进而占用越来越多的内存空间。 造成RabbitMQ内存积压的原因可能有多种。首先,消费者处理消息的速度可能较慢或者不稳定,无法及时处理队列中的消息。其次,生产者发送消息的速度可能过快,导致消息队列迅速增长。此外,由于消费者异常退出或者网络问题,也可能导致消息队列中的消息不能及时消耗。 解决RabbitMQ内存积压的方法有多种。首先,可以通过增加消费者的数量,提高消息处理的速度。其次,可以优化消费者的处理逻辑,确保消费者能够高效地处理消息。另外,可以调整生产者的消息发送速度,避免过快地发送消息。如果遇到消费者异常退出的情况,可以及时处理并重启消费者,保证消息能够被正常消耗。 除了以上方法,还可以通过设置RabbitMQ的一些参数来调整内存使用情况,例如设置队列的最大长度和最大内存使用量,避免内存过载。另外,可以通过配置死信队列来处理无法被消费的消息,以防止消息堆积。 总之,解决RabbitMQ内存积压需要综合考虑消费者、生产者和RabbitMQ本身的因素,通过优化消息处理逻辑、调整消息发送速度和设置合适的参数,保证消息队列能够稳定地运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值