Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 512|回复: 0

Redis异常分析-输入缓冲区过大以及client_list详解

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-6-22 15:51:15 | 显示全部楼层 |阅读模式

    一、输入缓冲区概念
    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> CLIENT LIST
    addr=127.0.0.1:43143 fd=6 age=183 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
    addr=127.0.0.1:43163 fd=5 age=35 idle=15 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping
    addr=127.0.0.1:43167 fd=7 age=24 idle=6 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
    
    可用版本 >= 2.4.0
    时间复杂度
    O(N) , N 为连接到服务器的客户端数量。
    返回值
    命令返回多行字符串,这些字符串按以下形式被格式化:
    
    每个已连接客户端对应一行(以 LF 分割)
    每行字符串由一系列 属性=值 形式的域组成,每个域之间以空格分开
    以下是域的含义:
    
    addr : 客户端的地址和端口
    fd : 套接字所使用的文件描述符
    age : 以秒计算的已连接时长
    idle : 以秒计算的空闲时长
    flags : 客户端 flag (见下文)
    db : 该客户端正在使用的数据库 ID
    sub : 已订阅频道的数量 psub : 已订阅模式的数量
    multi : 在事务中被执行的命令数量
    qbuf : 查询缓冲区的长度(字节为单位, 0 表示没有分配查询缓冲区) qbuf-free : 查询缓冲区剩余空间的长度(字节为单位, 0 表示没有剩余空间)
    obl : 输出缓冲区的长度(字节为单位, 0 表示没有分配输出缓冲区)
    oll : 输出列表包含的对象数量(当输出缓冲区没有剩余空间时,命令回复会以字符串对象的形式被入队到这个队列里)
    omem : 输出缓冲区和输出列表占用的内存总量
    events : 文件描述符事件(见下文)
    cmd : 最近一次执行的命令
    客户端 flag 可以由以下部分组成:
    
    O : 客户端是 MONITOR 模式下的附属节点(slave)
    S : 客户端是一般模式下(normal)的附属节点
    M : 客户端是主节点(master)
    x : 客户端正在执行事务
    b : 客户端正在等待阻塞事件
    i : 客户端正在等待 VM I/O 操作(已废弃)
    d : 一个受监视(watched)的键已被修改, EXEC 命令将失败
    c : 在将回复完整地写出之后,关闭链接
    u : 客户端未被阻塞(unblocked)
    A : 尽可能快地关闭连接
    N : 未设置任何 flag
    文件描述符事件可以是:
    
    r : 客户端套接字(在事件 loop 中)是可读的(readable)
    w : 客户端套接字(在事件 loop 中)是可写的(writeable)

    见地址:https://blog.csdn.net/sunhuiliang85/article/details/75102191 

    见中文官网:http://redisdoc.com/server/index.html

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-24 22:04 , Processed in 0.067514 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表