predis连接问题(connection refused)排查

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

背景

最近有用户报使用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机器,在指定时间段内的网络质量情况,从天象上可以看到如下信息,

predis2

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

总结

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

目录
相关文章
|
PHP 开发工具
ThinkPHP6.0 发送阿里云短信
一、登录阿里云,注册短信服务 1.阿里云短信服务:dysms.console.aliyun.com/overview
3175 0
|
机器学习/深度学习 传感器 人工智能
植保机器人在生长监测与分析以及病虫害预警与防控方面
植保机器人在生长监测与分析以及病虫害预警与防控方面
417 2
|
11月前
|
存储 Linux 开发工具
Linux环境下使用Buildroot配置软件包
使用Buildroot可以大大简化嵌入式Linux系统的开发和维护工作,但它需要对Linux系统和交叉编译有深入的理解。通过上述步骤,可以有效地配置和定制软件包,为特定的嵌入式应用构建高效、稳定的系统。
1138 11
|
机器人 Linux 异构计算
实例1:控制树莓派板载LED灯闪烁
本文是一个关于如何使用Python编程控制树莓派板载LED灯闪烁的实验教程,涵盖了树莓派的基本概念、LED控制文件的读写操作、Python `open()` 和 `sleep()` 函数的使用方法,以及具体的实验步骤和代码实现,目的是让读者通过实践熟悉树莓派操作和Linux文件读写。
817 1
实例1:控制树莓派板载LED灯闪烁
|
JavaScript 索引
JS判断数组是否包含某个元素
JS判断数组是否包含某个元素
1341 1
|
负载均衡 Nacos 数据库
【Nacos】配置管理、微服务配置拉取、实现配置热更新、多环境配置
【Nacos】配置管理、微服务配置拉取、实现配置热更新、多环境配置
1071 1
|
API 索引 Python
在Python中一马平川的书写代码!
在Python中一马平川的书写代码!
276 2
|
人工智能 Java
通过okhttp调用SSE流式接口,并将消息返回给客户端
通过okhttp调用SSE流式接口,并将消息返回给客户端
|
存储 前端开发 Linux
(上)【数字IC精品文章收录】近500篇文章|学习路线|基础知识|接口|总线|脚本语言|芯片求职|安全|EDA|工具|低功耗设计|Verilog|低功耗|STA|设计|验证|FPGA|架构|AMBA|书籍|
【数字IC精品文章收录】近500篇文章|学习路线|基础知识|接口|总线|脚本语言|芯片求职|安全|EDA|工具|低功耗设计|Verilog|低功耗|STA|设计|验证|FPGA|架构|AMBA|书籍|
(上)【数字IC精品文章收录】近500篇文章|学习路线|基础知识|接口|总线|脚本语言|芯片求职|安全|EDA|工具|低功耗设计|Verilog|低功耗|STA|设计|验证|FPGA|架构|AMBA|书籍|
|
缓存 关系型数据库 MySQL
【Remi】配置Remi镜像源
Remi repository 是包含最新版本 PHP 和 MySQL 包的 Linux 源,由 Remi 提供维护。有个这个源之后,使用 YUM 安装或更新 PHP、MySQL、phpMyAdmin 等服务器相关程序的时候就非常方便了。
6648 0