Redis集群服务中,client list命令各个参数详解

先来看一段client list的执行结果

127.0.0.1:6379> client list

id=254487 addr=10.2.xx.234:60240 fd=1311 name= age=8888581 idle=8888581 flags=N

db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=get

id=300210 addr=10.2.xx.215:61972 fd=3342 name= age=8054103 idle=8054103 flags=N

db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=get

输出结果的每一行代表一个客户端的信息,可以看到每行包含了十几个属性,它们是每个客户端的一些执行状态,理解这些属性对于Redis的开发和运维人员非常有帮助。下面将选择几个重要的属性进行说明,其余通过表格的形式进行展示。

  • addr 客户端地址和端口
  • fd 文件描述符
  • age 以秒计算的已连接时长
  • idle 以秒计算的空闲时长
  • flags 客户端flag
  • db 该客户端正在使用的数据库 ID
  • sub 已订阅频道的数量
  • psub 已订阅模式的数量
  • multi 在事务中被执行的命令数量
  • qbuf 查询缓存的长度( 0 表示没有查询在等待)
  • qbuf-free 查询缓存的剩余空间( 0 表示没有剩余空间)
  • obl 输出缓存的长度
  • oll 输出列表的长度(当输出缓存没有剩余空间时,回复被入队到这个队列里)
  • omem 输出缓存的内存占用量
  • events 文件描述符事件
  • cmd 最近一次执行的命令

(1)标识:id、addr、fd、name

这四个属性属于客户端的标识:

id:客户端连接的唯一标识,这个id是随着Redis的连接自增的,重启Redis后会重置为0。

addr:客户端连接的ip和端口。

fd:socket的文件描述符,与lsof命令结果中的fd是同一个,如果fd=-1代表当前客户端不是外部客户端,而是Redis内部的伪装客户端。

name:客户端的名字,后面的client setName和client getName两个命令会对其进行说明。

(2)输入缓冲区:qbuf、qbuf-free

Redis为每个客户端分配了输入缓冲区,它的作用是将客户端发送的命令临时保存,同时Redis从会输入缓冲区拉取命令并执行,输入缓冲区为客户端发送命令到Redis执行命令提供了缓冲功能

client list中qbuf和qbuf-free分别代表这个缓冲区的总容量和剩余容量,Redis没有提供相应的配置来规定每个缓冲区的大小,输入缓冲区会根据输入内容大小的不同动态调整,只是要求每个客户端缓冲区的大小不能超过1G,超过后客户端将被关闭。

输入缓冲使用不当会产生两个问题:

一旦某个客户端的输入缓冲区超过1G,客户端将会被关闭。

输入缓冲区不受maxmemory控制,假设一个Redis实例设置了maxmemory为4G,已经存储了2G数据,但是如果此时输入缓冲区使用了3G,已经超过maxmemory限制,可能会产生数据丢失、键值淘汰、OOM等情况。

127.0.0.1:6390> info memory

# Memory

used_memory_human:5.00G

...

maxmemory_human:4.00G

....

上面已经看到,输入缓冲区使用不当造成的危害非常大,那么造成输入缓冲区过大的原因有哪些?输入缓冲区过大主要是因为Redis的处理速度跟不上输入缓冲区的输入速度,并且每次进入输入缓冲区的命令包含了大量bigkey,从而造成了输入缓冲区过大的情况。还有一种情况就是Redis发生了阻塞,短期内不能处理命令,造成客户端输入的命令积压在了输入缓冲区,造成了输入缓冲区过大。

那么如何快速发现和监控呢?监控输入缓冲区异常的方法有两种:

1、通过定期执行client list命令,收集qbuf和qbuf-free找到异常的连接记录并分析,最终找到可能出问题的客户端。

2、通过info命令的info clients模块,找到最大的输入缓冲区,例如下面命令中的其中client_biggest_input_buf代表最大的输入缓冲区,例如可以设置超过10M就进行报警:

127.0.0.1:6379> info clients

# Clients

connected_clients:1414

client_longest_output_list:0

client_biggest_input_buf:2097152

blocked_clients:0