erlang - 调试 Erlang 心脏超时

标签 erlang heartbeat

我使用 heart当 Erlang 节点变得无响应时重新启动 Erlang 节点的程序。但是,我发现很难理解节点卡住的原因。 SASL 日志没有显示任何错误,而我自己的日志似乎也没有显示当时发生的任何异常情况。有人可以就调试这类事情提供建议吗?

最佳答案

默认情况下,heart 程序会发出一个 SIGKILL 来终止无响应的 VM,以便它可以快速启动一个新的。这使得几乎不可能获得有关 VM 的任何有用信息。我过去曾尝试过修补核心程序以避免硬杀,而是让虚拟机创建故障转储和核心转储。我使用了这样的补丁(这个补丁用于 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, "

如您所见,有了这个补丁,heart 将首先发出一个 SIGUSR1 来尝试让 VM 创建故障转储。由于这可能需要一段时间,因此心脏会休眠 4 秒。如果您没有获得完整的故障转储,则可能需要增加此休眠时间。之后,heart 会尝试两次发出 SIGQUIT,希望获得 coredump,如果失败,则发出 SIGKILL

请注意,由于等待故障转储和核心转储需要时间,此补丁会减慢 heart 的 VM 重启速度。如果您在生产中使用它,请注意此限制。

关于erlang - 调试 Erlang 心脏超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5649639/

相关文章:

erlang - Erlang仿真器信息语句是什么意思?

apache-kafka - Erlang 的行为真的有点像类继承吗?

erlang - 如何在 Erlang/Elixir 中执行不区分大小写的文件搜索

大量客户端的java心跳实现

java - 如何在 JVM 中强制/重现 Full GC?

functional-programming - Erlang 映射中的模式匹配键

actionscript-3 - 有什么方法可以将ActionScript 3中的常规字符串转换为Latin-1字符代码的ByteArray?

android - 如何识别手指在相机镜头上或不在android中?

ajax - Stack Exchange 如何检查新帖子/评论?

python - RabbitMQ 心跳与连接耗尽事件超时