【问题标题】:erlang crash dump no more index entrieserlang崩溃转储没有更多的索引条目
【发布时间】:2017-01-19 23:46:38
【问题描述】:

我对 erlang 有疑问。
我的一个 Erlang 节点崩溃,并生成 erl_crash.dump,原因是 atom_tab 中没有更多索引条目 (max=1048576)
我检查了转储文件,发现有很多原子形式为'B\2209\000...,(大约1000000个条目)

=proc:<0.11744.7038>
State: Waiting
Name: 'B\2209\000d\022D.
Spawned as: proc_lib:init_p/5
Spawned by: <0.5032.0>
Started: Sun Feb 23 05:23:27 2014
Message queue length: 0
Number of heap fragments: 0
Heap fragment data: 0
Reductions: 1992
Stack+heap: 1597
OldHeap: 1597
Heap unused: 918
OldHeap unused: 376
Program counter: 0x0000000001eb7700 (gen_fsm:loop/7 + 140)
CP: 0x0000000000000000 (invalid)
arity = 0

你对它们有什么经验吗?

【问题讨论】:

  • 跟踪中的信息表明,Pid &lt;0.11744.7038&gt; 的进程注册为 'B\2209\000d\022D,它具有 gen_fsm 行为,并且它是由 spawn 或 spawn_link 或 spawn_monitor (M ,F,A) 调用。这应该可以帮助您在代码中找到它。此外,Pid 值表明在 VM 中启动了大量进程。这可能意味着您有很多并行进程,或者有很多重试。

标签: erlang crash-dumps


【解决方案1】:

原子 默认情况下,最大原子数为 1048576。可以使用 +t 选项提高或降低此限制。

注意:一个原子指的是一个原子表,它也消耗内存。对于此表中的每个唯一原子,原子文本存储一次。原子表不是垃圾回收的。

我认为你的程序中产生了很多原子,原子的数量达到了原子的数量限制。

当你启动你的 erlang 节点时,你可以使用这个+t 选项来改变你的 erlang VM 中 atom 的数量限制。

【讨论】:

  • 是的,我确实产生了很多进程,但这些进程没有注册,所以我认为它们不应该有“名称”。但是为什么它有一个奇怪的名字,比如“'B\2209\000d\022D”。
  • 您可以阅读此链接以获取 erlang 故障转储。erlang.org/doc/apps/erts/crash_dump.html。来自文档Name: 代表一个进程的名称。
【解决方案2】:

所以它告诉你,你生成原子。在某处list_to_atom/1 使用可变参数调用。因为您有使用这种名称的进程,所以您 register/2 使用这种名称进行进程。它可能是您的代码或您使用的某些第三方模块。这是不好的行为。不要这样做,也不要使用正在这样做的模块。

说实话,我可以想象我会故意做的设计,但这是非常特殊的情况,当你问这个问题时显然不是这样。

【讨论】:

  • 不不不,没有''B\2209\000d\022D'这样的名字。在我的代码中,没有第三部分代码。我猜它在 erl_crash.dump 中有一些特殊的含义。
  • @ruanhao:我没有这样的要求。我写道,您在代码中的某处使用list_to_atom/1
  • 谢谢你,你是对的,我的代码有问题,比如“register([x,x,x,x,x], self())”,导致崩溃我居然没有找到它。
  • @ruanhao:很奇怪。此代码应引发 badarg 错误。
  • 它是 register(list_to_atom([x,x,x,x]), self()),这就是我用完原子索引的原因。
猜你喜欢
  • 2013-11-23
  • 2013-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-19
  • 2014-10-30
  • 2011-02-16
  • 1970-01-01
相关资源
最近更新 更多