RabbitMQ内存消耗
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所消耗的其他内存,比如可用文件描述符的统计。