记一次连接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

相关文章

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

Redis在windows环境下如何启动

《Redis在windows环境下如何启动》:本文主要介绍Redis在windows环境下如何启动的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Redis在Windows环境下启动1.在redis的安装目录下2.输入·redis-server.exe

MySQL中的交叉连接、自然连接和内连接查询详解

《MySQL中的交叉连接、自然连接和内连接查询详解》:本文主要介绍MySQL中的交叉连接、自然连接和内连接查询,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、引入二、交php叉连接(cross join)三、自然连接(naturalandroid join)四

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

resultMap如何处理复杂映射问题

《resultMap如何处理复杂映射问题》:本文主要介绍resultMap如何处理复杂映射问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录resultMap复杂映射问题Ⅰ 多对一查询:学生——老师Ⅱ 一对多查询:老师——学生总结resultMap复杂映射问题

java实现延迟/超时/定时问题

《java实现延迟/超时/定时问题》:本文主要介绍java实现延迟/超时/定时问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java实现延迟/超时/定时java 每间隔5秒执行一次,一共执行5次然后结束scheduleAtFixedRate 和 schedu

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.