TIME_WAIT 状态过多怎么办?
作者:互联网
这道题目是腾讯考察的题目,当时没有回答上来,这也是面试过程中的一道经典题目,结合网上的一些博客,做一个记录,好以后复习。
上图是四次挥手的示意图,左边表示active close, 右边表示passive close, 当然active close 不一定就表示客户端,passive close 一定就表示服务端。
time_wait 的危害
- 如果服务端有大量的close-wait的连接没有及时关闭,而在高并发短连接的HTTP请求下,客户端又不断地发送新的连接请求,这样就会打开的文件描述符数会不断增加。在linux系统中,一个进程最大可以同时打开的文件描述符是有上限的,ulimit命令可以查到。当达到这个上限时,服务端进程将无法新建socket来响应新的请求。
- 过多的话会占用内存,一个TIME_WAIT占用4k大小
解决方案
编辑内核文件/etc/sysctl.conf,加入以下内容:
- net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;打开这个syncookies的目的实际上是:“在服务器资源(并非单指端口资源,拒绝服务有很多种资源不足的情况)不足的情况下,尽量不要拒绝TCP的syn(连接)请求,尽量把syn请求缓存起来,留着过会儿有能力的时候处理这些TCP的连接请求”。
- net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
- net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
- net.ipv4.tcp_fin_timeout = 30 修改系默认的 TIMEOUT 时间
- 客户端,HTTP 请求的头部,connection 设置为 keep-alive,
- 应用层面尽量避免频繁关闭连接,如业务优化,或者使用长连接等;
标签:请求,过多,tcp,TCP,TIME,close,net,连接,WAIT 来源: https://www.cnblogs.com/wsl-hitsz/p/14828056.html