Redis学习(十二)连接数不足报错及分析修复:ERR max number of clients reached.

news2024/10/9 17:12:22

目录

    • 一、问题介绍
    • 二、问题分析
      • 2.1 redis-cli 登录
      • 2.2 info clients 查看连接数情况
      • 2.3 client list 查看具体连接情况
      • 2.4 分析连接空闲时长
      • 2.5 client list 根据客户端IP统计连接数
    • 三、问题结论和解决
      • 3.1 问题结论:
      • 3.2 解决方案①:优化程序
      • 3.3 解决方案②:扩大最大连接数
      • 3.4 解决方案③:杀死指定连接

一、问题介绍

我们在日常的开发过程中,经常会遇到 Redis 连接数不足 的情况,报错如下所示:

  • Caused by: org.redisson.client.RedisException: ERR max number of clients reached. channel
Caused by: org.redisson.client.RedisException: ERR max number of clients reached. channel: [id: 0xf10fcc26, L:/192.168.30.13:64137 - R:192.168.1.163/192.168.1.163:6379] command: (SELECT), params: [1]
	at org.redisson.client.handler.CommandDecoder.decode(CommandDecoder.java:365)
	at org.redisson.client.handler.CommandDecoder.decodeCommand(CommandDecoder.java:209)
	at org.redisson.client.handler.CommandDecoder.decode(CommandDecoder.java:147)
	at org.redisson.client.handler.CommandDecoder.decode(CommandDecoder.java:117)
	at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:505)
	at io.netty.handler.codec.ReplayingDecoder.callDecode(ReplayingDecoder.java:366)
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:283)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1421)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:930)
	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:697)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:632)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:549)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:511)
	... 4 common frames omitted

二、问题分析

ERR max number of clients reached. channel 报错是因为 Redis 的连接数不足 导致的。

2.1 redis-cli 登录

我们可以先使用如下命令登录 Redis 的客户端:

  • redis-cli -h 127.0.0.1 -p 6379 -c --raw

    -c:(cluster)选项是连接 Redis Cluster 结点需要使用的。-c 选项可以防止 movedask 异常。

    --raw:选项是反馈格式化后的结果,默认选项。相对应的是 --no-raw,即返回原始格式(二进制)。

2.2 info clients 查看连接数情况

查看 Redis 的当前连接数:

  • info clients
##版本6.2.4,相对5版本新增了部分显示信息

##当前redis节点的客户端连接数
connected_clients:1
##集群的连接数
cluster_connections:0
##客户端最大连接数
maxclients:10000
##当前所有输入缓冲区中队列对象个数的最大值
client_recent_max_input_buffer:24
##当前所有输出缓冲区中占用的最大容量
client_recent_max_output_buffer:0
##正在执行阻塞命令的客户端个数
blocked_clients:0
tracking_clients:0
clients_in_timeout_table:0

2.3 client list 查看具体连接情况

查看 Redis 的具体连接情况:

  • client list

在这里插入图片描述

id=17750 addr=192.168.1.254:35864 laddr=172.17.0.3:6379 fd=9615 name= age=266661 idle=266661 flags=N db=2 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20504 events=r cmd=select user=default redir=-1
id=2575 addr=192.168.1.254:44133 laddr=172.17.0.3:6379 fd=1885 name= age=422195 idle=422195 flags=N db=2 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20504 events=r cmd=select user=default redir=-1
id=18212 addr=192.168.1.254:61386 laddr=172.17.0.3:6379 fd=9929 name= age=266308 idle=266308 flags=N db=2 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20504 events=r cmd=select user=default redir=-1
id=13437 addr=192.168.1.254:17625 laddr=172.17.0.3:6379 fd=6431 name= age=349287 idle=349287 flags=N db=2 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20504 events=r cmd=select user=default redir=-1
id=12730 addr=192.168.1.254:15535 laddr=172.17.0.3:6379 fd=6226 name= age=350448 idle=350448 flags=N db=2 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20504 events=r cmd=select user=default redir=-1
  • 官方文档: https://redis.io/docs/latest/commands/client-list/

