"no next heap size found: 18446744071789822643, offset 0"
"no next heap size found: 18446744071789822643, offset 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
,请尝试在 Erlang shell 中键入 i().
,而进程是 运行。您会看到如下内容:
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
寻找具有非常大堆的进程,这就是您开始寻找内存泄漏的地方。
(如果你不是 运行 headless,我建议使用 observer:start()
启动 Observer,然后查看 Erlang 节点中发生的情况。)
我写了一个模拟器,它分布在两个主机上。当我启动几千个进程时,在写入大约 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
,请尝试在 Erlang shell 中键入 i().
,而进程是 运行。您会看到如下内容:
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
寻找具有非常大堆的进程,这就是您开始寻找内存泄漏的地方。
(如果你不是 运行 headless,我建议使用 observer:start()
启动 Observer,然后查看 Erlang 节点中发生的情况。)