Redis Output-Buffer-Limits

最近后端在使用redis的时候会出现time-out的情况,查看了redis的日志发现了有一个error

[6460] # Client id=2897442 addr=192.168.0.6:62982 
fd=24 name= age=2246 idle=2246 flags=S db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=16380 oll=2732 omem=68745952 events=rw cmd=psync 
scheduled to be closed ASAP for overcoming of output buffer limits.
[6460] # Connection with slave 192.168.4.6:6482 lost

看这个日志大概意思是psync的命令超过了output-buffer-limits,master主动关闭了slave的连接。然后slave被断开了和master的连接,然后slave又重新找master请求同步,然后就陷入了恶性循环,slave找master做全同步的过程是一个很消耗cpu消耗io消耗带宽的过程,如果这个过程一直在重试,结果可想而知。

这里解释下output-buffer-limites这个参数是什么。所有的client请求redis数据的时候,redis要返回给client的数据都会先被存储在output-buffer中,等所有信息都被传送完毕之后,再清除output-buffer中的数据。redis为了保护做了限制,这个配置可以查看redis的配置文件

client-output-buffer-limit slave 256mb 64mb 60
这里对是客服端是slave的做限制
256mb 是一个硬性限制,当output-buffer的大小大于256mb之后就会断开连接
64mb 60 是一个软限制,当output-buffer的大小大于64mb并且超过了60秒的时候就会断开连接

这里修改这个限制有两种方式

  1. 修改配置文件 client-output-buffer-limit 要重启redis生效
  2. 在redis命令行中 config set client-output-buffer-limit ‘slave 512mb 128mb 120’ 但是下次重启redis会失效

所以最好的方法就是做了步骤1之后再把步骤2给做了。

你可能感兴趣的:(redis)