目录
一、输出缓冲区概念
Redis为每个客户端分配了输出缓冲区,它的作用是保存命令的执行结果返回给客户端,为Redis和客户端交互返回结果提供缓冲。与输入缓冲区的区别是:输入缓冲区不能指定容量,而输出缓冲区可以通过参数client-output-buffer-limit来指定容量。
二、输出缓冲区过大的危害
输出缓冲区不受maxmemory的控制,假设一个Redis设置了maxmemory为4G,已经存储了2G数据,但是如果此时输出缓冲区使用了3GB,已经超过了maxmemeory限制,可能会产生数据丢失,键值淘汰,OOM等情况。
三.、造成输出缓冲区过大的原因
容易让输出缓冲区增大的命令,如,高并发下的monitor命令
四.、监控输出缓冲区异常的方法
4.1 client list命令
通过定期执行client list命令,收集qbuf和qbuf-free找到异常的连接记录并分析,最终可能出问题的客户端。
10.3.34.101:6378> client list
id=10521 addr=10.3.34.101:39696 fd=5name= age=4017 idle=41 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client
id=10533 addr=10.3.34.101:48896 fd=6name= age=6 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768obl=0 oll=0 omem=0 events=r cmd=client
4.2 info clients命令
通过info命令的info clients模块,找到最大的输出缓冲区
10.3.34.101:6378> info clients
# Clients
connected_clients:2
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
4.3 client list与infoclients监控输出缓冲区的优劣势
命令 | 优点 | 缺点 |
client list | 可以精准的分析每个客户端来定位问题 | 执行速度慢,客户端较多时,频繁执行存在阻塞redis的可能 |
info clients | 执行过程比client list快,分析过程较简单 | 不能精准定位到客户端 不能显示所有缓冲区的总量,只能显示最大量 |
五、info clients命令各参数详解
Clients
connected_clients:2
已连接客户端的数量(不包括通过从属服务器连接的客户端)
client_longest_output_list:0
所有客户端连接中,最长的输出列表, Redis输出缓存峰值
client_biggest_input_buf:0
所有客户端连接中,最大输入缓存 Redis输入缓存峰值
blocked_clients:0
正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量