2016-10-17 8 views
3

私が持っている2ダートアプリですアマゾン(AWS Ubuntuの)、上で実行されている:ダートVMのクラッシュの原因を検出する方法

  1. セルフホストのHTTP API
  2. タイマー上のバックグラウンドタスクを処理
  3. ワーカー

どちらのアプリケーションもPostgreSQLを使用しています。彼らは時々クラッシュするので、根本原因を見つけようとするだけでなく、2つのメインアプリが実行中であるかどうかを検出し、必要に応じて再起動するスーパーバイザースクリプトも実装しました。

ここで私が解決しなければならない問題は、スーパーバイザースクリプトがクラッシュしているか、VMがクラッシュしていることです。それは数日おきに起こります。

私はポーリングレートを10秒からずっと頻繁に(1 ns)に上げるとダーツ天文台で30MBを使い切ってガベージコレクトして起動するので、メモリリークとは思わないメモリ使用量が少なくても、サイクリングを続けます。

私はだと思います。無限ループはtry/catchで完全に囲まれているため、キャッチされない例外です。

私は他に何をしようとしているのですか? VMが実際にクラッシュした場合に検査できるVMダンプファイルはありますか?根本的な原因をデバッグする他の方法はありますか?ダーツは一度に数日間アプリを実行するには不安がありますか?

これは、スーパーバイザスクリプト内のコードの主要な部分である:

///never ending function checks the state of the other processes 
Future pulse() async { 
    while (true) { 
    sleep(new Duration(milliseconds: 100)); //DEBUG - was seconds:10 
    try { 
     //detect restart (as signaled from existence of restart.txt) 
     File f_restart = new File('restart.txt'); 
     if (await f_restart.exists()) { 
     log("supervisor: restart detected"); 
     await f_restart.delete(); 
     await endBoth(); 
     sleep(new Duration(seconds: 10)); 
     } 

     //if restarting or either proc crashed, restart it 
     bool apiAlive = await isRunning('api_alive.txt', 3); 
     if (!apiAlive) await startApi(); 
     bool workerAlive = await isRunning('worker_alive.txt', 8); 
     if (!workerAlive) await startWorker(); 

     //if it's time to send mail, run that process 
     if (utcNow().isAfter(_nextMailUtc)) { 
     log("supervisor: starting sendmail"); 
     Process.start('dart', [rootPath() + '/sendmail.dart'], workingDirectory: rootPath()); 
     _nextMailUtc = utcNow().add(_mailInterval); 
     } 

    } catch (ex) {} 
    } 
} 
+0

クラッシュに関する情報を含むコンソール出力はありませんか? AWSの外で(ローカルマシンのシェル内で)再現できますか? –

+0

私は、再生するタイミングが大幅に増加してローカルで実行しようとしましたが、できませんでした。スーパバイザスクリプトはstdoutをファイルに書き出しており、そのファイルには明示的に書いているものを超えるものはありません。まるで正常に終了したかのようです。 –

+0

stderrをファイルにリダイレクトしたと仮定しますか? –

答えて

1

あなたが展望を持っている場合あなたがクラッシュダンプを取得することができます。 curl localhost:<your obseratory port>/_getCrashDump

私は全くわからないんだけどこれが関連しているが、Process.startが、エラーで完了した場合にtry/catchによって捕捉されないと思われる未来を返します。

+0

Process.startは(私の場合は)分離モードで呼び出す必要があります。それはそれをより安定させるように思えます(しかし、理由を理解していない)。私は天文台のことを試してみる - ありがとう! –

関連する問題