erlang - “找不到下一个堆大小:18446744071789822643,偏移量 0”
问题描述
我写了一个模拟器,它分布在两个主机上。当我启动几千个进程时,在编写了大约 10 分钟和 50 万个事件后,我的主 Erlang (OTP v22) 虚拟机崩溃并显示以下消息:
no next heap size found: 18446744071789822643, offset 0
.
它始终是同一个数字 - 18446744071789822643。
因为我的服务器非常强大,所以故障转储也很大,我无法在无头服务器(未安装 WX)上查看它。
关于我可以查看的内容有什么提示吗?
我可以尝试调试此问题的第一件事是什么?
解决方案
首先,看看怎么memory()
说:
> memory().
[{total,18480016},
{processes,4615512},
{processes_used,4614480},
{system,13864504},
{atom,331273},
{atom_used,306525},
{binary,47632},
{code,5625561},
{ets,438056}]
检查哪一个正在增长 - processes
, binary
, ets
?
如果是processes
,请尝试i().
在进程运行时输入 Erlang shell。你会看到类似的东西:
Pid Initial Call Heap Reds Msgs
Registered Current Function Stack
<0.0.0> otp_ring0:start/2 233 1263 0
init init:loop/1 2
<0.1.0> erts_code_purger:start/0 233 44 0
erts_code_purger erts_code_purger:wait_for_request 0
<0.2.0> erts_literal_area_collector:start 233 9 0
erts_literal_area_collector:msg_l 5
<0.3.0> erts_dirty_process_signal_handler 233 128 0
erts_dirty_process_signal_handler 2
<0.4.0> erts_dirty_process_signal_handler 233 9 0
erts_dirty_process_signal_handler 2
<0.5.0> erts_dirty_process_signal_handler 233 9 0
erts_dirty_process_signal_handler 2
<0.8.0> erlang:apply/2 6772 238183 0
erl_prim_loader erl_prim_loader:loop/3 5
寻找一个堆很大的进程,这就是你开始寻找内存泄漏的地方。
(如果你不是无头运行,我建议用 启动 Observer observer:start()
,然后看看 Erlang 节点中发生了什么。)