| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> 记time_wait状态引起的端口占用排查 -> 正文阅读 |
|
[系统运维]记time_wait状态引起的端口占用排查 |
0. 问题背景在Liunx服务器上发现有 10倍于 LISTEN 服务的 time_wait 状态,服务并非高并发,日常的连接数也比较少,因此该现象明显异常 1. 问题定位time_wait状态回顾下 time_wait 状态处于 TCP 通信的哪个阶段: 在TCP四次挥手过程中,主动断开连接的一方会在发送完最后一个 ACK 包后,等待 2MSL(Maximum Segment Lifetime)的时间,这个阶段就处于 time_wait 状态 一般在高并发、短连接(单个连接时长超过time_wait时间)的服务端容易出现大量time_wait并存的情况,但在此服务器应不存在 确认原因首先查看服务器 2MSL 的设置,是正常范围 2. 解决过程长连接探测因为此情况下,TCP 连接的两方都在同一台机器上,无法规避 time_wait 状态的存在,因此首先将探测程序改为长连接 这是之前的探测连接代码
修改后选择 HTTP 长连接的方式,这样可以最大程度规避 time_wait 状态
(PS:这里直接用 TCP 连接也可达到同样效果) 而且上述探测功能会固定占用和 LISTEN 端口一样数量的端口,如果和动态分配范围内的端口重合会存在问题 预留端口如果 time_wait 状态过多影响剩余端口的分配,可以设置预留端口,来保证time_wait状态不会影响其他功能的使用 这样当 Linux 调用 bind(0) 或者 connect 从ip_local_port_range(前面说的32768-61000)中随机选取源端口时,会排除ip_local_reserved_ports中定义的端口,因此就不会出现端口被占用了服务无法启动
SO_REUSEADDR和SO_REUSEPORT关于这两个参数的概念理解并不是本篇的重点,大家可以参考SO_REUSEADDR和SO_REUSEPORT作用这篇博文的解释 对于time_wait状态较多,但又无法解决的情况下(比如就是需要服务端主动断开连接or服务端还需要请求下游),可以通过设置 SO_REUSEADDR和SO_REUSEPORT 参数,让 time_wait 状态不要影响正常的服务 可以通过以下方式来进行设置:
以上是本篇文章的全部内容,下一篇会总结当服务端口频繁被其他随机分配端口占用的情况下,可以如何通过 Golang或其他代码来解决 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 6:21:19- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |