运行一段时间,会发现info命令看到的connection属性(一共创建的连接数量)一直增加,在某些特定的场景下会出现该问题,导致连接池出现泄露。
场景如下:
只针对私有连接的场景,SUBSCRIBE->UNSUBSCRIBE->redis close以后 会导致连接池连接增加1个
目前发现有2个原因
-
UNSUBSCRIBE以后会push_back一遍连接,close以后又会push_back一遍连接,重复push了
void Handler::handleResponse(ConnectConnection* s, Request* req, Response* res)的最后putPrivateConnection了一遍
void Handler::postConnectConnectionEvent()的最后也putPrivateConnection了一遍
-
即使修复了第一个问题,还是会出现,因为list.h实现的链表存在断裂的情况(具体问题找不到原因),当获取连接的时候,会出现连接池长度还有,但是pop_front为空指针的情况。换成std:list就不会有这个问题。
我增加了日志,显示push以后,链表长度增加,但是链表尾没有数据

该问题会导致以下问题:
- 偶发no server connection avaliable
- 内存突然持续增加,可能是异常的连接一直占用内存
如果遇到如下问题的可以留意这个issue。
另外连接池只是简单的保留连接,不会释放空闲连接,所以会保留最大使用的连接,也会一直占用一部分内存不释放, 也可以优化一下。
运行一段时间,会发现info命令看到的connection属性(一共创建的连接数量)一直增加,在某些特定的场景下会出现该问题,导致连接池出现泄露。
场景如下:
只针对私有连接的场景,SUBSCRIBE->UNSUBSCRIBE->redis close以后 会导致连接池连接增加1个
目前发现有2个原因
UNSUBSCRIBE以后会push_back一遍连接,close以后又会push_back一遍连接,重复push了
void Handler::handleResponse(ConnectConnection* s, Request* req, Response* res)的最后putPrivateConnection了一遍
void Handler::postConnectConnectionEvent()的最后也putPrivateConnection了一遍
即使修复了第一个问题,还是会出现,因为list.h实现的链表存在断裂的情况(具体问题找不到原因),当获取连接的时候,会出现连接池长度还有,但是pop_front为空指针的情况。换成std:list就不会有这个问题。
我增加了日志,显示push以后,链表长度增加,但是链表尾没有数据

该问题会导致以下问题:
如果遇到如下问题的可以留意这个issue。
另外连接池只是简单的保留连接,不会释放空闲连接,所以会保留最大使用的连接,也会一直占用一部分内存不释放, 也可以优化一下。