recon_memory¶
内存¶
recon:proc_count(memory, 3).
recon:proc_count(message_queue_len, 3).
垃圾回收:
Erlang的系统监控器:
% 检查发现系统还没有设置任何监控器
erlang:system_monitor().
% 当垃圾回收的时间超过 500 毫秒时就会得到通知消息
% 如果也想对堆的大小进行监控,可以去设置检查{large_heap,NumWords}
% 一开始不确定时,最好使用大一点的值,过小的值(如1 个 word 左右)会导致进程的 邮箱被通知消息撑满
erlang:system_monitor(self(), [{long_gc, 500}]).
% 显示消息结果
flush().
% 取消系统监控器
erlang:system_monitor().
% 确认取消成功
erlang:system_monitor().
检测泄漏:
检测引用计数型的 binary 泄漏非常容易
1.先测量一下每个进程中的 binary 引用列表(使用binary 属性)
2.强制做一次垃圾回收
3.再测量一次,最后计算差值
%显示出每个进程所持有的以及随后释放的 binary 数量的差值
erl> recon:bin_leak(Max). % 值-34意思是 调用之后的 refc binary 比调用前少34
[{<0.4.0>,-34,
[erl_prim_loader,
{current_function,{erl_prim_loader,loop,3}},
{initial_call,{erlang,apply,2}}]}
...
]
% 检查已分配内存
recon_alloc:memory(usage).
recon_alloc:memory(allocated).
recon_alloc:memory(allocated_type). % 然后可以和 erlang:memory()的结果进行比较
recon_alloc:fragmentation(current). % 打印出节点中不同分配器的使用率
recon_alloc:fragmentation(max). % 显示出在最大内存负载下分配器的使用情况(使用率很低的情况)
实例:
erl> recon_alloc:memory/1
参数:
1.used参数用来报告已分配的Erlang数据实际占用的内存大小
2.allocated参数用来报告VM保留的内存大小。包括:已使用的内存,以及虽未使用 但是 OS 已经分配出来的内存。如果需要应对 ulimit 或者想知道 OS 报告的值,这个数值正是所需的
3.unused参数用来报告由VM保留但是尚未分配出去的内存大小。其值等于allocated used
4.usage参数会返回已使用的和已分配的内存百分比(0.0..1.0)
erl> recon:scheduler_usage(1000). % 单位毫秒
[{1,1.5964303816665936e-5},
{2,1.4966071914968765e-5},
{3,0.97077683977997643},
{4,0.91084724863174823}
erl> length(processes()). % 进程数
erl> length(erlang:ports()).
erl> recon:port_types().
% *_inet 类型的端口基本上都是 socket,前缀指示出所使用的协议(TCP、UDP、SCTP)
% efile 类型表示文件,”0/1”、”2/2”则分别表示标准 I/O 通道(stdin 和 stdout)以及标准错误通道 (stderr)的文件描述符
% 其他类型基本上都会被赋予与其通信的驱动同样的名字,基本上都是port程序或者port驱动