文档首页/ 分布式缓存服务 DCS/ 常见问题/ 客户端和网络连接/ 使用Jedis连接池报错如何处理?
更新时间:2024-07-10 GMT+08:00

使用Jedis连接池报错如何处理?

使用Jedis连接池JedisPool模式下,比较常见的报错如下:

redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool

首先确认DCS缓存实例是正常运行中状态,然后按以下步骤进行排查。

  1. 检查网络。

    1. 核对IP地址配置。

      检查jedis客户端配置的IP地址是否与DCS缓存实例的连接地址或IP地址一致,如果是通过公网访问,则检查是否与DCS缓存实例绑定的弹性IP地址一致,不一致则修改一致后重试。

    2. 测试网络。

      在客户端使用ping和Telnet小工具测试网络。

  2. 检查连接数是否超限。

    查看已建立的网络连接数是否超过JedisPool配置的上限。如果连接数接近配置的上限值,则建议重启服务观察。如果明显没有接近,排除连接数超限可能。

    Unix/Linux系统使用

    netstat -an | grep 6379 | grep ESTABLISHED | wc -l

    Windows系统使用:

    netstat -an | find "6379" | find "ESTABLISHED" /C

  3. 检查JedisPool连接池代码。

    如果连接数接近配置的上限,请分析是业务并发原因,或是没有正确使用JedisPool所致。

    对于JedisPool连接池的操作,每次调用jedisPool.getResource()方法之后,需要调用jedisPool.returnResource()或者jedis.close()进行释放,优先使用close()方法。

  4. 检查客户端TIME_WAIT是否过多。

    通过ss -s查看time wait链接是否过多。

    如果TIME_WAIT过多,可以调整内核参数(/etc/sysctl.conf):

    ##当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击
    net.ipv4.tcp_syncookies = 1
    ##允许将TIME-WAIT sockets重新用于新的TCP连接
    net.ipv4.tcp_tw_reuse = 1
    ##开启TCP连接中TIME-WAIT sockets的快速回收
    net.ipv4.tcp_tw_recycle = 1
    ##修改系统默认的TIMEOUT时间
    net.ipv4.tcp_fin_timeout = 30

    调整后重启生效:/sbin/sysctl -p

  5. 如果按照以上原因排查之后问题仍没有解决,可以通过抓包并将异常时间点、异常信息以及抓包文件发送给技术支持协助分析。

    抓包可使用tcpdump工具,命令如下:

    tcpdump -i eth0 tcp and port 6379 -n -nn -s 74 -w dump.pcap

    Windows系统下还可以安装Wireshark工具抓包。

    公网访问Redis 3.0时请将端口改成36379。

    网卡名请改成实际的网卡名称。