【问题标题】:Memory leak problems Nodejs ( can't debug it with v8profiler )Nodejs 内存泄漏问题(不能用 v8profiler 调试)
【发布时间】:2012-07-06 04:01:52
【问题描述】:

我在当前正在生产的 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

谢谢!

【问题讨论】:

  • 我建议你也尝试使用最新最好的 0.8.x nodejs。
  • 我会在弄清楚发生了什么之后再做。只是更新我的节点会给问题添加另一个变量,所以我希望先检测到它。
  • 问题可能是 node.js 本身的内存泄漏。这就是为什么我要求你更新 node.js。
  • A fix landed 用于 0.6.17 中的 HTTP 客户端,用于内存泄漏。您可能还想为您的请求和响应对象添加close 处理程序。另外,我很幸运使用node-webkit-agent

标签: node.js memory-leaks


【解决方案1】:

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

看起来很有趣,很有前途。

【讨论】:

    【解决方案2】:

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

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

    它也有非常清晰的说明。

    【讨论】:

      【解决方案3】:

      我建议使用工具http://search.npmjs.org/#/nodeheap。您可以随时拍摄快照并比较堆上的剩余内容,并使用该工具追踪所有者是谁。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-09
        • 2010-12-01
        • 2016-04-22
        • 1970-01-01
        • 2016-07-28
        相关资源
        最近更新 更多