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/

相关内容

热门资讯

团拜会主持词 -主持词 团拜会主持词 -主持词大家下午好!腊梅催春至,瑞雪兆丰年!此时窗外虽然大雪纷飞、寒意袭人,但这里却热...
最新三八妇女节活动的主持词 最新三八妇女节活动的主持词(精选10篇)  主持词的写作需要将主题贯穿于所有节目之中。在现在的社会生...
小学师德报告会的主持词 小学师德报告会的主持词各位领导,各位老师:  大家下午好!采撷着金秋十月的累累硕果,收藏着金秋十月的...
《像小强一样儿活着》的经典台... 《像小强一样儿活着》的经典台词  《像小强一样活着》改编自同名网络小说,是难得的本土电影。曾有影评家...
汇演主持词 汇演主持词  主持词要根据活动对象的不同去设置不同的主持词。在人们积极参与各种活动的今天,主持人在各...
联欢会主持词结束语 联欢会主持词结束语(通用6篇)  晚会开得就是否成功圆满与主持人的讲话有很大关系。下面小编整理的联欢...
幼儿园毕业晚会主持词 幼儿园毕业晚会主持词  主持人在台上表演的灵魂就表现在主持词中。时代不断在进步,司仪等是很多场合都需...
美剧经典台词 美剧精选经典台词  在快速变化和不断变革的今天,能够利用到台词的场合越来越多,台词是一种特殊的,也是...
朗诵会主持词 关于朗诵会主持词4篇  主持词要根据活动对象的不同去设置不同的主持词。在当下这个社会中,很多场合都需...
记者节晚会主持词 记者节晚会主持词  主持词是主持人在台上表演的灵魂之所在。随着社会一步步向前发展,主持词的实用频率越...
婚礼父亲致辞 婚礼父亲致辞(精选15篇)  在平凡的学习、工作、生活中,大家肯定对各类致辞都很熟悉吧,致辞具有“礼...
校园红歌赛的主持词 校园红歌赛的主持词  主持词是主持人在节目进行过程中用于串联节目的串联词。在现今人们越来越重视活动氛...
开业主持词开场白 开业主持词开场白  根据活动对象的不同,需要设置不同的主持词。在当今社会生活中,活动集会越来越多,主...
关于唱歌比赛主持词   主持词是指主持人在主持节目的过程中进行节目串联的串联词,一般由开场白、中间部分与结束语组成。以下...
动漫感人台词 动漫感人台词(通用175句)  台词可以刻画人物的性格,表现人物的感情,加强剧情的表现力。那些广为流...
最新年会主持词 最新年会主持词(精选11篇)  契合现场环境的主持词能给集会带来双倍的效果。在如今这个时代,主持人的...
新生文艺汇演主持词 新生文艺汇演主持词  主持词要根据活动对象的不同去设置不同的主持词。在当今社会生活中,各种集会的节目...
家长代表幼儿园毕业典礼主持词 家长代表幼儿园毕业典礼主持词  主持词是各种演出活动和集会中主持人串联节目的串联词。在人们积极参与各...
学校元旦晚会主持词开场白和结... 学校元旦晚会主持词开场白和结束语  2017年元旦晚会主持词怎么写?怎么开场比较好呢?结束语又该怎么...
毕业晚会致辞 毕业晚会致辞(精选18篇)  在学习、工作或生活中,大家都写过致辞吧,致辞要求风格的雅、俗、庄、谐要...