Erlang:内存使用数据的差异

Erlang:内存使用数据的差异,erlang,Erlang,当我运行WebSocket测试时,我发现了以下有趣的内存使用结果: 服务器已声明,没有连接 [{total,573263528}, {processes,17375688}, {processes_used,17360240}, {system,555887840}, {atom,472297}, {atom_used,451576}, {binary,28944}, {code,3774097}, {ets,271016}] 44 processes, System:705M,

当我运行WebSocket测试时,我发现了以下有趣的内存使用结果:

服务器已声明,没有连接

[{total,573263528},
 {processes,17375688},
 {processes_used,17360240},
 {system,555887840},
 {atom,472297},
 {atom_used,451576},
 {binary,28944},
 {code,3774097},
 {ets,271016}]
44 processes,
System:705M, 
Erlang Residence:519M
100K连接

[{total,762564512},
 {processes,130105104},
 {processes_used,130089656},
 {system,632459408},
 {atom,476337},
 {atom_used,456484},
 {binary,50160},
 {code,3925064},
 {ets,7589160}]
100044 processes,
System: 1814M, 
Erlang Residence: 950M
200K连接

(重新启动服务器并从0连接创建,而不是从案例2继续)

带有“System:”和“Erlang:”的数字是htop提供的,其他数字是来自erlangshell的memory()调用的输出。请查看总内存和erlang住宅内存。当没有连接时,这两者大致相同,有100K连接时,驻留内存略大于总内存,有200K连接时,驻留内存几乎是总内存的两倍


有人能解释吗?

对于您的问题,最可能的答案是内存碎片

分配操作系统内存非常昂贵,因此Erlang会尝试为您管理内存。
当Erlang分配内存时,它会创建一个名为“carrier”的实体,该实体由许多“块”组成。Erlang memory(total)报告所有块大小(实际使用的内存)的总和。OS报告所有载体大小之和(已使用和预分配的内存之和)。块大小和载波大小都可以从Erlang VM读取。如果(块大小)/(载波大小)最可能的查询答案是内存碎片

分配操作系统内存非常昂贵,因此Erlang会尝试为您管理内存。
当Erlang分配内存时,它会创建一个名为“carrier”的实体,该实体由许多“块”组成。Erlang memory(total)报告所有块大小(实际使用的内存)的总和。OS报告所有载体大小之和(已使用和预分配的内存之和)。块大小和载波大小都可以从Erlang VM读取。如果(块大小)/(载体大小)内存没有被虚拟机跟踪,而是由连接的系统句柄跟踪,也许?我们需要更多信息。来自erlang VM和系统。在操作系统端运行pmap,在erlang端运行进程摘要(例如,顶级队列持有者)。VM不跟踪内存,但可能会跟踪连接的系统句柄?我们需要更多信息。来自erlang VM和系统。在操作系统端运行pmap,在erlang端运行进程摘要(例如顶级队列持有者)。
[{total,952040232},
 {processes,243161192},
 {processes_used,243139984},
 {system,708879040},
 {atom,476337},
 {atom_used,456484},
 {binary,70856},
 {code,3925064},
 {ets,14904760}]
200044 processes,
System:3383M, 
Erlang: 1837M
recon_alloc:fragmentation(current).
recon_alloc:fragmentation(max).
erl +MBas aobf +MBlmbcs 512