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

https://www.cnblogs.com/pc-boke/articles/10078733.html

一、输入缓冲区概念
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

努力让自己变得不那么low

推荐这些文章:

mysqladmin 命令详解

mysqladmin是一个执行管理操作的客户端程序。它可以用来检查服务器的配置和当前状态、创建和删除数据库等。

[root@fp-web-118 bin]# mysqladmin --help   ###linux的命令mysqladmin Ver 8.42 Distrib 5.6.51, for Linux on x86_64
Copyright (c) 2000, 2021, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Co...

Nginx 配置详解

源码:https://trac.nginx.org/nginx/browser
官网:http://www.nginx.org/
nginx 文件结构

... #全局块

events { #events块
...
}

http #http块
{
... #http全局块
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...

nginx 配置详解

高性能的http服务代理服务器和反向代理服务器,能支持50000个并发连接数
 
正向代理
 
明确买家是谁,让代理人去联系目标
 
例如局域网内的客户端想要访问局域网外的internet,则需要代理服务器来访问,这种代理就是正向代理

 

 
反向代理
客户端不需要任何配置就可以访问,只需要将请求发送到代理服务器,有代理服务器去选择目标服务器在返回给客户端

 
 
负载均衡
将请求分发到不同服务器、负载分发到不同服务器,就是负载均衡
访问一个ip 默认是80  (nginx)  ...

Docker命令详解

 

# docker --help
Usage: docker [OPTIONS] COMMAND [arg...]
docker daemon [ --help | ... ]
docker [ -h | --help | -v | --version ]

A self-sufficient runtime for containers.

Options:

--config=~/.docker Location of client config files
-D, --debug=false ...

Java异常详解

异常概念:
异常(Exception) :是指程序在运行中的出现的错误,程序本身可以捕获并处理,异常能被程序本身可以处理,错误是无法处理。例如:在进行除法运算时,若除数为0,则程序运行时会自动抛出算数异常。
Java 异常 :也是通过一个对象来表示的,程序运行时抛出的异常,实际上就是一个异常对象,该对象中不仅封装了错误的信息,还提供了一些处理方法。
异常体系结构:

常见的异常类列表

注意:若不知道代码抛出是那种异常,可以指定它们的父类 Throwable 和 Exception。
异常分类:运行时异常和编译异常
1、运行时异常(不受检异常):RuntimeException类极其子类表示...

C语言缓冲区(缓存)详解

1.概念缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。
缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。 2.为什么要引入缓冲区比如我们从磁盘里取信息,我们先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数据,等缓冲区的数据取完后再去磁盘中读取,这样就可以减少磁盘的读写次数,再加上计算机对缓冲区的操作大大快于对磁盘的操作,故应用缓冲区可大大提高计算机的运行速度。
又比如,我们使用打印机打印文档,由于打印机的打印速度相对较慢,我们先把文档输出到打印机相应的...

nginx配置文件详解

# For more information on configuration, see:# * Official English Documentation: http://nginx.org/en/docs/# * Official Russian Documentation: http://nginx.org/ru/docs/
#核心core配置部分
ser nginx;   #指定nginx所属用户worker_processes auto;  #工具人进程数量 处理用户请求的进程error_log /var/log/nginx/error.lo...

Python zip() 函数详解

概念
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表(python2.x的定义)。
 
特别注意:

python3.x的定义与python2.x定义的主要区别是返回值,在python3.x为了减少内存,返回的是一个zip对象,可以用list、dict等进行转换。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表(也叫减包运算)。

 
语法
zip([iterable, ...])
 
参数说明:

iterabl -- 一个或...

Redis.confg详解

 
 
 
 
 
 
 
 
 
 
 
 
 

...

12.伙伴系统(初始化内存域和结点数据结构,free_area_init_nodes详解)

直到现在,我们只在特定于体系结构的代码中看到了内核如何检测系统中的可用内存。与高层数据结构(如内存域和结点)的关联,则需要根据该信息构建。我们知道,体系结构相关代码需要在启动期间建立以下信息:
 系统中各个内存域的页帧边界,保存在max_zone_pfn数组;
 各结点页帧的分配情况,保存在全局变量early_node_map中。

从内核版本2.6.10开始提供了一个通用框架,用于将上述信息转换为伙伴系统预期的结点和内存域数据结构。在这以前,各个体系结构必须自行建立相关结构。现在,体系结构相关代码只需要建立前述的简单结构,将繁重的工作留给free_area_init_nodes即可。图...

文章标题:Redis异常分析-输入缓冲区过大以及client_list详解
文章链接:https://www.dianjilingqu.com/51083.html
本文章来源于网络,版权归原作者所有,如果本站文章侵犯了您的权益,请联系我们删除,联系邮箱:saisai#email.cn,感谢支持理解。
THE END
< <上一篇
下一篇>>