Redisson/Jedis 线程数不足报错问题的思考


背景

最近公司内总出现 Redis相关的错误
!-_-! 看我最近发的博客就可以看的出来. 这个错误提示其实是 两年前 清明节进行 压测时发现的.
当时其实没有将这个问题细致分析下去.
最近学习的比较多. 感觉可以尝试分析一下这个问题.

报错的详细信息

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback. Fri Apr 02 11:38:27 GMT+08:00 2021
There was an unexpected error (type=Internal Server Error, status=500).
Unable to send command! Try to increase 'nettyThreads' and/or connection pool size settings Node source: NodeSource
[slot=2958, addr=null, redisClient=null, redirect=null, entry=MasterSlaveEntry [masterEntry=[freeSubscribeConnectionsAmount=0,
freeSubscribeConnectionsCounter=value:50:queue:0, freeConnectionsAmount=29, freeConnectionsCounter=value:61:queue:0, freezed=false,
freezeReason=null, client=[addr=redis://127.0.0.1:7000], nodeType=MASTER, firstFail=0]]], connection: RedisConnection@1228620800
[redisClient=[addr=redis://127.0.0.1:7000], channel=[id: 0x6e9362f5, L:/127.0.0.1:55126 - R:127.0.0.1/127.0.0.1:7000], currentCommand=null],
command: (HMSET), params: [[99, 97, 102, 45, 115, 101, 115, 115, 105, 111, ...], [108, 97, 115, 116, 65, 99, 99, 101, 115, 115, ...],
[-84, -19, 0, 5, 115, 114, 0, 14, 106, 97, ...]] after 3 retry attempts; nested exception is org.redisson.client.RedisTimeoutException:
Unable to send command! Try to increase 'nettyThreads' and/or connection pool size settings Node source: NodeSource [slot=2958, addr=null,
redisClient=null, redirect=null, entry=MasterSlaveEntry [masterEntry=[freeSubscribeConnectionsAmount=0, freeSubscribeConnectionsCounter=value:50:queue:0,
freeConnectionsAmount=29, freeConnectionsCounter=value:61:queue:0, freezed=false, freezeReason=null, client=[addr=redis://127.0.0.1:7000],
nodeType=MASTER, firstFail=0]]], connection: RedisConnection@1228620800 [redisClient=[addr=redis://127.0.0.1:7000],
channel=[id: 0x6e9362f5, L:/127.0.0.1:55126 - R:127.0.0.1/127.0.0.1:7000], currentCommand=null], command: (HMSET), params:
[[99, 97, 102, 45, 115, 101, 115, 115, 105, 111, ...], [108, 97, 115, 116, 65, 99, 99, 101, 115, 115, ...], [-84, -19, 0, 5, 115, 114, 0, 14, 106, 97, ...]]
after 3 retry attempts

本问题的思考

这个问题的核心其实很简单:
高并发情况下jedis后者是redisson的客户端需要创建太多的连接池, 连接池数不足时就会出现异常. 导致报错.
但是这个问题也说明, 我们的redis客户端,或者是我们的使用方式存在问题,可能有太多的独占的连接, 非短促型的导致大量的线程使用. 另外此问题可能会有如下几个衍生的问题:
1. 如果很多应用服务器 redis 的client 会很多 , client很多之后
redis的epoll的 io多路复用的 路径选择性能会下降. 而且也会产生大量的tcp 连接. 对系统层也不友好.
2. 应用服务器如果netty有限 会偶发性的出现错误. 导致客户响应不好.
如果满足应用服务器的要求可能会对redis节点产生大量的redis连接. 甚至会超过redis服务器的限制.
3. 集群模式下因为应用服务器需要与所有的节点进行联系, 3主3从的节点理论上会使用六倍左右的线程数,
应用服务器的线程数量会剧增, 线程切换增多, 性能会下降. 对每个redis节点的的压力也不好

错误问题解决

1. 理论上通过增加redisson后者是jedis的线程数来进行解决.
2. 解决方式也表简单. 通过修改配置就可以了. 下面会给出两个例子, 可以修改 max 值来增加threads的线程数. 理论上可以解决这个问题 但是这样仅是缓解 和 水多了加面来处理.
理论redis的没一个请求都是毫秒级给予结果, 理论上使用都是短促的.
应该通过优化代码来避免长时间占用这么多连接

jedis的设置

  redis:
cluster:
max-redirects: 3
nodes: 10.110.139.190:8001,10.110.139.190:8002,10.110.139.190:8003,10.110.139.190:8004,10.110.139.190:8005,10.110.139.190:8006
# 这是是集群的配置地址
password: Testxxxxxxxx
# Redis必须要设置密码
jedis:
pool:
min-idle: 1
max-active: 100
max-wait: -1
max-idle: 50
# 这个配置节是jedis的. 应该可以设置jedis的连接池配置.

redisson的设置

caching-configuration:
enableRedis: true
redisManagers:
- name: default
mode: cluster
nodes: 10.110.139.190:8001,10.110.139.190:8002,10.110.139.190:8003,10.110.139.190:8004,10.110.139.190:8005,10.110.139.190:8006
password: Testxxxxxxxx
idleConnectionTimeout: 100000
pingTimeout: 100000
connectTimeout: 100000
timeout: 30000
retryAttempts: 30
retryInterval: 60000
reconnectionTimeout: 60000
failedAttempts: 3
masterConnectionPoolSize: 512
readMode: SLAVE
scanInterval: 10000
threads: 400
nettyThreads: 400

Redisson/Jedis 线程数不足报错问题的思考的更多相关文章

  1. Android 线程更新UI报错 : Can't create handler inside thread that has not called Looper.prepare()

    MainActivity中有一个按钮,绑定了save方法 public void save(View view) { String title = titleText.getText().toStri ...

  2. 关于子线程使用Toast报错Can't create handler inside thread that has not called Looper.prepare()的解决办法

    形同如下代码,在Thread中调用Toast显示错误信息: new Thread(new Runnable(){ @Override public void run() { try{ weatherD ...

  3. oracle中设置了最大链接数还是报错

    须要更新的数据有1100条.我连接的时候一直报错 ORA-12518, TNS:listener could not hand off client connection 依据商品的文章设置了最大连接 ...

  4. 问题:eclipse中线程编程编译报错,undefined reference to 'pthread_create'的解决方法(已解决)

    问题描述: 在Ubuntu系统中,使用eclipse CDT集成开发环境编写pthread程序,编译时,pthread_create不通过,报错信息是: undefined reference to ...

  5. 关于线上js报错问题的思考

    1.有没有可能对线上报错进行实时监控,只要线上报错出现就会以邮件的形式发出来. 2.有没有可能将每个模块和开发者联系起来,只要报错就直接报给开发者

  6. Apache崩掉:为进程配置合适的线程数

    放假以来,服务器Apache二次崩掉了,不能再拖了,找bug解决: 崩掉的具体状况是,服务器出现弹框显示:Apache停止工作: 顺手关掉这个可恶的小弹框,世界就清静了,服务器正常运行: 具体问题: ...

  7. C# Excel导出超出65536行报错 Invalid row number (65536) outside allowable range (0..65535)

    C# Excel导出超出65536行报错 Invalid row number (65536) outside allowable range (0..65535) 一:报错 Invalid row ...

  8. 查阅日志文件:有时候报错信息只是给出了问题的表面现象,要想更深入的了解问题,必须查看相应的日志文件,而日志文件又分为系统日志文件(/var/log)和应用的日志文件,结合这两个日志文件,一般就能定位问题所在。

    作为一名合格的 Linux 运维工程师,一定要有一套清晰.明确的解决故障思路,当问题出现时,才能迅速定位.解决问题,这里给出一个处理问题的一般思路: 重视报错提示信息:每个错误的出现,都是给出错误提示 ...

  9. [Jmeter]打开jmeter.bat报错的解决思路与方法

    解决过程: 打开apache-jmeter-3.0的jmeter.bat时,报错如下: 查看报错信息,应该是属于环境变量配置问题. 因此加上jave_home的路径语句在jmeter.bat文件上: ...

  10. linux环境,通过rpm删除mysql包,报错:error reading information on service mysqld: Invalid argument

    问题描述: 今天在做saltstack的练习,想要通过sls的方式,在远程进行mysql数据库的安装,发现无法通过service的方式启动数据库,然后就想给删除了重新进行安装,在通过rpm -e进行删 ...

随机推荐

  1. 格网DEM生成不规则三角网TIN

    目录 概述 详论 1️⃣数据准备 2️⃣转换算法 3️⃣TIN构建 4️⃣具体实现 5️⃣实验结果 参考 概述 在GIS(地理信息科学)中,地形有两种表达方式,一种是格网DEM,一种是不规则三角网TI ...

  2. C# 将Excel转为OFD、UOS

    本文以C#及VB.NET代码为例展示如何将Excel工作簿转换为OFD和UOS格式.通过workbook.LoadFromFile(string fileName)方法加载Excel源文档后,然后调用 ...

  3. 干货分享丨玩转物联网IoTDA服务系列六-恒温空调

    摘要:本文主要讲述空调接入到物联网平台后,通过恒温空调控制系统,不论空调是否开机,都可以调整空调默认温度,待空调上电开机后,自动按默认温度调节. 场景简介 通过恒温控制系统,不论空调是否开机,都可以调 ...

  4. 技术实践丨GaussDB(DWS)运维管理功能“升级”的原理和使用

    摘要:本文将详细介绍GaussDB(DWS)重要运维管理功能"升级"的原理和使用. 运维管理模块是任何软件产品最基础和重要的一部分.是软件产品的门户,也是用户接触和使用软件产品的和 ...

  5. 什么是VXLAN?为什么需要VXLAN?

    摘要:本文介绍了什么是VXLAN,以及VXLAN的基本概念和工作原理,包括:为什么需要VXLAN?VXLAN与VLAN之间有啥不同?什么是VTEP?什么是VNI?VXLAN报文是如何封装的?VXLAN ...

  6. 想发自己的NFT,你要先搞清楚这6个问题

    摘要:NFT是Web3世界中标记数据资产独特性的标识,是数据权益的载体. 本文分享自华为云社区<加密数字艺术NFT背后你关心的六个问题>,作者: 薛腾飞 . Connect Wallet ...

  7. 华为云UGO:醒醒!你的异构数据库迁移难题有救了

    摘要:华为云推出的数据库和应用迁移 UGO,正是一款专注于异构数据库结构迁移和应用SQL转换的专业云服务. 数字化时代下,上云已成为企业管理者的基本共识,随着技术日新月异,上云也变得轻松简单起来,但异 ...

  8. vue2升级vue3:Vue2/3插槽——vue3的jsx组件插槽slot怎么处理

    插槽的作用 让用户可以拓展组件,去更好地复用组件和对其做定制化处理. Vue 实现了一套内容分发的 API,将<slot>元素作为承载分发内容的出口,这是vue文档上的说明.具体来说,sl ...

  9. Kubernetes(K8S) Node NotReady 节点资源不足 Pod无法运行

    k8s 线上集群中 Node 节点状态变成 NotReady 状态,导致整个 Node 节点中容器停止服务. 一个 Node 节点中是可以运行多个 Pod 容器,每个 Pod 容器可以运行多个实例 A ...

  10. 认证,权限,频率源码分析 自定义频率类 SimpleRateThrottle缓存频率类 基于APIView编写分页

    目录 昨日回顾 三种位置的token获取 三种权限校验方式 原生django的cookie+session认证底层原理 断点调试使用 认证,权限,频率源码分析(了解) 权限源码分析 认证源码分析 频率 ...