spring boot的redis连接数过多导致redis服务器压力过大的一次问题排查

一、背景

在今天上午的时候,突然收到大量的sentry报错,都是关于redis连接超时的警告。

首先想到的是去查看redis的监控,发现那个时间段,redis的请求数剧增,cpu使用率和带宽都陡增双倍。

在这里插入图片描述

下面的是redis监控的cpu情况
在这里插入图片描述
最后贴一张redis的流量
在这里插入图片描述

到目前为止,可以看到redis的压力确实上来了。

随之,阿里云也给我们发来告警,说redis连接超时,导致主从切换。

于是,我们推测是程序的访问量剧增,接口中都又依赖redis,导致访问redis的请求等陡增。

当然,至于为什么会发生,是不是就是redis出问题了呢?最后又应该怎么调整?

是调整程序,还是加大redis的配置?

二、监控

从监控大盘能看到的信息有:httpq qps高达17k~18k,jvm节点的内存和gc等没有任何异常,毫无压力。但是redis访问却超时。(程序设置连接redis的超时时间为3秒)

1、http qps

在这里插入图片描述

2、arms

在这里插入图片描述

3、cloudDBA

缺少对redis客户端的连接监控,依赖cloudDBA的实例会话。
在这里插入图片描述
而一般情况下,redis客户端有多少呢?1或2个,见下:

在这里插入图片描述

4、sentry

在这里插入图片描述

QueryTimeoutException
Redis command timed out; nested exception is io.lettuce.core.RedisCommandTimeoutException: 
Command timed out after 3 second(s)

三、redis连接数

1、lettuce

在这里插入图片描述
源码见类LettuceConnectionFactory
其中的构建函数中,可以看到,默认this.shareNativeConnection = true; 表示共享本地线程。
在这里插入图片描述
下面,看看关于连接池的配置项:

详见类org.springframework.boot.autoconfigure.data.redis.RedisProperties,其中Pool类是跟线程池相关的配置。
在这里插入图片描述
那么,是在哪个地方用到的呢?
org.springframework.boot.autoconfigure.data.redis.LettuceConnectionConfiguration.PoolBuilderFactory

把RedisProperties.Pool赋值给GenericObjectPoolConfig,详见下:
在这里插入图片描述
如果需要池化技术,你需要额外引入线程池框架。(因为我这项目里没有引入,所以看到是标红的,编译不通过)

<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>2.7.0</version>
</dependency

总结:lettuce连接redis,只会创建一个连接。

具体推荐一篇文章:https://www.cnblogs.com/throwable/p/11601538.html#%E8%BF%9E%E6%8E%A5redis

2、jedis

由于,我们没有使用jedis了,相信很多人也不会弃用lettuce而用它。
所以,这里不打算对其连接进行很细的描述。

当我们使用springboot框架的时候,你只要看spring-boot-autoconfigure.jar的实现。

org.springframework.boot.autoconfigure.data.redis.JedisConnectionConfiguration

在这里插入图片描述

    private void applyPooling(RedisProperties.Pool pool,JedisClientConfiguration.JedisClientConfigurationBuilder builder) {builder.usePooling().poolConfig(jedisPoolConfig(pool));}

配置RedisProperties.Pool赋值给JedisPoolConfig。

在这里插入图片描述

3、redisson

Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379");RedissonClient redisson = Redisson.create(config);

顺着代码往后看:

public SingleServerConfig useSingleServer() {return this.useSingleServer(new SingleServerConfig());}

所以,只需要看类org.redisson.config.SingleServerConfig的成员变量以及构造函数。

    private int connectionMinimumIdleSize = 24;private int connectionPoolSize = 64;

在这里插入图片描述
所以,需要将最前的代码,稍加修改如下:

Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379").setConnectionMinimumIdleSize(5).setConnectionPoolSize(10).setThreads(10).setNettyThreads(2);RedissonClient redisson = Redisson.create(config);
  • setConnectionMinimumIdleSize(5) 设置了连接池的最小空闲连接数为 5
  • setConnectionPoolSize(10) 设置了连接池的最大连接数为 10
  • setThreads(10) 设置了 Redission 使用的线程数
  • setNettyThreads(2) 设置了 Netty 使用的线程数

