如何解决调试Erlang心脏超时
| 当无响应的时候,我使用心脏程序重新启动Erlang节点。但是,我发现很难理解为什么节点冻结。 SASL日志没有显示任何错误,而我自己的日志似乎没有显示任何可观的事件。有人可以提供调试此类建议的建议吗?解决方法
您可以尝试从
HEART_COMMAND
调用erlang:halt/1
,从而从无响应的节点创建故障转储。
您可以尝试将erl_call
工具与-a erlang halt 123
如果erlang节点无法响应,这也是有趣的信息。
您是否尝试增加`HEART_BEAT_TIMEOUT?也许节点只是陷入了一点泥潭,错过了超时但没有冻结。
,默认情况下,心脏程序会发出一个“ 4”来杀死无响应的VM,以便它可以快速启动一个新的VM。这使得获取有关VM的任何有用信息几乎是不可能的。我过去尝试过的工作是修补Heart程序,以避免硬杀,而是让VM创建崩溃转储和coredump。我使用了这样的补丁(此补丁用于Erlang / OTP R14B02):
--- erts/etc/common/heart.c.orig 2011-04-17 12:11:24.000000000 -0400
+++ erts/etc/common/heart.c 2011-04-17 12:12:36.000000000 -0400
@@ -559,10 +559,11 @@
int res;
if(heart_beat_kill_pid != 0){
pid = (pid_t) heart_beat_kill_pid;
- res = kill(pid,SIGKILL);
+ res = kill(pid,SIGUSR1);
+ sleep(4);
for(i=0; i < 5 && res == 0; ++i){
sleep(1);
- res = kill(pid,SIGKILL);
+ res = kill(pid,i < 2 ? SIGQUIT : SIGKILL);
}
if(errno != ESRCH){
print_error("Unable to kill old process,"
如您所见,使用此补丁程序,心脏将首先发出“ 6”字样,以尝试使VM创建故障转储。由于这可能需要一段时间,因此心脏会睡眠4秒钟。如果您没有获得完整的崩溃转储,则可能必须增加此睡眠时间。之后,heart尝试两次发行twice7ѭ,以期获得核心转储,如果失败,则发行SIGKILL
。
请注意,由于需要等待故障转储和核心转储所需的时间,此修补程序将减慢心脏VM的重启速度。如果在生产中使用它,请注意此限制。
,如果您对冻结的原因有任何想法,可以尝试使用dbg跟踪模块。
http://www.erlang.org/doc/man/dbg.html
简而言之
dbg:tracer(),dbg:p(all,c),dbg:tpl(Module,Function,x).
如果您想停止此跟踪问题
dbg:ctpl()
请参阅文档以获取更多信息。
注意:将“模块和功能”更改为要跟踪的内容,请保持x不变。您也可以跳过“功能”,而仅给出“模块” x。
警告:在实时系统上运行此命令可能会很危险,因为要打印到外壳上的信息量可能非常庞大。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。