2021-04-15

 

JedisPool资源池优化

一、背景

部分业务系统JedisPool资源池参数配置不合理,业务量很大时频繁做连接池有效性检测,ping开销很高,浪费系统资源。

 

二、目标

了解JedisPool资源池参数并合理配置,提升Redis性能。

 

三、JedisPool介绍

Jedis 是 redis 官方推荐的 java 客户端,jedisPool 是 Jedis 内部管理到 redis 的连接资源,内部的实例是 Jedis,通过连接池策略来优化对 redis 的访问。



 

JedisPoolConfig是创建 JedisPool的配置类,继承自 Apache的GenericObjectPoolConfig 类,各参数意义和默认值见下节。

 

四、核心参数介绍

 

序号

 

参数

 

说明

 

默认值

 

建议

 

1

 

maxTotal

 

资源池中的最大连接数

 

8

 

参见下文关键参数建议

 

2

 

maxIdle

 

资源池允许的最大空闲连接数

 

8

 

参见下文关键参数建议

 

3

 

minIdle

 

资源池确保的最少空闲连接数

 

0

 

参见下文关键参数建议

 

4

 

blockWhenExhausted

 

当资源池用尽后,调用者是否要等待。只有当值为true时,下面的maxWaitMillis才会生效。

 

true

 

建议使用默认值。

 

5

 

maxWaitMillis

 

当资源池连接用尽后,调用者的最大等待时间(单位为毫秒)。

 

-1(表示永不超时)

 

不建议使用默认值。

 

6

 

testOnBorrow

 

向资源池借用连接时是否做连接有效性检测(ping)。检测到的无效连接将会被移除。

 

false

 

业务量很大时候建议设置为false,减少一次ping的开销。

 

7

 

testOnReturn

 

向资源池归还连接时是否做连接有效性检测(ping)。检测到无效连接将会被移除。

 

false

 

业务量很大时候建议设置为false,减少一次ping的开销。

 

8

 

jmxEnabled

 

是否开启JMX监控

 

true

 

建议开启,请注意应用本身也需要开启。

 

空闲资源参数:

 

序号

 

参数

 

说明

 

默认值

 

建议

 

1

 

testWhileIdle

 

是否开启空闲资源监测

 

false

 

true

 

2

 

timeBetweenEvictionRunsMillis

 

空闲资源的检测周期(单位为毫秒)

 

-1:不检测

 

建议设置,周期自行选择,也可以默认也可以使用下面JedisPoolConfig中的配置

 

3

 

minEvictableIdleTimeMillis

 

资源池中资源最小空闲时间(单位为毫秒),达到此值后空闲资源将被移除

 

1000 60 30 = 30分钟

 

可根据自身业务决定,大部分默认值即可,也可以考虑使用下面JeidsPoolConfig中的配置

 

4

 

NumTestsPerEvictionRun

 

做空闲资源检测时,每次的采样数

 

3

 

可根据自身应用连接数进行微调,如果设置为-1,就是对所有连接做空闲监测











 

关键参数建议

maxTotal: 最大连接数, 设置时需考虑的因素较多,如:

  • 业务希望的Redis并发量;
  • 客户端执行命令时间;
  • Redis资源,例如nodes * maxTotal不能超过Redis的最大连接数;
  • 资源开销,例如虽然希望控制空闲连接,但又不希望因为连接池中频繁地释放和创建连接造成不必要的开销。

假设一次命令时间,即borrow|return resource加上Jedis执行命令 ( 含网络耗时)的平均耗时约为1ms,一个连接的QPS大约是1s/1ms = 1000,而业务期望的单个Redis的QPS是50000(业务总的QPS/Redis分片个数),那么理论上需要的资源池大小(即MaxTotal)是50000 / 1000 = 50。

但事实上这只是个理论值,除此之外还要预留一些资源,所以maxTotal可以比理论值大一些。这个值不是越大越好,一方面连接太多会占用客户端和服务端资源,另一方面对于Redis这种高QPS的服务器,如果出现大命令的阻塞,即使设置再大的资源池也无济于事。

maxIdle与minIdle

maxIdle实际上是业务需要的最大连接数,maxTotal 是为了给出余量, maxIdle 不要设置得过小,否则会有创建新链接的开销,而minIdle是为了控制空闲资源检测。

连接池的最佳性能是maxTotal=maxIdle,这样就避免了连接池伸缩带来的性能干扰。如果业务存在突峰访问,建议设置这两个参数的值相等;如果并发量不大或者maxIdle设置过高,则会导致不必要的连接资源浪费。

 

 

五、优化应用配置参数

结合现有业务,我们推荐优化配置以下几个参数,减少ping开销,其它参数保持现状。

 

序号

 

参数

 

建议值

 

备注

 

1

 

testOnBorrow

 

false

 

获取/归还连接时不做有效性检测,减少一次ping开销

 

2

testOnReturn

false

 

3

 

testWhileIdle

 

true

 

使用org.apache.commons.pool2.

impl.GenericObjectPoolConfig

配置类时需显示配置该参数;

 

使用redis.clients.jedis.

JedisPoolConfig配置类时可不配置,JedisPoolConfig构造函数已设置默认值;

 

 

4

 

timeBetweenEvictionRunsMillis

 

使用JedisPoolConfig中的默认配置 30000L

 

5

 

minEvictableIdleTimeMillis

 

使用JeidsPoolConfig中的默认配置60000L

 

6

 

NumTestsPerEvictionRun

 

-1

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值