2020-02-15 14:10:02
缘起:
redis.clients.jedis.exceptions.JedisConnectionException:Could not get a resource from the pool
生产环境的业务服务器报了大量上面的错误。Jedis无法从连接池中获取一个可用的连接,所有客户端与Redis服务端保持通信的连接都在工作中,没有闲置的连接可以使用。
目前生产环境每天Redis的QPS在5000左右,连接池配置20个最大连接数貌似是真的很小,是不是增大连接池的配置就解决问题了?出现这个问题的根本原因是:连接池中的Jedis对象是有限的,如果Jedis一直被占用,没有归还,如果这时需要操作redis,就需要等待可用的Jedis,当等待时间超过maxWaitMillis,就会抛出could not get a resource from pool。以下几种场景会出现这个问题:
由于Redis是单线程,某个查询太慢,阻塞了其他操作命令的执行。
Redis内部问题导致处理客户端的命令慢了,比如RDB持久化时,fork进程做内存快照;AOF持久化时,AOF文件重写时会占用大量的CPU资源;
大量key同时过期。
以下数据来自于CAT对缓存的监控数据:蓝线表示出现Could not get a resource from the pool的次数,绿线表示QPS,从图中可以看出随着QPS的升高,出现异常的次数也在增高,难道真的是因为QPS高,连接池数小的原因?
CAT上按照小时为维度获取缓存出现异常的数据如下:
从以下数据可以发现缓存出现异常的时间段都比较集中,而且间隔的时间段貌似存在着某种规律。出现问题的时间段也并不是每天QPS最高的时候,QPS最高的几个时间段反而没有出现任何异常。取了一个出现异常的时间段的缓存情况如下
发现这个时间段有几个比较耗时的操作命令,但是这几个命令在其他时间段最大耗时就10多毫秒。业务上也不存在不合理使用Redis数据结构的问题。是该看看缓存的监控情况了(这一部分图片没截)。
找运维看了Redis的情况,发现Redis的某个时间段CPU飙到100%了,这个时间段和出现异常的时间段吻合。问题基本已经确认,这个时间段Redis内部一定发生了点什么,导致处理客户端的请求变慢了,导致大量的请求被阻塞,超过maxWaitMillis时,集中出现了大量的Could not get a resource from the pool异常。
生产环境Redis的持久化策略是AOF,AOF会将所有的写命令按照一定频率写入到日志文件中,随着AOF文件越来越大,里面会有大部分是重复命令或者可以合并的命令(比如100次incr = set key 100),重写可以减少AOF日志尺寸,减少内存占用,加快数据库恢复时间。AOF重写的过程会fork一个子进程,导致CPU飙到100%了。在这种情况下即使增大接池连接数也没什么卵用。这个问题的解决思路是减少AOF重写的频率,两种方式:
让Redis决定是否做AOF重写操作,根据auto-aof-rewrite-percentage和auto-aof-rewrite-min-size两个参数,auto-aof-rewrite-percentage:当前写入日志文件的大小超过上一次rewrite之后的文件大小的百分之多少时重写;auto-aof-rewrite-min-size:当前aof文件大于多少字节后才触发用crontab定时重写,命令是:BGREWRITEAOF
上面提到慢查询会阻塞Redis,那么业务开发同学在使用时如何避免呢?
避免让Redis执行耗时长的命令,绝大多数读写命令的时间复杂度都在O(1)到O(N)之间,O(1)的命令是安全的,O(N)命令在使用时需要注意,如果N的数量级不可预知,应避免使用,如对一个field数未知的Hash数据执行HGETALL/HKEYS/HVALS命令,通常来说这些命令执行的很快,但如果这个Hash中的field数量极多,耗时就会成倍增长
避免在使用这些O(N)命令时发生问题主要有几个办法:不要把List当做列表使用,仅当做队列来使用,严格控制Hash、Set、Sorted Set的大小,将排序、并集、交集等操作放在客户端执行,禁止使用KEYS命令
避免一次性遍历集合类型的所有成员,而应使用SCAN类的命令进行分批的,游标式的遍历SSCAN/HSCAN/ZSCAN等命令,分别用于对Set/Hash/Sorted Set中的元素进行游标式遍历
尽可能使用长连接或连接池,避免频繁创建销毁连接,使用pipelining将连续执行的命令组合执行
apache优化:修改最大并发连接数
05-01
print spooler打印服务提示报错1608:依赖服务或组无法启动及Spoolsv.exe应用错误报错
05-06
Redis优化建议
02-12
Redis未授权访问漏洞说明及利用
03-18
Redis查漏补缺:最易错过的技术要点大扫盲
04-06
Nginx ngx_http_limit_conn ngx_http_limit_conn模块(请求限制和连接数限制)使用指南
03-20
mysql查看连接数命令show processlist详解
03-19
无线网卡连接数分钟后自动断开
05-06
IdeaPad Y330系列改装XP后摄像头图像颠倒180度的案例分析
02-18
IdeaPadY470在win7系统下外接HDMI无法输出声音的案例分析
03-16
MySQL线程处于Waiting for table flush状态的分析
07-05
T270 G5服务器liunx系统运行过程报“nautilus崩溃”错误的原因?
07-18
Wireshark实战分析之TCP协议 三次握手
07-18
连接网络时,提示没有网络访问权限怎么办
06-30
E47指纹如何取消指纹错误时的报警
07-20
LJ3050D打印机单面打印正常,自动双面打印提示纸张错误
05-21
Lenovo G470无法连接无线网络
06-28
Lenovo G485无线网络连接不上的解决方案
06-23
NFS常见错误
07-06
Win7使用VPN拨号链接提示809错误
06-21
ansys(限元分析软件)v12.1.17 官方版
12.3GB
下载alternate DLL analyzer(DLL分析器) v1.870 最新版
543KB
下载Disk analyzer Pro(磁盘分析工具) v1.0.1100.1159 官方版
4.2M
下载Kainet LogViewPro(网站日志分析软件) v3.19.4 免费版
5.9M
下载dnaman(分析软件) v8.0.8.789 破解版
15.6M
下载Xinorbis 硬盘内容分析器 V8.1.3 绿色免费版
25.9M
下载visio2003(分析辅助软件)2003 官方版
51.7M
下载印Plus分析诊断系统(图文店管理系统) 1.0.1 官方版
55.3M
下载猎豹免费wifi(WiFi连接工具) 5.1.17080111 正式版
10.29MB
下载acmecadconverter下载
8.92MB
下载Redis desktop manager 2021 完美破解版 v2021.0.0
32.02M
下载abyssMedia tuneXplorer(音乐文件音调查看软件)下载 v2.7.6官方版
2.0M
下载resource Hacker下载
2.30MB
下载Rank Tracker下载
308.1M
下载easyrecovery pro下载
87.8M
下载fastcopy(文件快速复制工具)V3.7.0 免费版
1.5M
下载flashfxp(FXP/FTP软件)v5.4.0.3970 免费版
4.06MB
下载foobar2000下载
4.2M
下载jetaudio下载
16.92MB
下载kmplayer plus(影音播放器)v4.3.1.0 免费版
30.04 MB
下载