私が持っている2ダートアプリですアマゾン(AWS Ubuntuの)、上で実行されている:ダートVMのクラッシュの原因を検出する方法
- セルフホストのHTTP API タイマー上のバックグラウンドタスクを処理
- ワーカー
どちらのアプリケーションも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) {}
}
}
クラッシュに関する情報を含むコンソール出力はありませんか? AWSの外で(ローカルマシンのシェル内で)再現できますか? –
私は、再生するタイミングが大幅に増加してローカルで実行しようとしましたが、できませんでした。スーパバイザスクリプトはstdoutをファイルに書き出しており、そのファイルには明示的に書いているものを超えるものはありません。まるで正常に終了したかのようです。 –
stderrをファイルにリダイレクトしたと仮定しますか? –