1

以前の質問 ( OS によって node.js アプリが強制終了されるのを防ぐ) に続いて、ファイルをダウンロードする方法を再作成しました。

簡単に言うと、いくつかのビデオ ファイルをダウンロードする必要があります (テスト ファイルは 3 つのビデオ、mp4、約 3 分)。

Out of memory: kill process (node) score 824 or sacrifice child
Killed process (node)...

そのため、ビデオを次々とダウンロードして再試行しましたが、2回目のダウンロードでまったく同じメッセージが表示され、プログラムが強制終了されました.

コードのどの部分が間違っているかを確認する方法や、Linux がプロセスを強制終了するのを防ぐ方法はありますか?

ところで、3 つの同時ダウンロードは 1 つよりも多くのメモリを消費しませんか? では、なぜ私は次から次へと殺されるのが速いのでしょうか?

アプリはラズベリーパイで実行されており、GUI はなく、ラズビアンであり、実行中の唯一のアプリであると思います (システムプロセス以外)

編集:関数に関するいくつかの詳細と、現在どのように機能すると思いますか:アプリは、どのブラウザーでもなく、ノードで開始されます。次々と動画をダウンロードするのでメモリ消費が少ないと思っていたのですが、一気に連射しながらダウンロードするので違うようで、停止も理由は同じようです。

ここにダウンロード機能があります。

file_url のタイプはhttp://address.com/rpi/test.mp4です

function download (file_url, callback){
    var option={host:url.parse(file_url).host, port:80, path:url.parse(file_url).pathname};
    var file_name=url.parse(file_url).pathname.split('/').pop();
    var file=fs.createWriteStream(DOWNLOAD_DIR+file_name);
    //Seems to crash while here:
    http.get(options, function(res){
        res.on('data', function(data){
            file.write(data);
        }).on('end'), function(){
            file.end();
            callback(DOWNLOAD_DIR+file_name);
        });
    });
};

いくつかのファイルを正常にダウンロードしたので、この機能が機能すると確信しています。

ここで、ダウンロードを次のように作成しました: (この機能は完全に正しく動作しない可能性があります。デバッグは要求しません。終了することはありません。)

function download_all (list, callback){
    var i=0;
    function follow(){
        i=i+1;
        if (i<list.length){
            download(DOWNLOAD_ADD+list[i], follow);
        }
    }
    download(DOWNLOAD_ADD+list[0], follow);
}

EDIT2:

コア ダンプの方法や、Roman が提案した他の解決策がまだ見つからなかったので、ダウンロード中に process.memoryUsage を使用して印刷しました。

heapTotal は、プロセス全体で 20 000 000 から 25 000 000 の間でゆっくりと増加し、いくらか低下しています。heapUsed は急速に増加し、6 000 000 を超えると定期的に 2 000 000 まで低下し、12 000 000 で急上昇します。

プロセスが強制終了されたとき、最後の出力は次のとおりでした: rss: 428 707 840、heapTotal: 23 842 176、heapUsed: 5 854 164

私はまだそれを読む方法を確信していますが、プロセスがすべてのメモリを食べるには程遠いようです...

コア ダンプと /proc/ に関するドキュメントをまだ読んでいます。

EDIT3:

私の技術ディレクターは、ダウンロードがキャッシュされ、ファイル全体がディスクに書き込まれた可能性があると示唆しました。これにより、メモリ使用量が説明できます。2つのビデオのダウンロードを終了し、3番目のビデオを終了している間に殺される可能性があるため、一度にすべてのケースに固執することはありませんが、それについても検索しています

EDIT4:

前回の編集は気にしないでください。私はすでにチャンクごとに書いていたので、なぜメモリが使い果たされるのかという疑問が生じます

4

2 に答える 2

1

ファイルシステムを使用することもでき/proc/ます (特に/proc/self/statm/proc/$PID/statmなど) 。メモリのステータスを取得するには、 proc(5)を参照してください。

/proc/特筆すべきその他の興味深い疑似ファイルが他にもあり/proc/meminfoます/proc/$PID/maps...

于 2013-09-03T14:24:35.400 に答える
1

まず、OS によって強制終了されたシステム プロセスを特定する必要があります。次に、ダンプを有効に.coreして分析します。ulimit -cこれを取得するには、コマンドと適切な構成を確認してください。もちろん、プログラムのデバッグ シンボルを有効にして、そのほとんどを取得する必要があります。

ダンプできない (十分なスペースがない、またはその他の制限がある) 場合は、クライアント側でプロセスのデバッグ バージョンを使用したリモート デバッグを検討してください。これには「リモートGDBデバッグ」などを使用できるはずです。

ほとんどの場合、プロセスは何らかのメモリ割り当てで失敗します。これにより、どこでメモリを「食べる」か、誰が罪を犯しているか、おそらくこれをどうするかを説明する絶好の機会があります。

これが役立つことを願っています。

于 2013-09-03T14:14:04.770 に答える