2012-07-05 86 views
4

我在当前正在生产的nodeJS应用程序中存在一些内存问题(S3多部分上传服务器的代理),所以我试图搜索检测和防止它的方式..我遇到了本教程,但是当我打开调试页时,配置文件选项卡没有显示(在我遵循教程中的步骤之后)。难道我做错了什么? (我下面这个教程https://github.com/felixge/node-memory-leak-tutorial内存泄漏问题Nodejs(无法使用v8profiler进行调试)

如果有帮助,这是我的代码,可能是造成泄漏的一部分:

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

谢谢!

+0

我建议你也试试最新的0.8.x nodejs。 – Alfred 2012-07-05 20:50:36

+0

在我看到发生了什么后,我会这样做。只是更新我的节点会添加另一个变量的问题,所以我希望能够首先检测到它。 – 2012-07-06 12:47:08

+0

问题可能是node.js本身的内存泄漏。这就是为什么我要求你更新node.js。 – Alfred 2012-07-07 04:37:18

回答

0

以下插件已更新,可与新版本的v8一起使用。这是除nodetime.com之外的唯一一个仍在工作的人。它使用WebKit的实际调试:

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

这是一个非常明确的指示为好。