最近加了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在大量请求的情况下会有问题? 但看了下他代码,,,感觉无从下手。。。不知道怎么去跟踪这个问题。
我用这个跟踪修复了request上传超大文件的memory leak漏洞
之前碰到过node-memcached的内存泄漏,这么久了还没修
换redis试下
我跟你的情况类似,压测都没问题,线上环境就会内存溢出,我没用node-memcached这个模块,反正这些第三方的模块很多都不省心,我之前找到node-mysql可能导致内存泄露的地方https://github.com/felixge/node-mysql/issues/797,估计也有不少人掉到这坑了
你用node-heapdump把堆打出来看看