Redis异常分析-输出缓冲区过大

Redis异常分析-输出缓冲区过大

一.输出缓冲区概念

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快,分析过程较简单

不能精准定位到客户端

不能显示所有输入缓冲区的总量,只能显示最大量

 

五. 如何防范

(1)限制容易让输出缓冲区增大的命令,如,高并发下的monitor命令

(2)即时监控内存,一旦发现内存频繁抖动,可能就是输出缓冲区过大。

你可能感兴趣的:(缓存,分布式缓存-redis)