在 redis 服务器上,有 17k 个 tcp 连接处于 CLOSING 状态。我的理解是,只有客户端才会发起关闭连接,而不是来自 redis 服务器。所以我应该在 redis 服务器上看到 0 个处于 CLOSING 状态的连接。有没有人有经验并知道根本原因?
'redis-cli info' 中的实际连接数小于 200,并且内存绰绰有余,并且 CPU 空闲时间超过 90%。
我浏览了 redis 文档http://redis.io/topics/clients。那里没有任何项目可以帮助我找到根本原因。
redis version: 2.6.7
netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c
1 CLOSE_WAIT
16980 CLOSING
128 ESTABLISHED
21 LAST_ACK
12 LISTEN
1 SYN_RECV
答案1
这是由我们用于连接 redis 服务器的 phpredis 库引起的。
基本上,phpredis 会发送QUIT
命令要求 redis 服务器关闭连接。但在执行此操作后,phpredis 会自行关闭 tcp 套接字,导致双方都尝试关闭连接。因此服务器有很多连接处于卡住CLOSING
状态。
我已经针对该问题创建了一个简单的修复程序。https://github.com/phpredis/phpredis/issues/562