predis连接问题(connection refused)排查

背景

最近有用户报使用PHP客户端predis访问阿里云Redis(原KVStore)时,会出现connection refused错误,用户怀疑是因为后端连接数超了,导致连接被拒绝,但是监控看连接数并没有超过阈值,进而怀疑是后端redis的连接数限制逻辑有问题,经过排查发现连接数限制逻辑并没有问题,下面说下具体的排查过程。

排查过程

通常通过socket进行网络通信,出现connection refused错误,主要是由于以下原因引起的,

  • 目标端口没有打开,可能是监听端口的进程的已经挂了
  • 有防火墙阻塞连接,客户端发过来的包直接被丢弃掉
  • 监听端口对应的tcp backlog已经满了
  • 网络质量问题

用户怀疑报connection refused是因为后端连接数限制逻辑有问题,首先来排除这个原因。

实际上根据后端实现,当连接数超限时,会向客户端返回明确的错误信息,实际测试也可以发现,predis抛出的异常信息不是connection refused,而是比较直观的错误信息,如下,

max number of clients reached

后端Redis挂了,这个可能性很小,直接看redis日志即可排除。防火墙的问题,在目前云Redis服务上也不存在相关设置,可以排除。

监听端口对应的tcp backlog满了,这个是一个可能性比较大的原因,之前也确实出现过因为backlog设置的过小导致连接拒绝的情况,执行netstat -s | grep -i listen,如果有如下信息且数字还在增长,就基本可以确定是backlog的问题了,更具体的信息可以通过tcpdump抓包获取,

    10809 times the listen queue of a socket overflowed
    10809 SYNs to LISTEN sockets ignored

但是之前我们就在异常实例的机器上调整过系统的somaxconn参数和redis本身的backlog参数到一个比较大的数值,所以发生connection refused并非是因为tcp backlog满了。

那基于排除法,应该是网络本身的异常导致的问题了,这个时候就要借助于我们强大的后台监控系统天象了,依托天象,我们可以看到,客户机到后端DB机器,在指定时间段内的网络质量情况,从天象上可以看到如下信息,

我们可以看到在连接拒绝期间,没有listen drop和listen overflow的情况,但是TCP重传率很高,有此可以肯定是在TCP建立连接时,三次握手超时导致出现connection refused错误。

总结

当问题出现时,细心排查很重要,但是如果有一个强大的后台支撑系统,能够提供各种实时和历史信息,辅助我们进行排查,往往可以起到事半功倍的效果。况且很多时候,发现问题时,问题已经是过去式了,这个时候借助于这种平台可能就是排查问题的必须条件了,这里必须要赞下我们强大的天象系统了!

时间: 2025-01-01 09:51:47

predis连接问题(connection refused)排查的相关文章

JDBC连接SQL Server出现的connection refused问题的解决办法

使用JDBC在默认端口1433上连接SQL Server获得connection refused异常,大致异常信息为:The TCP/IP connection to the host  has failed. java.net.ConnectException: Connection refused. 1.使用telnet 127.0.0.1 1433测试,得到如下信息:正在连接到127.0.0.1...不能打开到主机的连接, 在端口 1433: 连接失败表示1433端口没有打开 2.检查SQ

jTDS连接SQL Server时的Connection refused

     这几天从原来的服务器上check out出一个工程,使用的是Spring+Hibernate的轻量级架构,数据库是SQL Server2000,数据源使用的jtds.可是原本运行正常的程序无论如何也跑不起来,连接数据库时,总是出现java.sql.SQLException: "Network error IOException: Connection refused: connect".检查hibernate配置文件.使用查询分析器登陆数据库一切正常.于是google一下,发

cas 单点登录出现org.jasig.cas.client.util.CommonUtils.getResponseFromServer - 拒绝连接 Connection refused

cas 单点登录出现org.jasig.cas.client.util.CommonUtils.getResponseFromServer - 拒绝连接 Connection refused 环境: CentOS Linux release 7.2.1511 (Core) cas-client-core-3.1.12.jar 最近在对cas环境进行切换,原来好好的环境.部署在新环境下却出现org.jasig.cas.client.util.CommonUtils.getResponseFromS

Network error IOException: Connection refused: connect

参考原文http://blog.csdn.net/hil2000/article/details/6576908 在安装完sql server2012后,配置好环境变量,启动tomcat后报 错"org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Network error IOException: Connection refused: connect)",仔细检查数

解决telnet: connect to address 127.0.0.1: Connection refused的错误信息

风信网(ithov.com)原创文章:今天在测试Memcached功能的时候,需要使用到telnet服务,于是连接到本机的localhost,发现报错如下: [root@localhost software]# telnet localhost 11211 Trying ::1... telnet: connect to address ::1: Connection refused Trying 127.0.0.1... telnet: connect to address 127.0.0.1

java错误:Connection refused:connect

问题描述 java错误:Connection refused:connect 这是我主界面,我想在这点开文件,然后可以发送给连接的人,目前的测试就是自己给自己发. package com.fastSendFile; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.datatransfer.DataFlavor; import java.awt.

java 我执行一个非常简单的socket程序都出错!java.net.ConnectException: Connection refused:

问题描述 java  网络编程 我执行一个非常简单的socket程序都出错!要崩溃了!我关闭了防火墙也不行,试了Ping 127.0.0.1是可以的,而且我查了这个端口也没有被占用,怎么解决?java.net.ConnectException: Connection refused: connectat java.net.DualStackPlainSocketImpl.connect0(Native Method)at java.net.DualStackPlainSocketImpl.soc

java.net.ConnectException: Connection refused问题解决办法_java

Socket异常 客户端异常 java.net.ConnectException: Connection refused: connect. 该异常发生在客户端进行new Socket(ip, port)操作时,该异常发生的原因是或者具有ip地址的机器不能找到(也就是说从当前机器不存在到指定ip路由),或者是该ip存在,但找不到指定的端口进行监听.出现该问题,首先检查客户端的ip和port是否写错了,如果正确则从客户端ping一下服务器看是否能ping通,如果能ping通(服务服务器端把ping

“Connection refused” vs “No route to host”

曾经在http://blog.csdn.net/bisal/article/details/42496583这篇博文中提到一个端口连接的验证: "ora10g@localhost.localdomain$telnet 172.101.19.57 1521Trying 172.101.19.57...telnet: connect to address 172.101.19.57: No route to host如果端口未开,实际报错:ora10g@localhost.localdomain$t