zoukankan      html  css  js  c++  java
  • 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,
    • 应用层面尽量避免频繁关闭连接,如业务优化,或者使用长连接等;
  • 相关阅读:
    java 重定向和转发的区别
    Python练习100则--部分概念的没有做
    MYSQL忘记root密码后如何修改
    二分查找注意点
    数据库连接串整理
    MYSQL mysqldump数据导出详解
    MVCC的一些理解
    MySQL 加锁处理分析-转载
    扩展1
    maven-windows使用
  • 原文地址:https://www.cnblogs.com/wsl-hitsz/p/14828056.html
Copyright © 2011-2022 走看看