`
flychao88
  • 浏览: 753745 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

探讨如何减少Linux服务器TIME_WAIT过多的问题

 
阅读更多

       今天早上一上班,有同事就反映公司好几个网站都打不开,登陆数据库

服务器(windows),发现很卡,于是重启了下服务器,进入系统后,没过一会问题依旧,查看了下系统进程,发现mysql占用率达到99%,可以肯定的是mysql连接出现问题:

netstat -an
192.168.12.13:3306      192.168.12.12:30443      TIME_WAIT
192.168.12.13:3306      192.168.12.12:30444      TIME_WAIT
192.168.12.13:3306      192.168.12.12:30445      TIME_WAIT
192.168.12.13:3306      192.168.12.12:30446      TIME_WAIT
192.168.12.13:3306      192.168.12.12:30447      TIME_WAIT
192.168.12.13:3306      192.168.12.12:30448      TIME_WAIT
192.168.12.13:3306      192.168.12.12:30449      TIME_WAIT
192.168.12.13:3306      192.168.12.12:30450      TIME_WAIT
192.168.12.13:3306      192.168.12.12:30451      TIME_WAIT
192.168.12.13:3306      192.168.12.12:30452      TIME_WAIT
... ...

    

      根据TCP协议定义的3次握手断开连接规定,发起socket主动关闭的一方 socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(Max Segment Lifetime),在Windows下默认为4分钟,即240秒,TIME_WAIT状态下的socket不能被回收使用. 具体现象是对于一个处理大量短连接的服务器,如果是由服务器主动关闭客户端的连接,将导致服务器端存在大量的处于TIME_WAIT状态的socket, 甚至比处于Established状态下的socket多的多,严重影响服务器的处理能力,甚至耗尽可用的socket,停止服务. TIME_WAIT是TCP协议用以保证被重新分配的socket不会受到之前残留的延迟重发报文影响的机制,是必要的逻辑保证.

      在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters,添加名为TcpTimedWaitDelay的

DWORD键,设置为60,以缩短TIME_WAIT的等待时间

 

登陆到web服务器(linux):

        

netstat -ae |grep mysql
tcp     0      0 aaaa:53045          192.168.12.13:mysql           TIME_WAIT   root       0
tcp     0      0 aaaa:53044          192.168.12.13:mysql           TIME_WAIT   root       0
tcp     0      0 aaaa:53051          192.168.12.13:mysql           TIME_WAIT   root       0
tcp     0      0 aaaa:53050          192.168.12.13:mysql           TIME_WAIT   root       0
tcp     0      0 aaaa:53049          192.168.12.13:mysql           TIME_WAIT   root       0
tcp     0      0 aaaa:53048          192.168.12.13:mysql           TIME_WAIT   root       0
tcp     0      0 aaaa:53055          192.168.12.13:mysql           TIME_WAIT   root       0
tcp     0      0 aaaa:53054          192.168.12.13:mysql           TIME_WAIT   root       0
tcp     0      0 aaaa:53053          192.168.12.13:mysql           TIME_WAIT   root       0
tcp     0      0 aaaa:53052          192.168.12.13:mysql           TIME_WAIT   root       0
tcp     0      0 aaaa:53059          192.168.12.13:mysql           TIME_WAIT   root       0

 

    发现系统存在大量TIME_WAIT状态的连接,通过调整内核参数解决,

    vi /etc/sysctl.conf

 

    编辑文件,加入以下内容:

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30

  

然后执行 /sbin/sysctl -p 让参数生效。

 

net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;

 

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 修改系統默认的 TIMEOUT 时间

 

修改之后,再用

netstat -ae|grep mysql
tcp     0      0 aaaa:50408       192.168.12.13:mysql       ESTABLISHED nobody     3224651
tcp     0      0 aaaa:50417       192.168.12.13:mysql       ESTABLISHED nobody     3224673
tcp     0      0 aaaa:50419       192.168.12.13:mysql       ESTABLISHED nobody     3224675
 

 

       发现大量的TIME_WAIT 已不存在,mysql进程的占用率很快就降下来的,各网站访问正常!!

       以上只是暂时的解决方法,最后仔细巡查发现是前天新上线的一个系统,程序代码中没有使用mysql.colse(),才导致大量的mysql  TIME_WAIT  

分享到:
评论

相关推荐

    CentOS解决服务器存在大量time_wait的问题

    本文主要探讨了如何解决CentOS服务器上存在的大量TIME_WAIT TCP连接问题,这可能导致服务器连接数过多,进而引起服务假死。当服务器之间的通信过于频繁,如通过REST请求互相调用时,Java服务器可能无法及时回收TCP...

    关于释放time_wait连接多的方案

    针对这一问题,可以通过调整Linux系统的内核参数来优化TIME_WAIT状态的处理,以下是一些具体的优化策略: ### 1. 开启SYN Cookies `net.ipv4.tcp_syncookies=1` 此参数用于在SYN队列满时启用SYN Cookies功能。在...

    netstat显示 TIME-WAIT 的原因及解决办法

    TIME_WAIT状态带来的主要问题在于资源占用,尤其是在服务器端,大量并发连接进入TIME_WAIT可能导致端口耗尽,影响新连接的建立。解决这个问题的方法包括: 1. **调整TCP参数**:可以在操作系统层面修改TCP的超时...

    [服务器性能优化]Linux下高并发socket最大连接数和sysctl(time_wait)设置

    总结来说,优化Linux服务器的socket连接数和sysctl配置对于处理高并发场景至关重要。通过调整`sysctl.conf`文件中的相关参数,可以有效地提升系统性能,降低延迟,增强服务的稳定性。不过,任何改动都需要结合具体...

    四次挥手中收到乱序的FIN包如何处理542 - 557

    客户端和服务器之间的 TCP 连接,在关闭连接时,需要经历四个阶段:FIN_WAIT_1、CLOSE_WAIT、FIN_WAIT_2 和 TIME_WAIT。其中,FIN_WAIT_2 状态是指客户端已经发送了 FIN 报文,并等待服务器的确认响应。 现在,假设...

    Linux_Tcp.rar_LINUX TCP _linux TCP_tcp linux

    本文将深入探讨Linux下的TCP编程,包括TCP套接字(socket)的工作原理、C/S架构的实现以及相关的TCP/Linux优化策略。 首先,TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。它通过三次握手建立连接,并...

    10如何提升TCP四次挥手的性能?1

    1. `tcp_tw_reuse`:允许在TIME_WAIT状态下重用连接,减少资源消耗,但可能引发混淆。 2. `tcp_tw_recycle`:快速回收TIME_WAIT连接,但可能导致时间戳问题,影响连接的正确性。 3. `tcp_fin_timeout`:控制FIN_WAIT...

    linux_example

    6. **TCP状态机**:理解TCP连接的不同状态,如CLOSED、LISTEN、SYN_SENT、SYN_RCVD、ESTABLISHED、FIN_WAIT_1、FIN_WAIT_2、CLOSE_WAIT、CLOSING、LAST_ACK和TIME_WAIT。 7. **性能优化**:如何调整内核参数以优化...

    Linux网络编程:端口复用

    通过启用SO_REUSEADDR,程序可以在TIME_WAIT状态结束后立刻重用端口,无需等待整个TIME_WAIT周期。 在Linux中,还可以使用SO_REUSEPORT选项进一步优化端口复用。此选项允许多个进程同时绑定到同一个端口,通过内核...

    查看apache连接的连接并发数[参照].pdf

    Apache服务器是世界上最流行的Web服务器之一,它以其稳定性和可扩展性而受到广泛的使用。在软件开发过程中,确保服务器能够...同样,过多的`TIME_WAIT`状态可能表明服务器未能有效地管理连接关闭,需要优化相关设置。

    tcp通讯协议握手分析.zip_Linux tcp通讯详细介绍_tcp 握手 源码_tcp 通讯_握手_通讯握手协议

    下面我们将深入探讨Linux环境下的TCP通讯机制,特别是TCP握手的过程和相关源码分析。 一、TCP三次握手 1. SYN (Synchronize Sequence Numbers):当客户端想要与服务器建立连接时,它会发送一个SYN包,包含一个随机...

    linux 网络编程 socket选项的实现

    - `SO_REUSEADDR`:允许在TIME_WAIT状态下重用套接字地址,这对于多线程服务器避免等待TIME_WAIT超时特别有用。 - `SO_KEEPALIVE`:在无数据传输时周期性发送探测报文,检查连接是否仍然活跃。 - `TCP_NODELAY`:...

    提高 Linux 上 socket 性能

    例如,可以通过修改`/proc/sys/net/ipv4/tcp_`系列的内核参数,如`tcp_congestion_control`选择不同的拥塞控制算法,`tcp_tw_reuse`允许重用TIME_WAIT套接字以减少资源消耗,或`tcp_keepalive_time`设置连接空闲多久...

    ice_chen_linux_function

    本文将深入探讨标题"ice_chen_linux_function"所涉及的Linux下C语言编程常用系统函数,并结合描述中的提示,介绍它们的功能和使用方法。 1. **标准I/O库函数**: - `printf` 和 `scanf`:用于格式化输入输出,是...

    服务器调优──提高并发量.docx

    `net.ipv4.tcp_fin_timeout = 30`缩短FIN_WAIT_2状态的时间,减少资源占用。 除了文件句柄和TCP参数,还应关注其他内核参数,如共享内存(`shmmax`、`shmall`等)和信号灯(`semmns`、`semmsl`等)的数量,以适应...

    Linux_API应用开发

    本主题将深入探讨Linux API的核心概念、常用函数以及它们在实际开发中的应用。 Linux API包含了众多用于进程管理、内存管理、文件操作、网络通信、设备驱动等关键功能的函数和结构体。下面我们将逐一解析这些关键...

    你知道一台Linux服务器可以负载多少个连接吗

    在探讨Linux服务器能负载多少个连接之前,首先要理解TCP连接的本质。TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议,它基于四元组(src_ip, src_port, dst_ip, dst_port)来唯一识别一个...

Global site tag (gtag.js) - Google Analytics