4

現在本番環境にあるnodeJSアプリケーション(S3マルチパートアップロードサーバーへのプロキシ)でメモリの問題が発生しているため、それを検出して防止する方法を探しています。このチュートリアルに出くわしましたが、プロファイルタブが表示されていないデバッグページを開きます(チュートリアルの手順を実行した後)。私は何か間違ったことをしていますか?(私はこのチュートリアルhttps://github.com/felixge/node-memory-leak-tutorialをフォローしています)

それが役立つ場合、これはリークを引き起こしている可能性がある私のコードの一部です:

IngestionClient.prototype.multipartUpload = function(params, req, res, aReqLength) {
var self = this;
var client = this.client[params.profile];
var dest = params.file;

logger.debug('PART ' + params.query.partNumber + '/' + params.query.totalSize +': BEGIN : '+req.headers['content-length']+' bytes : ['
        + params.file_id + ']');

var amazonRequest = client.request('PUT', '/' + dest
        + '?partNumber=' + params.query.partNumber + '&uploadId='
        + params.query.uploadId, {
    'Content-Length' : req.headers['content-length']
});

var partLength = 0;

req.on('data', function(data) {
    partLength += data.length;
    amazonRequest.write(data, 'binary');
});

req.on('end', function() {
    if(partLength == req.headers['content-length']) {
        logger.debug('PART ' + params.query.partNumber + '/' + params.query.totalSize +': CLIENT_RECEIVED_COMPLETE : ['
                + params.file_id + ']');
    }else {
        logger.error('PART ' + params.query.partNumber + '/' + params.query.totalSize +': CLIENT_RECEIVED_INCOMPLETE : Esperado '+req.headers['content-length']
        +' bytes / Recebido ' + partLength + ' : [' + params.file_id + ']');
        amazonRequest.abort();
        self.sendError(params, res);
    }

});

amazonRequest.on('response', function(amazonResponse) {
    var responseText;

        if (amazonResponse.statusCode == 200 && amazonResponse.headers.etag.length > 0) {
            self.queryDB(
                    'INSERT INTO SAMBAFILES_UPLOAD_CONTROL_PARTS SET FILE_ID="'
                            + params.file_id + '", ETAG=' + amazonResponse.headers.etag
                            + ', PART_NUMBER="' + params.query.partNumber + '"',
                    function(err, results) {
                        logger.debug('PART ' + params.query.partNumber + '/' + params.query.totalSize +': S3_PUT_COMPLETE : ['
                                + params.file_id + ']');            
                        responseText = '{"success": true}';
                        res.end(responseText);
                        self.checkComplete(params, dest);
                    });
        } else {
            var responseBody = "";
            amazonResponse.on('data', function(dataRes) {
                responseBody += dataRes;
            });

            amazonResponse.on("end", function(){
                if(responseBody.indexOf("<Code>RequestTimeout</Code>") > 0) {
                    //Erro de lentidao do envio ( + de 20 segundos ). Browser fará um retry
                    logger.error('PART ' + params.query.partNumber + '/' + params.query.totalSize +': S3_PUT_ERROR_TIMEOUT : Response Code ' 
                            + amazonResponse.statusCode + ' : [' + params.file_id + ']');
                }else {
                    logger.error('PART ' + params.query.partNumber + '/' + params.query.totalSize +': S3_PUT_ERROR : Response Code ' 
                            + amazonResponse.statusCode + ': ' + responseBody + ' : [' + params.file_id + ']');
                }
                amazonRequest.abort();
                self.sendError(params, res);

            });

        }

        console.log(util.inspect(process.memoryUsage()));

}).end();

};

基本的に、ブラウザから受け取る各部分で、受け取ったパラメータとリクエストを使用してAmazonにリクエストを送信します。ノードバージョンは0.6.7です

ありがとう!

4

3 に答える 3

2

Mozilla チームはnode-memwatch、メモリ リークを追跡するための nodejs モジュールである をリリースしました。

Mozilla の公式投稿 : https://hacks.mozilla.org/2012/11/tracking-down-memory-leaks-in-node-js-a-node-js-holiday-season/

プロジェクトの Github : https://github.com/lloyd/node-memwatch

それは非常に興味深く、非常に有望に見えます。

于 2013-05-03T11:06:11.810 に答える
1

ツールhttp://search.npmjs.org/#/nodeheapをお勧めします。いつでもスナップショットを作成して、まだヒープに残っているものを比較し、ツールを使用して所有者を追跡できます。

于 2012-07-17T20:15:05.067 に答える
0

次のプラグインは、v8 の新しいバージョンで動作するように更新されました。nodetime.com 以外でまだ機能しているのはこれだけです。実際の webkit デバッガーを使用します。

https://github.com/c4milo/node-webkit-agent

また、非常に明確な指示もあります。

于 2012-10-12T18:21:09.997 に答える