client list 属性说明如下:

属性说明
id客户端连接ID
addr客户端连接IP和端口
laddrredis数据库连接地址和端口
fdsocket的文件描述符
name客户端连接名
age客户端连接存活时间
idle客户端连接空闲时间,单位秒。可以用于判断连接是否有没有被及时释放
flags客户端类型标识
db当前客户正在使用的数据库索引下标
sub/psub当前客户端订阅的频道或模式数
multi当前事务中已执行命令个数
qbuf输入缓冲区总容量
qbuf-free输入缓冲区剩余容量
argv-mem下一个命令的不完整参数(已从查询缓冲区中提取)
obl固定缓冲区的长度
oll动态缓冲区列表的长度
omem固定缓冲区和动态缓冲区使用的容量
tot-mem此客户端在其各个缓冲区中消耗的总内存
events文件描述符时间(r:可读;w:可写)
cmd当前客户端最后一次执行的命令,不包含参数
user用户名称,默认default
redir当前用户跟踪重定位的客户端ID

2.4 分析连接空闲时长

了解了以上的属性,我们再反观刚才 client list 的执行结果,可以看到:

  • 其中 idle(客户端连接空闲时间)和 age(客户端连接存活时间)的值基本一致,说明大部分的连接是没有用到的。

在这里插入图片描述

2.5 client list 根据客户端IP统计连接数

命令如下:

redis-cli -h 127.0.0.1 -p 6379 -c --raw client list | awk -F ' ' '{print $2}' | awk -F : '{print $1}' | sort | uniq -c | sort -nr | head -n 10

docker 命令版:

docker exec -it redis redis-cli client list | awk -F ' ' '{print $2}' | awk -F : '{print $1}' | sort | uniq -c | sort -nr | head -n 10

执行结果:

在这里插入图片描述


三、问题结论和解决

3.1 问题结论:

从上面的问题分析可以看出,问题原因是大部分连接被某一个IP占用导致的,可能是Redis最小连接数配置错误,或者程序Bug导致的。

3.2 解决方案①:优化程序

可以根据客户端的IP和端口定位到客户端的具体应用进行优化,但是如果客户端应用不是在你们部门维护的就不太好推进了。

3.3 解决方案②:扩大最大连接数

  • 方式一:redis.conf 配置文件中进行修改,如下所示:
# 设置最大连接数为10w
maxclients 100000
  • 方式二: 通过命令设置,如下所示:
config set maxclients 100000
  • 方式三: 启动 redis.service 服务时,添加参数 --maxclients 100000,如下所示:
redis-server --maxclients 100000 -f /ext/redis.conf
  • 验证: 使用命令查看最大连接数,如下所示:
config get maxclients

3.4 解决方案③:杀死指定连接

可以在 redis 中使用如下命令杀死指定连接:

# 方式一:通过ip:port杀死
client kill ip:port
# 方式二:通过连接ID杀死
client kill id 5299

可以使用如下命令针对指定 IP 的连接进行批量杀死,例如批量杀死192.168.1.123的 3 个连接:

redis-cli client list | grep '192.168.1.123' | awk -F ' ' '{print \$1}' | sed 's/id=//g' | head -n 3 | xargs -n 1 redis-cli client kill id
  • 如果需要杀死所有连接,可以去掉 head -n 3

docker 命令版:

docker exec -it redis sh -c "redis-cli client list | grep '192.168.1.254' | awk -F ' ' '{print \$1}' | sed 's/id=//g' | head -n 3 | xargs -n 1 redis-cli client kill id"
  • 注意1: 这里需要使用 sh -c 来包装整个命令,确保命令在一个子 shell 中执行,否则会报错: the input device is not a TTY
  • 注意2: 这里需要使用 xargs -n 1 来将 awk 筛选后的结果逐行执行,-n 1 用于确保逐行执行,否则会报错: (error) ERR syntax error
  • 如果需要杀死所有连接,可以去掉 head -n 3

整理完毕,完结撒花~🌻





