TIME_WAIT过多及解决
2024-08-25 11:41:26
最近用http_load做压测,跑出来一大串“Cannot assign requested address ”的错误,查了一下,是TIME_WAIT过多导致的。因为短时间内有太多连接,所以占用了大量端口,同时关闭连接后又处于TIME_WAIT状态,端口不能复用,所以慢慢的无端口可用,所以就“Cannot assign requested address”了。
可以对内核参数进行优化:
sysctl -w net.ipv4.tcp_timestamps=1 开启对于TCP时间戳的支持,若该项设置为0,则下面一项设置不起作用
sysctl -w net.ipv4.tcp_tw_recycle=1 表示开启TCP连接中TIME-WAIT sockets的快速回收
echo 5000> /proc/sys/net/ipv4/tcp_max_tw_buckets
问题解决了,不过还是要来探讨一下,为什么会有TIME_WAIT,以及上面的修改是什么意思。
TIME_WAIT是TCP关闭连接中,主动关闭的一方,在接收到对方的FIN包,并给出ACK应答后,会进入的一个状态。下面的图来自《UNP》
为什么一定要有TIME_WAIT的状态?能否直接进入CLOSEED?不能,TCP是建立在不可靠网络上的可靠协议,主动方发送的ACK包可能延迟,从而触发被动方的FIN包重传,这一来一去,就是2MSL的时间。因此,必须要有这个状态,以保证TCP的可靠性。否则,如果当重传的FIN包到达后,可能导致两个问题:
1. 旧连接已经不在,只能返回RST包,被动关闭的一方无法关闭TCP连接
2. 新连接已经建立,FIN包可能对新连接有干扰。
所以,TIME_WAIT不能没有,但不能太多,该考虑限制它的数量。
tcp_tw_recycle:顾名思义就是回收TIME_WAIT连接,注意的是timestamp必须打开,网上有人说不用,其实是因为timestamp一般是默认打开的,这里有个陷阱,参考http://www.pagefault.info/?p=416。
tcp_max_tw_buckets:很显然,用于控制TIME_WAIT数量的。
TCP/IP协议还有许多要了解的地方。
最新文章
- SQL Server里的文件和文件组
- 20160817_Redis配置操作
- git常用命令,git版本控制和Xcode结合使用,用Xcode提交到github,github客户端使用
- 学习hamcrest和mockito时的总结和demo
- CSDN编程挑战——《高斯公式》
- Linux命令行学习
- HTML 基本语法速查
- JavaScript中的闭包永远都存储在内存中,除非关闭浏览器
- qq通讯录
- 《http权威指南》读书笔记15
- CRM系统(第四部分)
- [03] Spring "Hello World"
- 链表(上):如何实现LRU缓存淘汰算法?
- Kafka学习入门
- js练习计算器
- selenuim爬虫实战 (下)
- 数独高阶技巧入门之七——AIC &; Nice Loop
- GUI应用程序架构的十年变迁:MVC,MVP,MVVM,Unidirectional,Clean
- 数据库性能优化之SQL语句优化1
- js引入方式的弹框方法2