Redission 使用线程池来处理异步操作,其中的线程数由 threads 配置项控制。较多的线程可能导致较多的连接。

总结:由于我们在使用redission的时候,采用的是默认值,所以连接池的最小连接数为24,这也趋近前文redis的客户端实例监控的数量(27)。

也可以说,之所以和其他服务相比,占用更多的连接,就是redission配置项使用的默认值所导致。

四、总结

jvm程序的内存和gc没有变化,在接口访问量陡增的情况下,我们根据目前得到的信息,决定修改程序代码redission的配置。

也就是说,减少程序对redis服务器的并发请求,至少不会让redis服务器的压力陡增。

一味地增加redis配置当然不可取,因为我们的redis配置已经是很高了。

在这里插入图片描述
另外,我很怀疑阿里云在今天的表现,说实话,业务在没有变化非常大的情况下,不应该使得redis一下子就卡机了。

服务只是让redis的压力上升了,并不是会让得redis连接超时且切换了主从。

再说下去就是阴谋论了,水平有限,从目前获取到的信息看,只能把程序本来存在的旧问题给修复好,后期再看监控对比吧。

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

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

相关文章

无代码未来:智能、可视化、自动化的融合

无代码是一个相对较新的概念&#xff0c;不同的人群对其界定可能存在一定的差异。 对于IT专业人士和开发人员而言&#xff0c;无代码通常是指使用可视化界面和拖拽操作来构建应用程序的工具和平台。 无代码平台通过提供预先构建的组件和模块&#xff0c;使得开发人员可以通过简…

基于CW32F030单片机的便携式多功能测试笔

一、产品背景 在日常的硬件调试工作中&#xff0c;我们最常使用的仪器仪表可能就是万用表了&#xff0c;虽然万用表号称“万用”&#xff0c;但大部分时候&#xff0c;我们需要使用到的功能无非是电压测量和通断测量。 作为调试的“得力干将”&#xff0c;万用表有时候也会存…

Windows bat批处理zip打包排除bat文件自身不打包

功能&#xff1a;遍历文件&#xff0c;把文件打包成zip文件&#xff08;不打包 bat 自身文件&#xff09; 文件名&#xff1a; 文件打包成7z-zip包.bat echo off:: 来源&#xff1a;https://www.cnblogs.com/wutou/p/17348784.html :: Date: 2023/04/24 :: :: 使用说明&#…

歌手荆涛演唱的《春节回家》,一种情感的表达和文化的传承

歌手荆涛演唱的《春节回家》&#xff0c;一种情感的表达和文化的传承 春节回家&#xff0c;是中国传统文化中最为重要的传统节日之一&#xff0c;也是亿万华夏儿女最为期待的日子。每当春节临近&#xff0c;无论身在何处&#xff0c;人们都会收拾行囊&#xff0c;踏上归途&…

【5G PHY】5G SS/PBCH块介绍(四)

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

策略算法与Actor-Critic网络

策略算法 教程链接 DataWhale强化学习课程JoyRL https://johnjim0816.com/joyrl-book/#/ch7/main 策略梯度 与前面的基于价值的算法不同&#xff0c;这类算法直接对策略本身进行近似优化。 在这种情况下&#xff0c;我们可以将策略描述成一个带有参数 θ θ θ的连续函数…

基于python的职位推荐系统的设计与实现

点我完整下载&#xff1a;基于python的职位推荐系统的设计与实现.docx 基于python的职位推荐系统的设计与实现 Design and implementation of a job recommendation system based on Python 目录 目录 2 摘要 3 关键词 4 第一章 绪论 4 1.1 研究背景 4 1.2 研究目的与意义 5 1.…

HarmonyOS—ArkTS中@Observed和@ObjectLink装饰器的嵌套类对象属性变化【鸿蒙应用开发】

文章目录 ARKTS中@Observed和@ObjectLink装饰器的嵌套类对象属性变化@Observed 类装饰器说明装饰器参数类装饰器的使用@ObjectLink 变量装饰器说明装饰器参数同步类型允许装饰的变量类型被装饰变量的初始值举例装饰器的限制条件观察变化和行为表现观察的变化框架行为使用场景1.…

