gpt4 book ai didi

erlang - 调试 Erlang 心脏超时

转载 作者:行者123 更新时间:2023-12-05 00:56:37 25 4
gpt4 key购买 nike

我使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com