nodejs如何跟踪内存泄露(或者谁用过3rd-Eden/node-memcached)
发布于 10 年前 作者 cekimy 8312 次浏览 最后一次编辑是 8 年前

最近加了memcached后发现线上的服务存在内存泄露,8G的内存基本跑个4,5天就吃光了,跟了几天没有什么实质进展 因为在去掉memcached后不存在内存泄露,所以怀疑是3rd-Eden/node-memcached造成的,也许是我使用方法不对。 代码比较简单

var memcached = require("memcached");
var mc = new memcached(config.memcache, {reconnect: 100, retries: 2, failures: 2, timeout: 300, failuresTimeout: 1000, minTimeout: 100, poolSize: 50});
mc.on('issue', function(details) {
    //todo
});
exports.get_user = function(req, data) { 
    var key = data.key;
    mc.get(key, function(err, item) { 
        if (item) {
            //应用逻辑
        } else {
            //从数据库读取后set
            //应用逻辑
        }       
    });
}

在小访问量的情况下的确发现不了问题,用ab压测几十万条请求也没问题,内存吃个几百M基本就稳定了 但是线上环境,每台机器一天50万+的请求量,跑个4,5天内存就光了 我试过将memcache的相关代码去掉后内存不会泄露,然后只保留

var memcached = require("memcached");
var mc = new memcached(config.memcache, {reconnect: 100, retries: 2, failures: 2, timeout: 300, failuresTimeout: 1000, minTimeout: 100, poolSize: 50});

也不会泄露, 然后只将memcache的监听去掉会泄露,只将memcache的set部分去掉也会泄露,所以怀疑get在大量请求的情况下会有问题? 但看了下他代码,,,感觉无从下手。。。不知道怎么去跟踪这个问题。

6 回复

我用这个跟踪修复了request上传超大文件的memory leak漏洞

之前碰到过node-memcached的内存泄漏,这么久了还没修

换redis试下

我跟你的情况类似,压测都没问题,线上环境就会内存溢出,我没用node-memcached这个模块,反正这些第三方的模块很多都不省心,我之前找到node-mysql可能导致内存泄露的地方https://github.com/felixge/node-mysql/issues/797,估计也有不少人掉到这坑了

你用node-heapdump把堆打出来看看

回到顶部