OVS网络看redis空闲5分钟后异常断开问题
创始人
2024-06-02 23:53:51
0

问题描述

客户使用公有云的redis服务,nlb后端挂载16台redisdb,当连接空闲5分钟后,客户端再次写数据时,redishuirst报文,客户端报conntion rst by peer异常

问题分析

如果redis server的连接在5分钟之内没有任何数据的传输,sever会主动调用close()将连接关闭(tcp经过4次握手正常关闭连接),不会出现client的异常断开,在server端抓包发现redis向client的发送的fin + ack包一直在重传直到超时,所以当client,再次尝试发送数据时,此连接被redis reset了

问题定位过程

初步分析

通过抓包看,fin + ack在有重传而且重传了很多次,所以判断server到client此方向的链路上,包被丢弃了

1.首先怀疑是ip的带宽不够,通过sar命令查看,业务的流量不是很大,排除是QoS问题

2.因为先前出现过一例因为ct检测连接时checksum的不对将丢弃fin + ack的包,所以怀疑是ovs将包丢弃了,通过ovs-match-checkport-xxx和tcpdump确认的确是ovs的ct将包丢弃了,所以我们关闭了ctchecksum检查,然后观察问题是否还会出现,同时我们也在测试环境复现此问题

3.修改了checksum后,问题未复现,可能和问题的发生频率有关系,幸运的事,我们在测试环境很快便复现此问题

redis: 10.0.1.64,client: 10.226.192.70

10.0.1.64 --> 10.226.192.70的fin+ack有tcp重传,但是10.226.192.70 <--> 10.0.1.64发送的keep-alive是正常的

测试环境debug

测试环境复现了之后,关闭ct的checksum,关闭方式如下命令:

sysctl -wnet.netfilter.nf_conntrack_checksum=0

问题依然存在,确定不是checksum的问题,在ct的tcp有一个参数超时时间设置正是5分钟,然后我们将其修改为10分钟,如下命令:

sysctl -wnet.netfilter.nf_conntrack_tcp_timeout_unacknowledged=600

问题不复现,怀疑此问题和此参数的设置有关系,因为我们在client开启了10个连接,但是只有个别的连接异常,不是所有的,为了进一步确认,我们将超时时间由5分钟修改为2分钟,如下命令:

sysctl -wnet.netfilter.nf_conntrack_tcp_timeout_unacknowledged=120

发现这10个连接都出现了异常,所以确定是nf_conntrack_tcp_timeout_unacknowledged的设置导致的

分析代码此参数的功能:

如果发送的报文携带了数据,那么此数据必须在nf_conntrack_tcp_timeout_unacknowledged时间内被ACK,也就是T4-T2

修改ct的超时时间

当currentendsequence > lastendsequence时,发送的时候设置IP_CT_TCP_FLAG_DATA_UNACKNOWLEDGED标记

当currentacksequence == lastendsequence时,接收的时候清除IP_CT_TCP_FLAG_DATA_UNACKNOWLEDGED此标记,

当设置了IP_CT_TCP_FLAG_DATA_UNACKNOWLEDGED标记后,ct的timeout更新为nf_conntrack_tcp_timeout_unacknowledged(默认5分钟)

因为fin+ack的报文被drop了,而且redis发送的fin+ack距离上一个ack报文的时间间隔是5分钟,所以怀疑是redis发送的ack报文或是push+ack报文有问题,需要check这两种报文的sequence是否正确,然后将netfilter的pr_debug日志打开,如下

在wrireshark里ack报文的seq为57047932,datalen=0, 所以end = seq + datalen= 57047932, 但是日志里end=57047938,datalen= end - seq = 6, 多了6个字节的数据, 所以ct一直在等待此6字节的数据被ack,但实际上接收端不会发送此ack,直到5分钟到期,session被删除

在ACK报文的二层头里边的padding的数据正好是6字节,怀疑是ct将此6字节的pading当数据处理了

这里说一下当以太网报文的的长度小于64字节的时候,网卡会在二层报文的最后添加padding使报文的长度大于或等于64字节

那ct为什么会将报文的padding作为数据呢,通过systemtap和reviewnetfilter的代码发现,在ct在处理skb的时候,其skb->len是46,正确的值应该为40,然后继续分析skb->len,最后追溯到ovs的ovs_ct_execute()函数里

因为ct处理L3的报文,计算skb->len时并没有去掉padding的len

查看ovs的master代码,如下:

函数ovs_skb_network_trim()计算去掉padding后的skb->len

参考连接

https://arthurchiao.art/blog/conntrack-design-and-implementation-zh/

相关内容

热门资讯

常用商务英语口语   商务英语是以适应职场生活的语言要求为目的,内容涉及到商务活动的方方面面。下面是小编收集的常用商务...
六年级上册英语第一单元练习题   一、根据要求写单词。  1.dry(反义词)__________________  2.writ...
复活节英文怎么说 复活节英文怎么说?复活节的英语翻译是什么?复活节:Easter;"Easter,anniversar...
2008年北京奥运会主题曲 2008年北京奥运会(第29届夏季奥林匹克运动会),2008年8月8日到2008年8月24日在中华人...
英语道歉信 英语道歉信15篇  在日常生活中,道歉信的使用频率越来越高,通过道歉信,我们可以更好地解释事情发生的...
六年级英语专题训练(连词成句... 六年级英语专题训练(连词成句30题)  1. have,playhouse,many,I,toy,i...
上班迟到情况说明英语   每个人都或多或少的迟到过那么几次,因为各种原因,可能生病,可能因为交通堵车,可能是因为天气冷,有...
小学英语教学论文 小学英语教学论文范文  引导语:英语教育一直都是每个家长所器重的,那么有关小学英语教学论文要怎么写呢...
英语口语学习必看的方法技巧 英语口语学习必看的方法技巧如何才能说流利的英语? 说外语时,我们主要应做到四件事:理解、回答、提问、...
四级英语作文选:Birth ... 四级英语作文范文选:Birth controlSince the Chinese Governmen...
金融专业英语面试自我介绍 金融专业英语面试自我介绍3篇  金融专业的学生面试时,面试官要求用英语做自我介绍该怎么说。下面是小编...
我的李老师走了四年级英语日记... 我的李老师走了四年级英语日记带翻译  我上了五个学期的小学却换了六任老师,李老师是带我们班最长的语文...
小学三年级英语日记带翻译捡玉... 小学三年级英语日记带翻译捡玉米  今天,我和妈妈去外婆家,外婆家有刚剥的`玉米棒上带有玉米籽,好大的...
七年级英语优秀教学设计 七年级英语优秀教学设计  作为一位兢兢业业的人民教师,常常要写一份优秀的教学设计,教学设计是把教学原...
我的英语老师作文 我的英语老师作文(通用21篇)  在日常生活或是工作学习中,大家都有写作文的经历,对作文很是熟悉吧,...
英语老师教学经验总结 英语老师教学经验总结(通用19篇)  总结是指社会团体、企业单位和个人对某一阶段的学习、工作或其完成...
初一英语暑假作业答案 初一英语暑假作业答案  英语练习一(基础训练)第一题1.D2.H3.E4.F5.I6.A7.J8.C...
大学生的英语演讲稿 大学生的英语演讲稿范文(精选10篇)  使用正确的写作思路书写演讲稿会更加事半功倍。在现实社会中,越...
VOA美国之音英语学习网址 VOA美国之音英语学习推荐网址 美国之音网站已经成为语言学习最重要的资源站点,在互联网上还有若干网站...
商务英语期末试卷 Part I Term Translation (20%)Section A: Translate ...