使用TIME_WAIT状态

时间:2016-06-14 13:24:41

标签: php node.js redis tcp-ip netstat

我使用通用redis来存储来自近60个系统的数据。这个常见的redis用于所有机器之间的通信。起初一切似乎都运行正常,但随着我将机器从60增加到80,与redis的连接数量增加,之后它又没有开始接受任何更多连接导致大问题。

当我开始使用'netstat -na |来调试问题时grep 6379'我发现无论何时连接到redis,它都会在特定端口打开TCP / IP连接,并且即使在调用$ redis-> quit之后也没有释放该连接并将该连接保持在TIME_WAIT状态近60秒( )(使用PHP的predis库)

方法我试图克服这个问题:

1)我试图减少/ proc / sys / net / ipv4 / tcp_fin_timeout中的timewait秒,但这不是正确的解决方案。

2)我从PHP转移到nodejs并在nodejs中尝试连接池但没有成功。这里是示例代码

app.get('/setinredis',function(req,res){

 var poolRedis = require('pool-redis')({
    'host': 'localhost',
    'password': '',
    'maxConnections': 5
    });

   poolRedis.getClient(function(client, done) {

        client.get('somekey', function(err, value) {
            console.log('value from redis is:', value);
            done();
            res.send({message:"Done"});
        });
    });

});

有没有办法有效地解决这个问题,或者有任何替代redis的数据结构功能。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:0)

问题是,每当有人点击您的/setinredis端点时,您就会创建一个池。这意味着如果您点击该端点1000次,您将创建1000个池。将池创建移到路径之外:

var poolRedis = require('pool-redis')({
    'host': 'localhost',
    'password': '',
    'maxConnections': 5
});

app.get('/setinredis',function(req,res){
   poolRedis.getClient(function(client, done) {
        client.get('somekey', function(err, value) {
            console.log('value from redis is:', value);
            done();
            res.send({message:"Done"});
        });
    });
});

编辑:作为旁注,你的问题很混乱,因为它引用了PHP但代码在Node.js中。

答案 1 :(得分:0)

请尝试这种方式,它应该可以正常工作。

=== controller.js ===

$stmt = $conn->prepare("SELECT ".$field_string." FROM ".$table." ORDER BY ".$sorder." ASC");

=== user.js ===

const user = require('./user')()

user.getUser('12345')
  .then(user => {
    console.log(user.xxxx)
  })

答案 2 :(得分:0)

这与TCP fin超时有关(Linux中默认为60秒)。可能你不是重复使用连接而是每次都开一个新连接,这非常好。但是如果你这么快就这么做,那么你冒着使用所有可用端口的风险。您应该使用此sysctl参数来减少tcp fin超时并启用tcp_reuse连接。

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 10 #value is in seconds

<强> tcp_tw_reuse TCP重用允许Linux内核从处于TIME_WAIT状态的连接中回收连接槽,并将其重新分配给新连接。重用套接字可以非常有效地减少服务器负载。

<强> tcp_fin_timeout 确定TCP / IP释放已关闭的连接并重用其资源之前必须经过的时间。在此TIME_WAIT状态期间,重新打开与客户端的连接的成本低于建立新连接

参考:http://www.speedguide.net/articles/linux-broadband-tweaks-121