从源码角度看JedisPoolConfig参数配置 (3)

空闲Jedis对象检测由下列四个参数组合完成,testWhileIdle是该功能的开关。

名称 说明 默认值 建议
testWhileIdle   是否开启空闲资源检测。   false   true  
timeBetweenEvictionRunsMillis   空闲资源的检测周期(单位为毫秒)   -1(不检测)   建议设置,周期自行选择,也可以默认也可以使用下方JedisPoolConfig 中的配置。  
minEvictableIdleTimeMillis   资源池中资源的最小空闲时间(单位为毫秒),达到此值后空闲资源将被移除。   180000(即30分钟)   可根据自身业务决定,一般默认值即可,也可以考虑使用下方JeidsPoolConfig中的配置。  
numTestsPerEvictionRun   做空闲资源检测时,每次检测资源的个数。   3   可根据自身应用连接数进行微调,如果设置为 -1,就是对所有连接做空闲监测。  

说明 可以在org.apache.commons.pool2.impl.BaseObjectPoolConfig中查看全部默认值。

关键参数设置建议

maxTotal(最大连接数)

想合理设置maxTotal(最大连接数)需要考虑的因素较多,如:

业务希望的Redis并发量;

客户端执行命令时间;

Redis资源,例如nodes (如应用个数等) * maxTotal不能超过Redis的最大连接数;

资源开销,例如虽然希望控制空闲连接,但又不希望因为连接池中频繁地释放和创建连接造成不必要的开销。

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

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

maxIdle与minIdle

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

连接池的最佳性能是maxTotal=maxIdle,这样就避免了连接池伸缩带来的性能干扰。但如果并发量不大或者maxTotal设置过高,则会导致不必要的连接资源浪费。

您可以根据实际总QPS和调用Redis的客户端规模整体评估每个节点所使用的连接池大小。

使用监控获取合理值

在实际环境中,比较可靠的方法是通过监控来尝试获取参数的最佳值。可以考虑通过JMX等方式实现监控,从而找到合理值。

上面参数配置:JedisPool资源池优化

 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppxds.html