参考地址:

1.Redis:13–常用功能之redis-cli redis-server等命令,https://cloud.tencent.com/developer/article/1784416
2.redis client list使用,https://blog.csdn.net/weixin_44375561/article/details/121955791
3.[问题分析]redis客户端连接数过多,大量空闲连接和readonly连接,https://segmentfault.com/a/1190000020256823

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2199556.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

execl表格批量换行问题

我拿到了一份execl表格。需要用代码去读每一行。 当我点击wps中的换行的时候。显示已经换行了。 但是我双击图表的时候,显示换行并没有生效。 还是在cell单元格里有很多行。 此时,ctrlf打开替换按钮。 选择替换的内容:altenter 按住alten…

轨迹预测升级:如何让自动驾驶汽车从意图与风险中真正读懂“人心”?

导读: 本篇文章提出了一种基于联合预测的轨迹预测模型,包括交互模块、意图模块和风险评估模块。实验结果表明,本文模型在正常场景中保持高准确性,并且展现了在事故场景中应对具有挑战性或者突发情况的潜力。©️【深蓝AI】编译…

重学SpringBoot3-集成Redis(九)之共享Session

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(九)之共享Session 1. 为什么需要 Session 共享2. Spring Session 和 Redis 的集成2.1. 引入依赖2.2. 配置 Redis 连接…

车辆重识别(2022ACM SIGGRAPH调色板:图像到图像的扩散模型)论文阅读2024/10/09

[2] Palette: Image-to-Image Diffusion Models ( ACM SIGGRAPH 2022) 作者:Chitwan Saharia、William Chan、Huiwen Chang 单位:Google Research, Brain Team 摘要: 本文基于条件扩散模型开发了一个统一的图像到图像翻译框架,并…

无人机避障——4D毫米波雷达点云滤波去噪(四)

噪声的来源: 对于4D毫米波雷达的前后两帧点云数据进行去噪,可以采用多种方法。首先,需要了解点云数据的噪声来源,可能是由于硬件限制、环境干扰或目标本身的反射特性等因素造成的。噪声点通常包括漂移点、孤立点、冗余点和混杂点…

【通过zip方式安装mysql服务】

通过zip方式安装mysql服务 Mysql安装包下载mysql安装及环境配置1.解压缩配置环境变量初始化mysql配置安装mysql服务启动MySQL服务连接mysql修改root用户密码 Mysql安装包下载 通过访问mysql官网下载:mysql下载地址 mysql安装及环境配置 1.解压缩 下载完成后&am…

YOLOv10改进策略【注意力机制篇】| GAM全局注意力机制: 保留信息以增强通道与空间的相互作用

一、本文介绍 本文记录的是基于GAM注意力模块的YOLOv10目标检测改进方法研究。GAM注意力模块通过3D排列和重新设计的子模块,能够在通道和空间方面保留信息,避免了先前方法中由于信息减少和维度分离而导致的全局空间-通道交互丢失的问题。本文利用GAM改进…

『网络游戏』角色创建界面逻辑【11】

创建代码:CreateWnd.cs 编写脚本:CreateWnd.cs 绑定脚本 修改脚本:LoginWnd.cs 绑定事件 修改脚本:Constans.cs 修改脚本:LoginSys.cs 修改脚本:LoginWnd.cs 拖拽框选 运行项目 - 点击开始进入创建角色界面…

柯桥外语培训韩语学习考级韩语中TOPIK常用语法表达

-기 위해서는 -는 것이 좋다 为了......,......比较好 -는 것보다는 -는 것이 좋다 比起......,......比较好 -(으)려면 -아/어/야 한다 如果想......的话,得...... -왜냐하면 -기 때문이다 因为...... -그 이유는 -기 때문이다 理由是…

TinyOS 点对基站通信

文章目录 一、前言1.1 发包的BlinkToRadio的数据包格式 二、混淆基站源码分析2.1 Makefile2.2 组件连接2.3 主逻辑代码 一、前言 1.1 发包的BlinkToRadio的数据包格式 如下,注意:AM层类型(1byte)即handlerID使可以在组件中修改的。 二、混淆基站源码…

