点击关注公众号,回复“2T”获取2TB学习资源!
互联网架构师后台回复 2T 有特别礼包
来源:https://zhenbianshu.github.io/
最近有同事在用 ab 进行服务压测,到 QPS 瓶颈后怀疑是起压机的问题,来跟我借测试机,于是我就趁机分析了一波起压机可能成为压测瓶颈的可能,除了网络 I/O、机器性能外,还考虑到了网络协议的问题。
当然本文的主角并不是压测,后来分析证明同事果然还是想多了,瓶颈是在服务端。
分析起压机瓶颈的过程中,对于 TCP TIME_WAIT 状态的一个猜想引起了我的兴趣。由于之前排查问题时,简单地接触过这个状态,但并未深入了解,于是决定抽时间分析一下,拆解一下我的猜想。
我们都知道 TCP 的三次握手,四次挥手,说来简单,但在不稳定的物理网络中,每一个动作都有可能失败,为了保证数据被有效传输,TCP 的具体实现中也加入了很多对这些异常状况的处理。
一眼看上去,这么多种状态,各个方向的连线,让人感觉有点懵。但细细分析下来,还是有理可循的。
首先,整个图可以被划分为三个部分,即上半部分建连过程,左下部分主动关闭连接过程和右下部分被动关闭连接过程。
再来看各个部分:建连过程就是我们熟悉的三次握手,只是这张图上多了一个服务端会存在的 LISTEN 状态;而主动关闭连接和被动关闭连接,都是四次挥手的过程。
在 Linux 上,我们常用 netstat 来查看网络连接的状态。当然我们还可以使用更快捷高效的 ss (Socket Statistics) 来替代 netstat。
这两个工具都会列出此时机器上的 socket 连接的状态,通过简单的统计就可以分析出此时服务器的网络状态。
所以TIME_WAIT 是这么一种状态:TCP 四次握手结束后,连接双方都不再交换消息,但主动关闭的一方保持这个连接在一段时间内不可用。
那么,保持这么一个状态有什么用呢?
上文中提到过,对于复杂的网络状态,TCP 的实现提出了多种应对措施,TIME_WAIT 状态的提出就是为了应对其中一种异常状况。
为了理解 TIME_WAIT 状态的必要性,我们先来假设没有这么一种状态会导致的问题。暂以 A、B 来代指 TCP 连接的两端,A 为主动关闭的一端。
由以上两个原因,TIME_WAIT 状态的存在是非常有意义的。
由原因来推实现,TIME_WAIT 状态的保持时长也就可以理解了。确定 TIME_WAIT 的时长主要考虑上文的第二种情况,保证关闭连接后这个连接在网络中的所有数据包都过期。
那么如果我们使用 curl 对服务器请求时,作为客户端,都要使用本机的一个端口号,所有的端口号分配到 60s 内,每秒就要控制在 500 QPS,再多了,系统就无法再分配端口号了。
可是在使用 ab 进行压测时时,以每秒 4000 的 QPS 运行几分钟,起压机照样正常工作,使用 ss 查看连接详情时,发现一个 TIME_WAIT 状态的连接都没有。
一开始我以为是 ab 使用了连接复用等技术,仔细查看了 ss 的输出发现本地端口号一直在变,到底是怎么回事呢?
于是,我在一台测试机启动了一个简单的服务,端口号 8090,然后在另一台机器上起压,并同时用 tcpdump 抓包。
结果发现,第一个 FIN 包都是由服务器发送的,即 ab 不会主动关闭连接。
登上服务器一看,果然,有大量的 TIME_WAIT 状态的连接。
但是由于服务器监听的端口会复用,这些 TIME_WAIT 状态的连接并不会对服务器造成太大影响,只是会占用一些系统资源。
当然,高并发情况下,太多的 TIME_WAIT 也会给服务器造成很大的压力,毕竟维护这么多 socket 也是要消耗资源的。
感谢您的阅读,也欢迎您发表关于这篇文章的任何建议,关注我,技术不迷茫!小编到你上高速。
· END ·
最后,关注公众号互联网架构师,在后台回复:2T,可以获取我整理的 Java 系列面试题和答案,非常齐全。
正文结束
推荐阅读 ↓↓↓
1.不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事
5.37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...
6.IntelliJ IDEA 2019.3 首个最新访问版本发布,新特性抢先看
文章浏览阅读831次。Loader在Android3.0引进,它让异步加载数据变得容易。特征:1.在Activity、Fragment中都可以使用2.Loader可以提供异步加载数据3.监视数据源的变化,当数据源发生变化的时候,会传递新的数据4.当loader重建的时候,会自动链接到最后一个Loader的cursor数据上,而不去进行重新查找。在app中使用Loader的时候,可能使_onloaderapk
文章浏览阅读7.6k次,点赞6次,收藏39次。作者:悠悠做神仙 来源: 恒生LIGHT云社区 ...
Effective C++学习笔记 - 让自己习惯C++,构造/析构/赋值运算,命名习惯,template元编程,定制new和delete,了解new-handler的行为。
文章浏览阅读372次。 First, some general definitions (specific to iOS):Static library - a unit of code linked at compile time, which does not change. However, iOS static libraries are not allowed to conta..._ios static dynamic
文章浏览阅读854次,点赞20次,收藏14次。本系统带文档lw万字以上文末可领取本课题的JAVA源码参考。
文章浏览阅读392次。给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。示例 1:输入: nums = [-1,0,3,5,9,12], target = 9输出: 4解释: 9 出现在 nums 中并且下标为 4示例 2:输入: nums = [-1,0,3,5,9,12], target = 2输出: -1解释: 2 不存在 nums 中因此返回 -1使用了最直接的二分法写查找算_leetcode 二分查找下标python
文章浏览阅读1.8k次。删除ackplugin插件、卸载ackplugin插件、卸载ack、如何卸载电脑上ackplugin 登录插件、ackplugin卸载时需要密码怎么办请用密码:123456,试试.我的卸载密码就是这个...._ackplugin
文章浏览阅读4.7w次,点赞148次,收藏880次。主题模型LDA的实现及其可视化pyLDAvis1. 无监督提取文档主题——LDA模型1.1 准备工作1.2 调用api实现模型2. LDA的可视化交互分析——pyLDAvis2.1 安装pyLDAvis2.2 结合gensim调用api实现可视化p.s. 保存结果为独立网页p.p.s. 加快prepare速度?2.3 如何分析pyLDAvis可视化结果2.3.1. **每个主题表示什么意义?**2.3.2 每个主题有多么普遍?2.3.3 主题之间有什么关联?1. 无监督提取文档主题——LDA模型这个模型_pyldavis可视化的图怎么看
文章浏览阅读738次。本人小白,跟着b站尚硅谷学springbootSpringBoot视频教程(idea版)_2018_Java视频_spring boot_springboot核心篇+…https://www.bilibili.com/video/av38657363/?p=5视频p05新建maven项目后,在导入maven的spring jar包依赖时报错1.一开始无法导入报错:Unable to import ..._org.springframework.boot:spring-boot-starter-parent:pom:1.5.9.release failed
文章浏览阅读246次。很久没搞嵌入式了,为了学习,买了正点的arm板子,芯片是Freescale的imx6ull。为了更好的学习,决定放弃正点官网的资料,一切都从原网下载。_imx6ull 启动 运行
文章浏览阅读679次。个人思路,不保熟,供批判。n, x = 5, 1t = x << 1h = [None, 1, 0, 1, 0, None]l = 0r = ndef check(ability): # 任意长度为ability的区间,内部和要大于等于t次? if ability >= n: return True for i in range(1, n - ability + 1): if sum(h[i:i + ability]) _青蛙过河lanqiaooj题号2097python解法
文章浏览阅读202次。SharedPreferences(共享参数)为了保存软件的设置参数,Android 平台为我们提供了一个SharedPreferences 类,它是一个轻量级的存储类,特别适合用于保存软件配置参数获取SharedPreferences对象的方法SharedPreferences sharedPreferences = getSharedPreferences("test", MODE_PR..._android sharedpreferences 入门