由nginx TW状态过多引发。。2018-01-17

原因

回顾之前的印象笔记时,查看到之前工作时记录的问题,查看之前解决办法时决定重新总结一下

背景

  1. 后端使用nodejs处理连接,主要是做验证
  2. 前端使用nginx做控制,做7层反向proxy
  3. 验证时间很短,所以从nginx通过proxy_pass到后端的realserver之间使用的是短连接

现象

某次大型活动(国足比赛),请求数大增,nginx服务器出现大量TIME_WAIT状态的连接,查看方式:

netstat方法:
shell> netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
ss查看比netstat要快:
ss -s查看TW的数量

解决办法

Nginx做前端Proxy时TIME_WAIT过多的问题
要点

  • 修改系统预留端口,防止自己进程监听的大于1024的端口被占用
  • 解决TW过多:修改nginx upstream配置中的keepalive时长并且在server段中使用http1.1(1.0不支持keepalive)

upstream http_backend {
server 127.0.0.1:8080;

keepalive 16;
}

server {
...

location /http/ {
proxy_pass http://http_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
...
}
}

其他

通过这次解决过程顺便记录涉及到的其他内容

TW状态产生的过程
状态转换图

TCP三次握手和四次挥手就不再啰嗦了,从上图可以看出,主动发送FIN的一方会受到TIME-WAIT的“惩罚”(就像主动提出分手会受到道德谴责一段时间)由RFC规定为2MSL,根据不同的操作系统MSL(Maximum Segment Lifetime)设定的时间不一样,Linux一般是30s且该值无法通过内核参数修改,必须自己重新编译内核才能修改此参数。

穿插一点MSL的知识:MSL指的是报文段的最大生存时间,如果报文段在网络活动了MSL时间,还没有被接收,那么会被丢弃。关于MSL的大小,RFC 793协议中给出的建议是两分钟,不过实际上不同的操作系统可能有不同的设置,以Linux为例,通常是半分钟,两倍的MSL就是一分钟,也就是60秒,并且这个数值是硬编码在内核中的,也就是说除非你重新编译内核,否则没法修改它:

#define TCP_TIMEWAIT_LEN (60*HZ)
TW产生的原因

有的人看到这就可能会问:为什么需要TIME-WAIT这个状态?这个状态纯粹是坑爹啊。。。其实主要是由于早期TCP设计时是用于建立有保障的连接的,由于当时网络底层的设备远没有现在这么发达,所以四次挥手时为了防止出现最后一个ACK对方没有收到并再次重传FIN接着导致:

  • 连接已经关闭,再次收到FIN回复一个RST;
  • 新的连接已经建立,FIN包会干扰到新的连接;
    总之,不管怎么样都会导致TCP不再可靠因此TW状态是必须存在的,由产生原因很容易想到为什么是2MSL,因为最坏的情况下一来一回刚好两段MSL。
如何控制TIME-WAIT数量

网络上大部分文章谈到解决TW状态都会提到以下内核参数

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
tcp_timestamps
net.ipv4.tcp_fin_timeout

实际上 net.ipv4.tcp_fin_timeout 控制的是fin_wait_2这个状态的超时时间,重用回收和时间戳的机制可以看下面的文章描述:
这个链接说明很清楚了

要点

  • ip_conntrack:顾名思义就是跟踪连接。(引入问题过多不建议使用)
  • tcp_tw_recycle:顾名思义就是回收TIME_WAIT连接。(NAT模式下有问题,产生时间戳混乱,不建议使用)
  • tcp_tw_reuse:顾名思义就是复用TIME_WAIT连接。(作为连接的发起方(Client)有用(需网络稳定),作为被连接方基本没用)
  • tcp_max_tw_buckets:顾名思义就是控制TIME_WAIT总数。(治标不治本,限制tw队列大小系统日志会报「TCP: time wait bucket table overflow」)

结论

有时候,如果我们换个角度去看问题,往往能得到四两拨千斤的效果。前面提到的例子:客户端向服务端发起HTTP请求,服务端响应后主动关闭连接,于是TIME_WAIT便留在了服务端。这里的关键在于主动关闭连接的是服务端!在关闭TCP连接的时候,先出手的一方注定逃不开TIME_WAIT的宿命,套用一句歌词:把我的悲伤留给自己,你的美丽让你带走。如果客户端可控的话,那么在服务端打开KeepAlive,尽可能不让服务端主动关闭连接,而让客户端主动关闭连接,如此一来问题便迎刃而解了。

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

推荐阅读更多精彩内容

  • 1. Nginx的模块与工作原理 Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单...
    rosekissyou阅读 10,196评论 5 124
  • 1、TCP状态linux查看tcp的状态命令:1)、netstat -nat 查看TCP各个状态的数量2)、lso...
    北辰青阅读 9,398评论 0 11
  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,642评论 24 1,002
  • Transmission Control Protocol,传输控制协议,是一种面向连接的、可靠的、基于字节流的传...
    PennyWong阅读 3,003评论 1 15
  • 白天上班,工作闲余,常常听音频课程.这样晚上回家,我会满血复活.纵使儿子万般摧残,我定岿然不动. 晚饭已备齐.儿子...
    玫瑰铿锵阅读 271评论 4 5