最近项目用了redis + generic_pool + twemproxy + nodejs搭建服务,但是客户端连接来了之后,tcp的ESTABLISHED数量猛涨,涨到60000+文件句柄数就不够用了,redis也就无法访问了,请问大家如何解决这个问题。我目前怀疑是redis的连接没有及时释放掉。谢谢大家,本人初学乍道,请大家帮帮忙~
tcp汇总:(重启node服务可以解决问题,现在我的方案时每日都重启(很笨的方案)) TIME_WAIT 47 FIN_WAIT1 5 FIN_WAIT2 20 ESTABLISHED 50861
redis部分代码:(因为用了redis代理twemproxy,所以configfile.proxy为true)
var redis = require('redis');
var generic_pool = require('generic-pool');
//redis启动函数
function initRedisPool(config_file) {
for (var item in config_file) {
var _pool = createRedisPool(item, config_file[item]);
pools[item] = _pool;
}
}
//redis实例创建函数
function createRedisPool(db_name,config_file){
var opts = {
"no_ready_check" : config_file.proxy
};
return generic_pool.Pool({
name : db_name,
dbIndex : 0,
create : function(cb) {
var client = redis.createClient(config_file.port, config_file.hostname, opts);
client.on('error', function(err) {
console.error('error at connect redis: %s', err.stack);
});
cb(null, client);
},
destroy : function(client) {
if (!config_file.proxy) {
client.quit();
}
},
max : config_file.max,
// min : 2,
idleTimeoutMillis : config_file.idleTimeoutMillis,
// if true, logs via console.log - can also be a function
log : false
});
}
//redis实例使用函数
function execute(db_name, execb) {
++redis_count_statistics;
var pool = pools[db_name];
pool.acquire(function(err, client) {
var release = function() { pool.release(client); };
if (err) {
console.error('error at execute command: %s', err.stack);
release();
} else {
execb(client, release);
}
}, 0);
}
//redis使用部分代码:
redis_pools.execute('pool_1',function(client, release){
client.hset(h_activity,activity_key,JSON.stringify(activity),function (err, reply){
if(err){
console.error(err);
}
release();
});
});