TIME_WAIT过多问题

TIME_WAIT发送在TCP连接中主动关闭连接的一方。

问题

TIME_WAIT消耗的是客户端的端口。
由于一个TCP连接是靠一个四元组唯一标识(客户端IP,客户端端口,服务器IP,服务器端口),在这个四元组中,服务器IP和服务器端口是固定的,而变量是客户端IP和客户端端口,所以当同一个客户端频繁向服务器建立连接时,其端口号是消耗很快的。建立次数越频繁就越有可能失败,因为内核给客户端进程绑定的有可能是同一个端口号,这样就没法建立连接,而

这个客户端和服务器处于TIME_WAIT的连接越多,客户端可选的端口就越少,这是TIME_WAIT的危害。

业务场景

Nginx 作为反向代理时,Nginx作为服务器的客户端。
大量的短链接,可能导致 Nginx 上的 TCP 连接处于 time_wait 状态:

每一个 time_wait 状态,都会占用一个「本地端口」,上限为 65535(16 bit,2 Byte);
当大量的连接处于 time_wait 时,新建立 TCP 连接会出错,address already in use : connect 异常

反向代理连接数上限为什么是65535

服务端的一个端口可以被很多客户端连接,但是每个连接都会占用一个句柄,理论上这个句柄打开的数量只受服务器资源的限制。

查看TIME_WAIT连接数

  • netstat统计:各种连接的数量
$ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
ESTABLISHED 1154
TIME_WAIT 1645
  • ss
ss -s
Total: 3338 (kernel 32067)
TCP:   168 (estab 65, closed 12, orphaned 0, synrecv 0, timewait 1/0), ports 0

Transport Total     IP        IPv6
*     32067     -         -        
RAW   1         0         1        
UDP   29        25        4        
TCP   156       132       24       
INET      186       157       29       
FRAG      0         0         0        

问题分析

大量的 TIME_WAIT 状态 TCP 连接存在,其本质原因是什么?

  • 大量的短连接存在。

解决办法

  • 客户端
    HTTP 请求的头部,connection 设置为 keep-alive,保持存活一段时间:现在的浏览器,一般都这么进行了

  • 反向代理服务器
    允许 time_wait 状态的 socket端口 被重用
    必要时缩短time_wait时间

socket重用

因为有TIME_WAIT状态的存在,在重启程序的时候可能会出现java.net.BindException: Address already in use的错误,这是因为这个端口TIME_WAIT状态需要等待2MSL。在RFC793中规定MSL的时间为2min,在实际使用中一般是30s或者1min,在高并发的情况下毫无疑问,这将造成大量连接无法建立的问题,那么有什么方法可以处理这些问题那?

SO_REUSEADDR

  • SO_REUSEADDR设置为1在TIME_WAIT时允许套接字端口复用。
  • SO_REUSEADDR设置为0TIME_WAIT时不允许允许套接字端口复用。

在Java中可以通过以下代码设置:

ServerSocket serverSocket = new ServerSocket();
// setReuseAddress 必须在 bind 函数调用之前执行
serverSocket.setReuseAddress(true);

SO_REUSEADDR可以用在以下四种情况下。(摘自《Unix网络编程》卷一,即UNPv1)

  1. 当有一个有相同本地地址和端口的socket1处于TIME_WAIT状态时,而你启动的程序的socket2要占用该地址和端口,你的程序就要用到该选项。
  2. SO_REUSEADDR允许同一port上启动同一服务器的多个实例(多个进程)。但每个实例绑定的IP地址是不能相同的。在有多块网卡或用IP Alias技术的机器可 以测试这种情况。
  3. SO_REUSEADDR允许单个进程绑定相同的端口到多个socket上,但每个socket绑定的ip地址不同。这和2很相似,区别请看UNPv1
  4. SO_REUSEADDR允许完全相同的地址和端口的重复绑定。但这只用于UDP的多播,不用于TCP。

所以SO_REUSEADDR并不是在所有情况下都可以使用的。

启动端口复用,不过TCP连接需要绑定不同的ip

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

推荐阅读更多精彩内容