Redis异常分析-输入缓冲区过大
一.输入缓冲区概念
Redis为每个客户端分配了输入缓冲去,它的作用是将客户端发送的命令临时保存,同时Redis会到输入缓冲区拉取命令并执行,输入缓冲区为客户端发送命令道Redis执行命令提供了缓冲功能。qbuf代表了输入缓冲区的大小,qbuf-free代表输入缓冲区的剩余容量。输入缓冲区会根据输入内容的大小动态调整,每个客户端的输入缓冲区大小不能超过1G。超过后客户端将被关闭。
二.. 输入缓冲区过大的危害
(1) 一旦客户端的输入缓冲区超过1G,客户端将会被关闭
(2) 输入缓冲区不受maxmemory的控制,假设一个Redis设置了maxmemory为4G,已经存储了2G数据,但是如果此时输入缓冲区使用了3GB,已经超过了maxmemeory限制,可能会产生数据丢失,键值淘汰,OOM等情况。
三. 引起输入缓冲区过大的原因
(1) redis的处理速度跟不是输入缓冲区的输入速度,并且每次进入输入缓冲区的命令包含大量的bigkey,从而造成了输入缓冲区过大的情况。
(2) redis发生了阻塞,短期内不能处理命令。造成客户端命令积压在输入缓冲区,导致输入缓冲区过大。
四. 监控输入缓冲区异常的方法
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=rcmd=client
id=10533 addr=10.3.34.101:48896 fd=6name= age=6 idle=0 flags=N db=0 sub=0 psub=0 multi=-1qbuf=0 qbuf-free=32768 obl=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快,分析过程较简单 | 不能精准定位到客户端 不能显示所有输入缓冲区的总量,只能显示最大量 |
五.如何防范
输入缓冲区出现问题的概率较低,开发过程中要减少bigkey,减少redis阻塞,合理进行监控报警。
知识小贴士:作者尽心运营的知识星球社群【请点击:简道源码&&架构分析 加入】(可添加运营同学WX:wx454876882)持续拉新中...,定期的jdk与核心框架源码解析,主流行业解决方案与架构设计资料查阅与下载尽在其中。帮助行业新人和有志于技术的专业人士体系化的学习源码与系统架构,获取业界知名技术峰会和厂商对外公布的主流业务场景的解决方案。同时这个星球也是一个社群,大家可以在社群中结识有识之士,共同探讨,答疑解惑。希望可以通过这个星球帮助大家每日进步一点点,一年持续365天,共勉
本星球 聚焦于Java源码分析,架构解析。低代码,可扩展和高可用架构设计。帮助你更好地学编程,欢迎想进步的同学!仅精品案例的资料整理即物超所值。让我们大家一起每日进步一点点~~,你可以:
1. 阅读星球专属的编程知识和优质文章
2.JAVA知识从点和面,深度挖掘。通过点,形成面。提升自身的技术广度和深度。
3. 加入星球专属交流群,帮你找到学习伙伴、获取每日优质文章推送等
4.业界优秀案例资料学习及下载
5. 和伙伴们一起学习打卡,增加动力,共同进步
6.工作、学习和方法论。如何提升软实力,比如写文章、画架构图、技术产品的营销、社区的运营等等。
7.招聘、面试和晋升。如何提前准备面试,有什么套路?如何提升硬实力,少走弯路?
8.提供简历优化服务哟。本人常年招聘,也就面试了1000+程序员和架构师~~
9.解答你的疑问。
10.每日进步一点点(最重要的一点): 让自己与众不同,每天学习1-2小时源码和架构知识,365天后再回首,1年前的自己可能是个SB吧。用通勤的时间让自己成长,让优秀变成一种习惯。