ハートプログラムを使用して、Erlang ノードが応答しなくなったときに再起動します。ただし、ノードがフリーズする理由を理解するのは難しいと感じています。SASL ログにはエラーは表示されません。また、私自身のログには、その時点で特に注目すべきことは何も表示されていないようです。この種のデバッグについてアドバイスをくれる人はいますか?
3 に答える
デフォルトでは、ハートプログラムSIGKILL
は応答しないVMを強制終了するためにを発行し、新しいVMをすばやく起動できるようにします。これにより、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, "
ご覧のとおり、このパッチを使用すると、ハートは最初にを発行しSIGUSR1
て、VMにクラッシュダンプを作成させようとします。これにはしばらく時間がかかることがあるため、心臓は4秒間眠ります。完全なクラッシュダンプを取得していない場合は、このスリープ時間を長くする必要があるかもしれません。その後、ハートはSIGQUIT
コアダンプを取得することを期待して2回発行を試み、それが失敗した場合はを発行しSIGKILL
ます。
このパッチは、クラッシュダンプとコアダンプを待機するために必要な時間のために、ハートのVMの再起動を遅くすることに注意してください。本番環境で使用する場合は、この制限に注意してください。
から呼び出して、応答しないノードからクラッシュ ダンプを作成することができerlang:halt/1
ますHEART_COMMAND
。
erl_call
たとえば、ツールを使用してみることができます-a erlang halt 123
。
erlang ノードがこれに応答できない場合も、興味深い情報です。
HEART_BEAT_TIMEOUT を増やしてみましたか? おそらく、ノードが少し動かなくなっただけで、タイムアウトに失敗しましたが、フリーズしませんでした。
フリーズする理由がわかったら、dbg を使用してモジュールをトレースしてみてください。
http://www.erlang.org/doc/man/dbg.html
要するに試して
dbg:tracer(), dbg:p(all,c), dbg:tpl(Module, Function, x).
このトレースの問題を止めたい場合
dbg:ctpl()
詳細については、ドキュメントを参照してください。
注: Module と Function をトレースしたいものに変更し、x はそのままにしておきます。Function をスキップして Module, x のみを指定することもできます。
警告: これをライブ システムで実行すると、シェルに出力される情報の量が膨大になる可能性があるため、危険な場合があります。