Jmeter Redis连接数问题解析及Jedis连接池配置技巧
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架构师以获得更深入的学习资源。