4层负载均衡服务偶发1S请求的故障分析

4层负载均衡平台上线后,在公司推广比较顺利,有很多业务使用。我们支持两种服务:静态负载均衡与动态负载均衡,静态负载均衡采用了LVS的Tunnel模式,而动态负载均衡由于需要动态实时与K8S中发布的服务同步,所以采用的是NAT的模式。今天要说的问题,就是业务方反馈他们部署在K8S中的服务,上了4层负载均衡,会出现偶发1S的长延时请求。调查过程有些曲折,所以这里记录下来,供后续学习和参考。

系统环境与问题说明

为了避免公司敏感信息,这里列举的IP地址都是虚构的。

  • LVS环境: IP:10.1.1.1, PORT:7012
  • 客户端在K8S容器中的环境: IP地址:10.2.1.1
  • 服务端在K8S容器中的环境: IP地址:10.2.2.2 PORT:8012

业务访问流程为:
客户端->LVS(10.1.1.1:7012)->服务端(10.2.2.2:8012)

在LVS主机我们查看一下LVS的规则

root@ubuntu:/home/yuxianbing# ipvsadm -ln 
IP Virtual Server version 1.2.1 (size=1048576)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.2.1.1:7012 wrr
  -> 10.2.2.2:8012            Masq    10     0          0         

抓包分析

业务调用的过程我们在三端都进行了抓包,分别如下:

  • 客户端

从上面客户端的TCP的抓包结果来看,主要过程如下:

  1. 客户端发起请求包括两个过程:获取连接、执行请求;
  2. 服务器端11:33分主动发起了Close操作,并且客户端连接没有设置tcp_keepalive;
  3. 客户端11:35:04发起Close操作,发送FIN包到LVS;
  4. 客户端11:35:05秒发起FIN包的重发操作;
  5. 客户端11:35:05发送SYN包到LVS,建立连接;
    .......
  • 看了一下业务方的代码,业务方代码的逻辑大致为:
  1. 从连接池获取连接;
  2. 调用http rpc请求;
  3. 记录1,2两个步骤的延迟时间;

从问题看来,业务请求发起后,没有主动发起连接的Close操作;
服务端超时了,主动发起了Close操作后;
等待了2分钟左右,客户端发起请求逻辑,进入到第一步操作,从连接池获取连接,发现连接已经被close,于是被动调用Close,但是这一步触发了FIN包多次重传;(整个重传周期很长)
1秒后Close操作完成,客户端连接池于是发起新的连接,并发起HTTP请求。
于是整个过程超过1S。
FIN重传了很多次,但是从结果来看,重传两次左右,系统就开始发起新的SYN来建立连接了。

LVS为什么没有响应的客户端的FIN包

上面抛出了一个问题,为什么FIN包会重传,没有收到LVS端的ACK包?
K8S环境下的4层负载均衡服务,我们是采用的是LVS的NAT模式,我们是基于LVS的DNAT加上linux系统上iptables规则实现SNAT,来达到FULLNAT的功能。所以这里要用到系统的连接跟踪(conntrack),连接跟踪的概念的如下:

连接跟踪(CONNTRACK),顾名思义,就是跟踪并且记录连接状态。Linux为每一个经过网络堆栈的数据包,生成一个新的连接记录项 (Connection entry)。此后,所有属于此连接的数据包都被唯一地分配给这个连接,并标识连接的状态。连接跟踪是防火墙模块的状态检测的基础,同时也是地址转换中实 现SNAT和DNAT的前提。那么Netfilter又是如何生成连接记录项的呢?每一个数据,都有“来源”与“目的”主机,发起连接的主机称为“来源”,响应“来源”的请求的主机即为目的,所谓生成记录项,就是对每一个这样的连接的产生、传输及终止进行跟踪记录。由所有记录项产生的表,即称为连接跟踪表。

跟这个故障相关的conntrack配置项为:
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
在我们的LVS机器上,配置的是120秒,也就是2分钟,所以在该CASE中,服务器端主动发起连接操作后,两分钟后连接跟踪表中对应的表项会被删除。这时候客户端的FIN请求,LVS由于连接表项中不存在对应的记录,由于发现包是FIN控制包,所以不会再去创建对应的连接记录项,直接把包转发到服务器后端。

而在服务器后端收到包后,没有对应的连接,就会直接回一个RST包,所以客户端会不断的发起FIN重传。

补充另外一种现象以及处理方案

抓包发现情况2:

  1. 15:38:46.198336 CLIENT->LVS SYN包(TCP Port numbers reused)
  2. 15:38:47.201539 CLIENT->LVS SYN包(TCP Retransmission)
  3. 15:38:47.201657 LVS->CLIENT SYN/ACK包
  4. 15:38:47.201703 CLIENT->LVS ACK
    从这种情况来看,建立连接用了1秒钟来完成,造成业务请求超过1秒。
    通过分析,我们发现我们的有一项向内核参数设置如下:

net.ipv4.vs.conn_reuse_mode = 1

这个参数可以让我们对tcp端口及时的重复利用,但是由于在k8s环境下,我们利用了LVS的NAT以及主机的SNAT功能(conntrack=1),客户端与LVS发起的连接请求,在与服务端建立连接后,我们会通过连接记录项进行记录,连接记录项也有状态,而当TCP Close阶段,连接记录项处于TIMEWAIT状态时。这时候,如果客户端再次发起连接(使用重用端口),IPVS由于发现了该记录项,就会把第一个SYN包DROP掉,进行保护,这样导致一秒后的SYN包重传。

为了解决这个问题,我们把参数进行了调整。设置为

net.ipv4.vs.conn_reuse_mode = 0
为就能够得到解决了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355