Jmeter Redis连接数问题解析及Jedis连接池配置技巧

创始人
2025-01-01 12:10:08
0 次浏览
0 评论

Jmeter接口测试-redis测试客户端连接数问题

1、Jmeter脚本,当请求磁盘重连次数达到一定数量时,请求报500,错误信息无法请求成功,大致如下:看错误内容,不太清楚问题具体出在哪里。
2、查看redis客户端连接数和redis性能(6380):0>clientinfo"#Clientsconnected_clients:1970#当前总连接client_longest_output_list:0client_h3gest_input_buf:0blocked_clients:0"Performanceredis(6380):0>CONFIGGETmaxclients时数量客户端连接数超过10000,请求受到限制,因此脚本请求报告500,请求无法成功。
当客户端连接数超过10000时,请求受到限制,因此脚本请求报告500,请求无法成功。
消耗并丢弃,请求再次可以像往常一样成功

Jedis连接池详解

JedisPool参数配置详解

1.maxTotal

maxTotal控制连接池内置Jedis实例的最大数量。
当尝试获取资源时,如果超出此限制,线程将阻塞,直到资源可用。
一旦超过最大等待时间maxWaitMillis,线程就会抛出异常。

例如:打印结果显示最多只能获取2个实例,调用getResource时线程会被阻塞。
在主线程栈中可以看到阻塞的原因是Jedis调用了底层LockSupport的park方法。
如果maxTotal设置得太小,可能会增加创建新连接的开销。

2.blockWhenExhausted

当blockWhenExhausted为true时,如果无法获取Jedis实例,线程就会阻塞;相反,当为false时,线程将抛出异常而不是阻塞。

插曲:学习实时监控RedisTCP连接的技巧。
首先实时监控Redis-server的TCP连接数。

观察结果,确认是哪个连接,发现是监听TCP,与客户端无关,无需关注。

3.maxIdle

通过程序演示maxIdle的功能。
首先尝试获取资源5次,并监控TCP连接数的变化。
结果由1变为6,即生成了5个TCP连接。
执行3次close后,实际只释放了1个TCP连接。
综上所述,maxIdle实际上反映了业务所需的最大连接数,而maxTotal是用来提供余量的,所以不要设置得太小。

4.timeBetweenEvictionRunsMillis和minEvictableIdleTimeMillis

资源返回后,连接池会在TimeBetweenEvictionRunsMillis+MinEvictableIdleTimeMillis时间后自动释放TCP连接。
这段时间分为两个阶段:线程周期执行检测和超时判断。

5.minIdle

当TimeBetweenEvictionRunsMillis+MinEvictableIdleTimeMillis时间到期时,连接池会自动释放TCP连接。
但是,如果设置了minIdle,连接池将至少维持minIdle连接数。
低于该值连接不会被释放。

2.Redis服务器的超时配置

Redis配置文件中有一个超时参数。
当设置为0时,表示永远不会超时;设置为其他值时,表示会超时。
没有主动请求的TCP连接将被主动断开。

3.连接池配置建议

避免连接池扩展造成的性能干扰。
对于访问高峰的服务,建议将maxTotal和minEvictableIdleTimeMillis设置为相等。
对于并发量较小或maxIdle设置过高的情况,可能会出现不必要的连接资源浪费。

如果一个Redis命令请求执行时间为1ms,那么一条TCP的QPS就是1*1000。
如果maxTotal设置为50,即同时最多有50个TCP连接,则总QPS将达到1000*50=50000。
在实际的在线服务中,通常会使用集群,因此机器的数量需要成倍增加。

但是Redis有最大连接数限制,所以不建议将maxTotal设置得太大。

4.Redis服务器定位连接数

查看当前连接数,了解各个重要字段的含义。
如果发现大多数连接的寿命和空闲时间接近,则可能意味着存在浪费的空闲连接。
还有其他命令可用于主动终止连接。

建议关注博客高级JAVA架构师以获得更深入的学习资源。

热门文章
1
Java字符串分割技巧:轻松获取逗号前的... java任意一个字符串,当它碰到第一个逗号时,返回逗号前面的字符串,例如:str...

2
SQL多表连接查询全解析:JOIN语句应... sql多表关联查询在执行SQL多表连接查询时,可以使用JOIN语句将多个表连接在...

3
Java中字符串类型详解:String与... 变量有字符类型,为什么没有字符串类型??基本类型:charshort、int、l...

4
JavaSE与JavaEE:从基础到企业... javase 和javaee的区别?JavaSE和JavaEE...

5
Java程序员面试必知:核心技术问答与技... java编程程序员技术面试常见面试?随着互联网的不断发展,Java开发已经成为很...

6
Java.exe与Javaw.exe:区... 程序中java和javaw有什么区别java和javaw的区别:两者都是Java...

7
深入解析:Java中的javax包及其与... JAVA导入时,什么是javax?awt是java1.0,swing是java2...

8
Java包基础:命名空间与代码组织指南 java中的包是什么意思?包是Java中组织代码的基本结构。这种结构可以帮助我们...

9
Java AWT与Swing:全面解析二... java.awt和javax.swing有什么区别AWT是AbstractWin...

10
Java字符串比较:如何检测子字符串在另... java怎样判断一个字符串中的某个字符或字符串包含于另一个字符串publiccl...