博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
与TIME_WAIT相关的几个内核参数
阅读量:5209 次
发布时间:2019-06-14

本文共 1245 字,大约阅读时间需要 4 分钟。

问题

公司用浏览器访问线上服务一会失败一会成功,通过ssh连接服务器排查时发现ssh也是这样;

检查

抓包后发现建立连接的请求已经到了服务器,但它没有响应;

纠结了好久,后来在腾讯云技术支持及查了相关资料后发现是开启了net.ipv4.tcp_tw_recycle导致的,将其设为0即可解决;

原因

收集了几个与TIME_WAIT相关的内核参数:

net.ipv4.tcp_timestamps     默认开启(1),数据包加时间戳,需要两端都开启,可以防止高速率宽带时引起的序号回绕(序号不够用重新开始了),可以精确计算出RTT(往返时延)net.ipv4.tcp_tw_reuse      默认关闭(0),允许TIME_WAIT的socket在超过1秒后重用,作用于发起连接的client端net.ipv4.tcp_tw_recycle     默认关闭(0),允许快速回收处于TIME_WAIT的socket,作用于接受连接的server端net.ipv4.ip_local_port_range  默认(32768 61000),可用的端口范围net.ipv4.tcp_max_tw_buckets   默认(180000),允许处于TIME_WAIT状态socket的最大数量

若TIME_WAIT过多,可以开启reuse和recycle来快速回收,值得注意的一点是,reuse和recycle需要timestamps开启才会生效,当然timestamps一般都是开启的;

上面问题的原因是,当多个client通过nat方式联网时(一个局域网)它们的源ip相同但发出的时间戳很可能是乱的,而开启了recycle的server端就会丢弃这些混乱的数据包,于是现象就是有时能连上有时不行;

至于reuse,开启可能导致端口重用后还会收到上个socket延迟到达的数据,这个一般问题不大,应用程序都会校验;

虽然reuse在client端配置有效,而recycle在server端,但现在很多机器都是接受连接后再去连接别人,所以视情况而定吧。

总结

官方文档是不建议开启reuse和recycle的,因为违反了tcp协议,所以临时开启来解决异常情况后应及时关闭;

若TIME_WAIT过多导致系统很慢(Linux对其优化很好,且现在不缺这点内存,所以一般不会),可以降低tcp_max_tw_buckets,阿里云和腾讯云分别默认设置为了5000、65536;

若端口不足可以考虑加大 ip_local_port_range,最大不超过:1024  65535;

TIME_WAIT过多长远的解决方式还是通过程序开发方面:

1. 代码中及时正确的调用socket的close;

2. 让client端主动断开连接,而不是server端;

3. 尽量使用长连接,而不是短连接;

 

over

转载于:https://www.cnblogs.com/toSeek/p/8961981.html

你可能感兴趣的文章
selenium学习中遇到的问题
查看>>
大数据学习之一——了解简单概念
查看>>
P1-13:集成日志组件 logback 2彩色日志
查看>>
昨天开始接任务
查看>>
Linux升级内核教程(CentOS7)
查看>>
JDK5.0 特性 监控与管理虚拟机
查看>>
Lintcode: Partition Array
查看>>
分享适合个人站长的5类型网站
查看>>
类别的三个作用
查看>>
【SICP练习】85 练习2.57
查看>>
runC爆严重安全漏洞,主机可被攻击!使用容器的快打补丁
查看>>
Maximum Product Subarray
查看>>
shell 默认变量
查看>>
solr相关配置翻译
查看>>
通过beego快速创建一个Restful风格API项目及API文档自动化(转)
查看>>
解决DataSnap支持的Tcp长连接数受限的两种方法
查看>>
Synchronous/Asynchronous:任务的同步异步,以及asynchronous callback异步回调
查看>>
ASP.NET MVC5 高级编程-学习日记-第二章 控制器
查看>>
如何选择适合自己的云管理平台(一)
查看>>
Hibernate中inverse="true"的理解
查看>>