网易首页 > 网易号 > 正文 申请入驻

服务压测发现怪异现象,一顿排查,揪出“TIME_WAIT”这个内鬼~

0
分享至

  • 这套Github上40K+star学习笔记,可以帮你搞定95%以上的Java面试

  • 毫不夸张的说,这份SpringBoot学习指南能解决你遇到的98%的问题

  • 给跪了!这套万人期待的 SQL 成神之路PDF,终于开源了

来源:https://zhenbianshu.github.io

由来

最近有同事在用 ab 进行服务压测,到 QPS 瓶颈后怀疑是起压机的问题,来跟我借测试机,于是我就趁机分析了一波起压机可能成为压测瓶颈的可能,除了网络 I/O、机器性能外,还考虑到了网络协议的问题。

当然本文的主角并不是压测,后来分析证明同事果然还是想多了,瓶颈是在服务端。

分析起压机瓶颈的过程中,对于 TCP TIME_WAIT 状态的一个猜想引起了我的兴趣。由于之前排查问题时,简单地接触过这个状态,但并未深入了解,于是决定抽时间分析一下,拆解一下我的猜想。

TCP 的状态转换

我们都知道 TCP 的三次握手,四次挥手,说来简单,但在不稳定的物理网络中,每一个动作都有可能失败,为了保证数据被有效传输,TCP 的具体实现中也加入了很多对这些异常状况的处理。

状态分析

先用一张图来回想一下 TCP 的状态转换。

一眼看上去,这么多种状态,各个方向的连线,让人感觉有点懵。但细细分析下来,还是有理可循的。

首先,整个图可以被划分为三个部分,即上半部分建连过程,左下部分主动关闭连接过程和右下部分被动关闭连接过程。

再来看各个部分:建连过程就是我们熟悉的三次握手,只是这张图上多了一个服务端会存在的 LISTEN 状态;而主动关闭连接和被动关闭连接,都是四次挥手的过程。

查看连接状态

在 Linux 上,我们常用netstat来查看网络连接的状态。当然我们还可以使用更快捷高效的ss(Socket Statistics) 来替代 netstat。

这两个工具都会列出此时机器上的 socket 连接的状态,通过简单的统计就可以分析出此时服务器的网络状态。

TIME_WAIT定义

我们从上面的图中可以看出来,当 TCP 连接主动关闭时,都会经过 TIME_WAIT 状态。而且我们在机器上 curl 一个 url 创建一个 TCP 连接后,使用 ss 等工具可以在一定时长内持续观察到这个连续处于 TIME_WAIT 状态。

所以TIME_WAIT 是这么一种状态:TCP 四次握手结束后,连接双方都不再交换消息,但主动关闭的一方保持这个连接在一段时间内不可用。

那么,保持这么一个状态有什么用呢?

原因

上文中提到过,对于复杂的网络状态,TCP 的实现提出了多种应对措施,TIME_WAIT 状态的提出就是为了应对其中一种异常状况。

为了理解 TIME_WAIT 状态的必要性,我们先来假设没有这么一种状态会导致的问题。暂以 A、B 来代指 TCP 连接的两端,A 为主动关闭的一端。

  • 四次挥手中,A 发 FIN, B 响应 ACK,B 再发 FIN,A 响应 ACK 实现连接的关闭。而如果 A 响应的 ACK 包丢失,B 会以为 A 没有收到自己的关闭请求,然后会重试向 A 再发 FIN 包。

    如果没有 TIME_WAIT 状态,A 不再保存这个连接的信息,收到一个不存在的连接的包,A 会响应 RST 包,导致 B 端异常响应。

    此时, TIME_WAIT 是为了保证全双工的 TCP 连接正常终止。

  • 我们还知道,TCP 下的 IP 层协议是无法保证包传输的先后顺序的。如果双方挥手之后,一个网络四元组(src/dst ip/port)被回收,而此时网络中还有一个迟到的数据包没有被 B 接收,A 应用程序又立刻使用了同样的四元组再创建了一个新的连接后,这个迟到的数据包才到达 B,那么这个数据包就会让 B 以为是 A 刚发过来的。

    此时, TIME_WAIT 的存在是为了保证网络中迷失的数据包正常过期。

由以上两个原因,TIME_WAIT 状态的存在是非常有意义的。

时长的确定

由原因来推实现,TIME_WAIT 状态的保持时长也就可以理解了。确定 TIME_WAIT 的时长主要考虑上文的第二种情况,保证关闭连接后这个连接在网络中的所有数据包都过期。

说到过期时间,不得不提另一个概念: 最大分段寿命(MSL, Maximum Segment Lifetime),它表示一个 TCP 分段可以存在于互联网系统中的最大时间,由 TCP 的实现,超出这个寿命的分片都会被丢弃。

TIME_WAIT 状态由主动关闭的 A 来保持,那么我们来考虑对于 A 来说,可能接到上一个连接的数据包的最大时长:A 刚发出的数据包,能保持 MSL 时长的寿命,它到了 B 端后,B 端由于关闭连接了,会响应 RST 包,这个 RST 包最长也会在 MSL 时长后到达 A,那么 A 端只要保持 TIME_WAIT 到达 2MS 就能保证网络中这个连接的包都会消失。

MSL 的时长被 RFC 定义为 2分钟,但在不同的 unix 实现上,这个值不并确定,我们常用的 centOS 上,它被定义为 30s,我们可以通过/proc/sys/net/ipv4/tcp_fin_timeout这个文件查看和修改这个值。

ab 的”奇怪”表现猜想

由上文,我们知道由于 TIME_WAIT 的存在,每个连接被主动关闭后,这个连接就要保留 2MSL(60s) 时长,一个网络四元组也要被冻结 60s。而我们机器默认可被分配的端口号约有 30000 个(可通过/proc/sys/net/ipv4/ip_local_port_range文件查看)。

那么如果我们使用 curl 对服务器请求时,作为客户端,都要使用本机的一个端口号,所有的端口号分配到 60s 内,每秒就要控制在 500 QPS,再多了,系统就无法再分配端口号了。

可是在使用 ab 进行压测时时,以每秒 4000 的 QPS 运行几分钟,起压机照样正常工作,使用 ss 查看连接详情时,发现一个 TIME_WAIT 状态的连接都没有。

分析

一开始我以为是 ab 使用了连接复用等技术,仔细查看了 ss 的输出发现本地端口号一直在变,到底是怎么回事呢?

于是,我在一台测试机启动了一个简单的服务,端口号 8090,然后在另一台机器上起压,并同时用 tcpdump 抓包。

结果发现,第一个 FIN 包都是由服务器发送的,即 ab 不会主动关闭连接。

登上服务器一看,果然,有大量的 TIME_WAIT 状态的连接。

但是由于服务器监听的端口会复用,这些 TIME_WAIT 状态的连接并不会对服务器造成太大影响,只是会占用一些系统资源。

小结

当然,高并发情况下,太多的 TIME_WAIT 也会给服务器造成很大的压力,毕竟维护这么多 socket 也是要消耗资源的

推荐阅读更多精彩内容

  • 服务压测发现怪异现象,一顿排查,揪出“TIME_WAIT”这个内鬼~

    来源:https://zhenbianshu.github.io/ 最近有同事在用 ab 进行服务压测,到 QPS...

    Java山鸡阅读17评论0赞0

  • 杂谈 TIME_WAIT 状态

    在谈time_wait状态前,我们来看下Tcp的四次挥手吧: 简单解释一下这张网图吧: 客户端传完数据,想拔*无情...

    代码小杂鱼阅读60评论0赞0

  • 搞定time_wait,就靠它了

    1.time_wait状态是什么简单来说:time_wait状态是四次挥手中server向client发送FIN终...

    CPP后台服务器开发阅读87评论0赞0

  • 凯恩想在热刺和穆里尼奥建立“牢固的关系”

    哈里·基恩想和新教练何塞·穆里尼奥建立一种“牢固的关系”,这将有助于托特纳姆更上一层楼。 凯恩在4-2战胜奥林匹亚...

    疯狂SPORTS阅读2,667评论0赞4

  • 表情管理

    表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...

    Persistenc_6aea阅读799评论0赞2

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
证监会新闻发言人就融券与转融券有关情况答记者问

证监会新闻发言人就融券与转融券有关情况答记者问

界面新闻
2024-06-16 20:35:00
变天了?英国《经济学人》头条:中国已成为科学的超级大国

变天了?英国《经济学人》头条:中国已成为科学的超级大国

互联网大聪明
2024-06-16 03:04:28
太震惊了!网传亏损总额已达26万亿,市场正在被散户抛弃?

太震惊了!网传亏损总额已达26万亿,市场正在被散户抛弃?

云姐财说
2024-06-16 13:48:35
小罗:我受够了 这支巴西队几乎都是平庸的普通球员

小罗:我受够了 这支巴西队几乎都是平庸的普通球员

罗克
2024-06-16 15:25:04
男子在军民合用机场发现外国乘客手机偷拍,怀疑是间谍,机场回应

男子在军民合用机场发现外国乘客手机偷拍,怀疑是间谍,机场回应

看晓天下事
2024-06-16 14:56:16
倒查30年!各地税务局纷纷展开竞赛追缴欠税。之前为何不征?

倒查30年!各地税务局纷纷展开竞赛追缴欠税。之前为何不征?

十三级台阶
2024-06-16 09:28:38
你是不是想死?奔驰车主棍打女骑手,真实身份被扒,评论区沸腾了

你是不是想死?奔驰车主棍打女骑手,真实身份被扒,评论区沸腾了

刚哥说法365
2024-06-16 02:52:08
小S精神状态堪忧!假摔真哭大闹录影现场,搭档慌乱嘉宾傻眼

小S精神状态堪忧!假摔真哭大闹录影现场,搭档慌乱嘉宾傻眼

萌神木木
2024-06-16 12:25:55
中央开始新一轮严查!这五类人“好日子”到头了,老百姓拍手叫好

中央开始新一轮严查!这五类人“好日子”到头了,老百姓拍手叫好

天下纵览
2024-06-16 13:30:20
南方医科大学教师因抢救患儿耽误上课受罚?同事:她人挺好的,是在抢救不是别的情况

南方医科大学教师因抢救患儿耽误上课受罚?同事:她人挺好的,是在抢救不是别的情况

极目新闻
2024-06-16 13:41:50
乌克兰和平峰会联合公报草案全文

乌克兰和平峰会联合公报草案全文

头条爆料007
2024-06-16 14:14:06
今天是6月16日下午,刚刚得知一个重要消息,明天要来大动作吗

今天是6月16日下午,刚刚得知一个重要消息,明天要来大动作吗

股市皆大事
2024-06-16 13:47:34
1981年以来,美元和人民币,分别贬值多少倍?

1981年以来,美元和人民币,分别贬值多少倍?

安安小小姐姐
2024-06-16 09:12:52
欧洲杯惨败之夜,38岁巨星消失!65分钟被换下,遭球迷恶搞

欧洲杯惨败之夜,38岁巨星消失!65分钟被换下,遭球迷恶搞

叶青足球世界
2024-06-16 02:56:58
再见,伦纳德!可能又不打了!这可是全世界唯一超级球队……

再见,伦纳德!可能又不打了!这可是全世界唯一超级球队……

篮球实战宝典
2024-06-16 14:38:44
终于等到你!32岁范迪克迎来欧洲杯首秀,担任荷兰队长

终于等到你!32岁范迪克迎来欧洲杯首秀,担任荷兰队长

直播吧
2024-06-16 20:04:22
成名真的太早下下届2030世界杯,16岁亚马尔甚至还是U23球员

成名真的太早下下届2030世界杯,16岁亚马尔甚至还是U23球员

直播吧
2024-06-16 14:43:14
太突然了!山东菏泽曹县翰林府长达7分29秒视频,为何引发热搜?

太突然了!山东菏泽曹县翰林府长达7分29秒视频,为何引发热搜?

火山诗话
2024-06-16 16:42:18
中方钝刀子割肉见效,菲律宾不顾美国对俄制裁,找俄罗斯给条活路

中方钝刀子割肉见效,菲律宾不顾美国对俄制裁,找俄罗斯给条活路

历史有些冷
2024-06-15 20:00:02
全总机关报关注“教师因救人迟到受处分”事件:律师称南医大或涉滥用处罚权

全总机关报关注“教师因救人迟到受处分”事件:律师称南医大或涉滥用处罚权

澎湃新闻
2024-06-16 16:30:27
2024-06-16 21:00:49
java架构学习
java架构学习
java架构经验学习分享
378文章数 7808关注度
往期回顾 全部

科技要闻

iPhone 16会杀死大模型APP吗?

头条要闻

G7峰会上特鲁多口误:将努力确保乌克兰承担责任

头条要闻

G7峰会上特鲁多口误:将努力确保乌克兰承担责任

体育要闻

没人永远年轻 但青春如此无敌还是离谱了些

娱乐要闻

上影节红毯:倪妮好松弛,娜扎吸睛

财经要闻

打断妻子多根肋骨 上市公司创始人被公诉

汽车要闻

售17.68万-21.68万元 极狐阿尔法S5正式上市

态度原创

房产
艺术
亲子
公开课
军事航空

房产要闻

万华对面!海口今年首宗超百亩宅地,重磅挂出!

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

亲子要闻

你是我最棒的老爸 祝天下所有好爸爸父亲节快乐#土豆王国彩虹糖

公开课

近视只是视力差?小心并发症

军事要闻

以军宣布在加沙南部实行"战术暂停"

无障碍浏览 进入关怀版