记一次连接Redis偶现超时的问题

2024-04-03 00:08

本文主要是介绍记一次连接Redis偶现超时的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考:https://www.phpmianshi.com/?id=118

问题描述

 

公司老的项目没有任何监控,对于系统的运行健康情况完全不知,于是搭建了2套监控系统,一套sentry监控代码层面的exception,一套cls告警,监控所有系统的状态码,应用日志等。监控系统上线后,就发现有一台跑定时任务的机器,经常偶现报错 RedisException: Connection timed out,一天几十次,也不是固定时间,如下图:

 

图片.png

 

问题分析

 

于是开始分析为何超时,首先想到的是不是tcp连接数过多?于是查看系统tcp链接状态,发现并没有太多连接,timewait也不多

ss -s
Total: 548 (kernel 808)
TCP:   745 (estab 209, closed 531, orphaned 1, synrecv 0, timewait 531/0), ports 0

查看网络统计,问题前后并没有变化

netstat -s |grep reject4 passive connections rejected because of time stamp52 packets rejects in established connections because of timestamp

 

于是查看发生超时时的系统日志,也没有发现异常

vi /var/log/messages

 

登录腾讯云查看redis监控,发生问题时候的连接数等都没有太大的异常,对比另一台没有报错的redis服务,这个出问题的redis是集群

于是猜想是不是redis集群的问题,不过抱着对大厂产品的信任,还是从自身查起,看是不是自己使用姿势有问题。

先从最简单的方法入手,修改链接redis前后的代码,增加时间戳记录,判断到底那个地方超时了

monolog("start",time());
Redis::connection('redis_db_4');
monolog("end",time());

部署上线观察,发现就是这地方connection 超时了,难道是网络问题?按理说都是腾讯家的服务,不应该存在这么频繁的网络问题啊

 

继续查看sentry日志:

发现超时时间基本是60s, 正好是php.ini下面socket的超时时间

default_socket_timeout=60

 

既然怀疑网络问题,那我们就抓包分析吧,因为是偶现问题,我们只能持续抓包,没过一段时间过来看下是否有新超时了。

 

tcpdump抓包分析结果:

09:13:02.104349 IP phpmianshi.com.42548 > 10.66.151.82.6379: Flags[S], seq 2777158311, win 29200, options [mss 1460,sackOK,TS val 1132733115 ecr
0,nop,wscale 7], length 0
09:13:03.104847 IP phpmianshi.com.42548 > 10.66.151.82.6379: Flags[S], seq 2777158311, win 29200, options [mss 1460,sackOK,TS val 1132734116 ecr
0,nop,wscale 7], length 0
09:13:05.108833 IP phpmianshi.com.42548 > 10.66.151.82.6379: Flags[S], seq 2777158311, win 29200, options [mss 1460,sackOK,TS val 1132736120 ecr
0,nop,wscale 7], length 0
09:13:09.116833 IP phpmianshi.com.42548 > 10.66.151.82.6379: Flags[S], seq 2777158311, win 29200, options [mss 1460,sackOK,TS val 1132740128 ecr
0,nop,wscale 7], length 0
09:13:17.132842 IP phpmianshi.com.42548 > 10.66.151.82.6379: Flags[S], seq 2777158311, win 29200, options [mss 1460,sackOK,TS val 1132748144 ecr
0,nop,wscale 7], length 0
09:13:33.148834 IP phpmianshi.com.42548 > 10.66.151.82.6379: Flags[S], seq 2777158311, win 29200, options [mss 1460,sackOK,TS val 1132764160 ecr
0,nop,wscale 7], length 0

 

抓包发现三次握手 发了SYN   Redis没有 ACK回复,然后5次重传都没有回复,仿佛这时候我们就有点无从查起了,毕竟redis是云服务,咱们也没法上去抓包

 

看来只能提工单了,抓包分析结果提给腾讯云客服,经过跟腾讯云持续一周左右的沟通(此处省略10000字...)

1.为了排除是机器硬件问题,腾讯云给迁移了机器  (未能解决问题)

2.服务端不回复ack参考文章: 

https://m.163yun.com/help/documents/230866483626037248

不过这是修改服务端的,咱们虽然是服务器,但是相对于链接redis来说,咱们属于客户端,我也尝试按照上面方法修改咱们的服务器,并不管用

3.升级后端客服(网络、服务器、mem等技术后端一起排查问题),最后发现是redis集群有些问题

于是在某个夜黑风高的凌晨00:11分左右,腾讯云redis集群升级,伴随着持续几秒的 NOAUTH Authentication required.   或者 Connection refused 报警后,发现链接超时的问题消失了。

持续观察2天,发现从此再没出现过链接超时的问题。

4.这个故事也告诉我们,大厂服务也不一定完全是稳定的,毕竟都是工程师做的东西,非常理解,在此感谢腾讯各部门工程师的辛苦工作,解决了困扰我们很久的一个问题。

这篇关于记一次连接Redis偶现超时的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/871423

相关文章

sky-take-out项目中Redis的使用示例详解

《sky-take-out项目中Redis的使用示例详解》SpringCache是Spring的缓存抽象层,通过注解简化缓存管理,支持Redis等提供者,适用于方法结果缓存、更新和删除操作,但无法实现... 目录Spring Cache主要特性核心注解1.@Cacheable2.@CachePut3.@Ca

504 Gateway Timeout网关超时的根源及完美解决方法

《504GatewayTimeout网关超时的根源及完美解决方法》在日常开发和运维过程中,504GatewayTimeout错误是常见的网络问题之一,尤其是在使用反向代理(如Nginx)或... 目录引言为什么会出现 504 错误?1. 探索 504 Gateway Timeout 错误的根源 1.1 后端

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID

Redis实现分布式锁全过程

《Redis实现分布式锁全过程》文章介绍Redis实现分布式锁的方法,包括使用SETNX和EXPIRE命令确保互斥性与防死锁,Redisson客户端提供的便捷接口,以及Redlock算法通过多节点共识... 目录Redis实现分布式锁1. 分布式锁的基本原理2. 使用 Redis 实现分布式锁2.1 获取锁