调试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。 警告:在实时系统上运行此命令可能会很危险,因为要打印到外壳上的信息量可能非常庞大。     

要回复问题请先登录注册