我在當前正在生產的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.8.x nodejs。 – Alfred 2012-07-05 20:50:36
在我看到發生了什麼後,我會這樣做。只是更新我的節點會添加另一個變量的問題,所以我希望能夠首先檢測到它。 – 2012-07-06 12:47:08
問題可能是node.js本身的內存泄漏。這就是爲什麼我要求你更新node.js。 – Alfred 2012-07-07 04:37:18