专访:青年制片人林苏楠给影视行业新人的建议

近十年,对影视行业抱有浓厚兴趣,并进入专业院校学习的年轻人越来越多。但他们中的很多人毕业后却选择了其他行业,或者从事影视行业几年后决定转行。这其中的缘由似乎一部分来源于年轻创作者对真实的影视市场的不了解和不适应。 我们这次采访…

GC9118S替代TMI8118的优势分析,可应用在牙刷,电子锁,医疗设备等产品中

GC9118S作为一种新型集成电路,逐渐被视为TMI8118的理想替代品。以下是GC9118S在多个方面的优势,使其能够有效替代TMI8118。 1. 低功耗设计 GC9118S在功耗方面进行了优化,使其在待机和工作状态下都能显著降低能耗。这对于电池供电的设备&…

SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析

文章目录 同步编程&异步编程线程池为什么要使用线程池?Spring自定义线程池SpringBoot轻松调用线程池总结 测试demo链接 同步编程&异步编程 在Java并发编程中,同步和异步是两种常见的处理方式。 同步是指多个任务按顺序执行,一个任务的…

虚拟机三种网络配置方式随笔

1.1桥接模式 虚拟机和物理机同时直接连接物理网络(均作为独立主机) 桥接模式下,虚拟主机与真实主要在VMnet0构成的局域网内通信,同时通过真实主机中的网关与外网通信。由上表可看出,VMnet0直接连接到真实主机的某块真…

AGI时代存内计算芯片的语音识别之旅 —— 知存科技开发板体验与感悟

目录 一、简介二、活动内容2.1 多模态时代,存内计算框架的应用与发展1、多模态时代计算需求2、存内计算技术3、知存科技存内产品 2.2 分布式环境下深度学习任务的高效可靠执行研究2.3 IGZO在后道单片三维集成中的机遇与挑战1、IGZO的背景2、IGZO的优势3、IGZO器件的…

OpenStack 创建自定义的QCOW2格式镜像

目录 创建kvm虚拟机 创建目录上传ISO镜像 将 CentOS 7.4 上传到 /soft 目录下 创建 kvm虚机 使用的磁盘文件 配置kvm虚拟机 修改 KVM 虚机网络配置文件 安装 cloud-init 软件包 编辑 cloud.cfg 文件 编辑 network 文件 编辑 grub 文件 关闭kvm虚拟机 创建 QCOW2 镜…

10.8 C高级-shell脚本3

1、思维导图: 2、练习 分支结构结合test指令完成一下编程 1>判断闰年 2>输入一个数判断是否为偶数 3>使用test指令实现等级判断 90--100A 60--89B 0-50C 其他错误 代码: #!/bin/bash #分支结构结合test指令完成以下编程 #1判断是否闰年 read …

工业网关设备在智能制造中的应用有哪些?天拓四方

工业网关设备是一种用于连接工业设备和物联网子系统的设备,它能够实现数据采集、远程监控、远程控制和数据传输等功能。基于强大的数据处理和传输能力,工业网关设备能够实时采集各种工业设备的运行数据,并将其传输到云平台或数据中心进行存储…

【java】final关键字详解

🚀 个人简介:某大型国企资深软件开发工程师,信息系统项目管理师、CSDN优质创作者、阿里云专家博主,华为云云享专家,分享前端后端相关技术与工作常见问题~ 💟 作 者:码喽的自我修养&#x1f9…

升级 OpenSSL 的详细步骤(解决 SSH 漏洞的前提)

目录 前言1. 准备工作1.1 安装必要的依赖1.2 下载 OpenSSL 源码 2. 解压和配置2.1 解压文件2.2 配置编译参数 3. 编译和安装3.1 编译源码3.2 安装 OpenSSL 4. 验证安装5. 解决 SSH 漏洞的必要性6. 结语 前言 在信息安全的时代,服务器的安全性至关重要。特别是在互联…