最近线上出现一个问题,一个接口一段时间后无响应,查看nginx日志499、502异常。

/zpp/trade/recharftenunt/v1/qury HTTP/1.1" 499 

/zpp/trade/recharftenunt/v1/qury HTTP/1.1" 502

通过查询代码和测试发现原来是jedis创建client连接redis之后资源未释放。

测试环境下,测试问题步骤如下:

1、redis客户端info clients查看当前的连接数

JedisPool链接未释放

2、调用异常接口。

接口调用时redis的连接数会不断的增加。redis配置的最大连接数是1000.

3、直到redis连接达到604的时候,接口无响应

JedisPool链接未释放

测试环境下问题已经出现了,于是查看jedis连接池的配置情况。配置如下

<!-- scanner redis properties -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
   <property name="maxIdle" value="300" />
   <property name="maxTotal" value="600" />
</bean>

maxTotal刚好是600,当jedis连接池中连接数达到599的时候,下一个连接将会一直处于等待连接池分配资源所以造成接口处于阻塞。

4、查看代码,找到问题原因,原来业务逻辑注释掉之后,并没有将jedis的连接也注释掉。

JedisPool链接未释放

问题总结:jedis在使用过程中一定要记得释放资源

相关文章: