Linux运维笔记
我们一直在努力

Redis客户端连接过高,不释放解决办法

今天上班开发反应Redis连接最高冲到了2000多,应该是很多Reids的客户端空闲连接没有释放

先排查一下情况

1、查看 info clients 发现连接的客户端有1553个,和当前业务环境不符合


127.0.0.1:6379> info clients
# Clients
connected_clients:1553
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0

 

2、用 client list 命令查看下连接客户端的列表信息


这里就可以发现问题了,有很多连接

先做下 client list 命令结果的列名解释:

  • addr : 客户端的地址和端口
  • fd : 套接字所使用的文件描述符
  • age : 以秒计算的已连接时长
  • idle : 以秒计算的空闲时长
  • flags : 客户端 flag
    • O : 客户端是 MONITOR 模式下的附属节点(slave)
    • S : 客户端是一般模式下(normal)的附属节点
    • M : 客户端是主节点(master)
    • x : 客户端正在执行事务
    • b : 客户端正在等待阻塞事件
    • i : 客户端正在等待 VM I/O 操作(已废弃)
    • d : 一个受监视(watched)的键已被修改, EXEC 命令将失败
    • c : 在将回复完整地写出之后,关闭链接
    • u : 客户端未被阻塞(unblocked)
    • A : 尽可能快地关闭连接
    • N : 未设置任何 flag
  • db : 该客户端正在使用的数据库 ID
  • sub : 已订阅频道的数量
  • psub : 已订阅模式的数量
  • multi : 在事务中被执行的命令数量
  • qbuf : 查询缓冲区的长度(字节为单位, 0 表示没有分配查询缓冲区)
  • qbuf-free : 查询缓冲区剩余空间的长度(字节为单位, 0 表示没有剩余空间)
  • obl : 输出缓冲区的长度(字节为单位, 0 表示没有分配输出缓冲区)
  • oll : 输出列表包含的对象数量(当输出缓冲区没有剩余空间时,命令回复会以字符串对象的形式被入队到这个队列里)
  • omem : 输出缓冲区和输出列表占用的内存总量
  • events : 文件描述符事件
    • r : 客户端套接字(在事件 loop 中)是可读的(readable)
    • w : 客户端套接字(在事件 loop 中)是可写的(writeable)
  • cmd : 最近一次执行的命令

其中第4列显示的是客户端连接空闲时长,说明客户端空闲后,并没有相关的规则去释放这些连接

也可以统计下看看每个IP有多少连接

redis-cli client list | awk -F [=:\ ] ‘{print $4}’ | sort | uniq -c

 

3、查看下超时时间timeout 


[root@redis ~]# redis-cli config get timeout
1) "timeout"
2) "0"

看到Redis配置的timeout (当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能),当前并无开启闲置连接的关闭时间

这下就好办了,设置Timeout

redis-cli config set timeout 3600

然后我们在查看下连接情况

127.0.0.1:6379> info clients
# Clients
connected_clients:5
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0

 

突然这个世界就这么安静了~

赞(0) 打赏

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址