Отладка тайм-аутов Эрланга - PullRequest
3 голосов
/ 13 апреля 2011

Я использую программу heart для перезапуска узла Erlang, когда он перестает отвечать на запросы.Однако мне трудно понять, почему узел зависает.Журналы SASL не показывают никаких ошибок, и мои собственные журналы, кажется, не показывают ничего замечательного, происходящего в те времена.Кто-нибудь может дать совет по отладке такого рода вещей?

Ответы [ 3 ]

2 голосов
/ 17 апреля 2011

По умолчанию сердечная программа выдает SIGKILL, чтобы убить не отвечающую виртуальную машину, чтобы она могла быстро запустить новую.Это делает получение любой полезной информации о виртуальной машине практически невозможным.Что-то, что я пробовал в прошлом, - это исправление сердечной программы, чтобы избежать жесткого уничтожения, и вместо этого заставить виртуальную машину создать аварийный дамп и 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, "

Как вы можете видеть, с этим патчем сердце сначала выдаст SIGUSR1, чтобы попытаться заставить ВМ создатьаварийная свалка.Так как это может занять некоторое время, сердце спит 4 секунды.Возможно, вам придется увеличить время сна, если вы не получаете полных аварийных дампов.После этого heart дважды пытается выдать SIGQUIT в надежде получить coredump, а в случае неудачи выдает SIGKILL.

. Обратите внимание, что этот патч замедлит перезапуск виртуальной машины сердца из-завремя ожидания аварийных дампов и coredumps.Если вы используете его в производстве, помните об этом ограничении.

1 голос
/ 14 апреля 2011

Вы можете попытаться вызвать erlang:halt/1 с вашего HEART_COMMAND, создав таким образом аварийный дамп с не отвечающего узла.

Вы можете попробовать использовать инструмент erl_call, например -a erlang halt 123.

Если узел erlang не может ответить на этот вопрос, это тоже интересная информация.

Вы пытались увеличить значение `HEART_BEAT_TIMEOUT?Возможно, узел просто немного застрял и пропустил таймаут, но не завис.

1 голос
/ 13 апреля 2011

Если у вас есть представление о том, почему он замерзает, вы можете попробовать отследить модуль, используя dbg.

http://www.erlang.org/doc/man/dbg.html

Коротко попробуйте

dbg:tracer(), dbg:p(all,c), dbg:tpl(Module, Function, x).

Если вы хотите остановить эту проблему трассировки

dbg:ctpl()

См. Документацию для получения дополнительной информации.

Примечание: Измените модуль и функцию на то, что вы хотите отследить, оставьте x как есть.Вы также можете пропустить Function и указать только Module, x.

Предупреждение: запуск этого в действующей системе может быть опасным, поскольку объем информации, которая будет напечатана в оболочке, может быть огромным.

...