WebUI自动化学习(Selenium+Python+Pytest框架)002

新建项目 New Project 新建一个python代码文件 file-new-python file 会自动创建一个.py后缀的代码文件 注意:命名规则,包含字母、数字、下划线&#xff0c;不能以数字开头&#xff0c;不能跟python关键字或包名重复。 ********************华丽分割线********************…

【算法】20231128

这里写目录标题 一、55. 跳跃游戏二、274. H 指数三、125. 验证回文串 一、55. 跳跃游戏 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&am…

【MATLAB源码-第91期】基于matlab的4QAM和4FSK在瑞利(rayleigh)信道下误码率对比仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 正交幅度调制&#xff08;QAM&#xff0c;Quadrature Amplitude Modulation&#xff09;是一种在两个正交载波上进行幅度调制的调制方式。这两个载波通常是相位差为90度&#xff08;π/2&#xff09;的正弦波&#xff0c;因此…

C语言第三十四弹--矩形逆置

C语言实现矩阵逆置 逆置结果如图 思路&#xff1a;通过观察逆置结果&#xff0c;首先发现行数和列数都发生了调换。其次观察逆置前后数字对应的下标&#xff0c;逆置前数字对应下标为:[x][j] 逆置后数字对应下标为&#xff1a;[y][x]。综上&#xff0c;就可以实现矩阵逆置。 …

3D点云目标检测:CT3D解读(未完)

CT3D 一、RPN for 3D Proposal Generation二、Proposal-to-point Encoding Module2.1、Proposal-to-point Embedding2.2、Self-attention Encoding 三、Channel-wise Decoding Module3.1、Standard Decoding3.2、Channel-wise Re-weighting3.3、Channel-wise Decoding Module 四…

笔记二十三**、编程式路由导航

23.1 父组件引入 useNavigate import {NavLink, Outlet, useNavigate} from "react-router-dom"; ...... // 编程式路由导航const navigate useNavigate();const toClassify () > {navigate(classify, {state: {param_C: elendalee, param_D: 20}})}; ...... &…

Pinctrl子系统和GPIO子系统实验

驱动入口出口函数&#xff1a; static int __init led_init(void) {return 0; } static void __exit led_exit(void) { }module_init(led_init);module_exit(led_exit);MODULE_LICENSE("GPL");字符设备驱动那一套 先创建设备结构体 &#xff08;cdev&#xff09; 1…

汇编:常用的输入与输出

1.字符输出 使用int 21h中断的02h号功能可以在屏幕输出一个字符&#xff0c;dl中存放要输出字符的ascii码。 如下代码将在屏幕输出一个字符“a”&#xff1a; mov ah,02hmov dl,aint 21h 2.字符输入 使用int 21h中断的01h号功能可以接受一个字符&#xff0c;al存放输…

控制台gbk乱码

引用IntelliJ IDEA中 统一设置编码为utf-8或GBK-CSDN博客 特别注意file coding 的文件path和java的编码格式 配置

Rust语言入门教程(十一) - 集合类型Collections

什么是Collections 在 Rust 中&#xff0c;collections 是一组用于存储多个值的标准库数据结构。不同于数组和元组&#xff0c;collections 可以存储可变数量的数据。Rust 的标准库提供了几种常用的集合类型&#xff0c;每种类型都有其特定的用途和性能特点。 Vector - 向量 …

Linux 基本语句_12_信号

用途&#xff1a; 信号可以直接进行用户进程与内核进程之间的交互 特性&#xff1a; 对于一个进程&#xff0c;其可以注册或者不注册信号&#xff0c;不注册的信号&#xff0c;进程接受后会按默认功能处理&#xff0c;对于注册后的信号&#xff0c;进程会按自定义处理 自定义…

【PTA题目】7-12 N个数求和 分数 20

7-12 N个数求和 分数 20 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 本题的要求很简单&#xff0c;就是求N个数字的和。麻烦的是&#xff0c;这些数字是以有理数分子/分母的形式给出的&#xff0c;你输出的和也必须是有理数的形式。 输入格式&#xff1a; 输入第一行…