内存泄漏问题Nodejs(无法使用v8profiler进行调试)
我在当前正在生产的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();
};
基本上,在我从浏览器收到的每个部分中,我使用收到的参数和请求向亚马逊发出请求。 节点版本是0.6.7
谢谢!
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
它看起来非常有趣并且非常有前途。
我建议工具http://search.npmjs.org/#/nodeheap。 您可以随时拍摄快照并比较堆中仍然存在的内容,并使用该工具追踪拥有者的身份。
以下插件已更新,可与新版本的v8一起使用。 这是除nodetime.com之外的唯一一个仍在工作的人。 它使用实际的webkit调试器:
https://github.com/c4milo/node-webkit-agent
它也有非常明确的说明。
链接地址: http://www.djcxy.com/p/52629.html上一篇: Memory leak problems Nodejs ( can't debug it with v8profiler )