大量Time_Wait和Close_Wait状态下的TCP连接问题解决

今天公司一个网站突然打开特别慢,有时候还会出现打不开的情况,开始怀疑是网络问题,但网络排查没有发现任何异常,最后还是决定在网站服务器内部排查问题

网站用的中间件是apache,监听端口7080,先查看一下7080端口的监听情况

发现出现了大量的TIME_WAIT和CLOSE_WAIT状态下的连接

CLOSE_WAIT

对方主动关闭连接或者网络异常导致连接中断,这时我方的状态会变成CLOSE_WAIT 此时我方要调用close()来使得连接正确关闭

TIME_WAIT

我方主动调用close()断开连接,收到对方确认后状态变为TIME_WAIT。TCP协议规定TIME_WAIT状态会一直持续2MSL(即两倍的分段最大生存期),以此来确保旧的连接状态不会对新连接产生影响。处于TIME_WAIT状态的连接占用的资源不会被内核释放,所以作为服务器,在可能的情况下,尽量不要主动断开连接,以减少TIME_WAIT状态造成的资源浪费。
 
所以这些没有被释放的连接肯定占用了大量的系统资源,导致了网站的访问得不到及时的响应,形成了恶性循环
 
解决方法:
1.修改windows的注册表,缩短TIME_WAIT的等待时间
   在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters,右键添加名为TcpTimedWaitDelay的DWORD键,设置为20
 
  
 2.修改apache的mpm配置,增加服务器处理的最大并发量
 
不同操作系统上默认的MPM模块
操作系统 MPM模块 描述
Windows mpm_winnt 不用介绍了吧:)
Unix/Linux mpm_prefork 不用介绍了吧:)
BeOS mpm_beos 由Be公司开发的一种多媒体操作系统,官方版已停止更新。
Netware mpm_netware 由NOVELL公司推出的一种网络操作系统
OS/2 mpmt_os2 一种最初由微软和IBM共同开发的操作系统,现由IBM单独开发(微软放弃OS/2,转而开发Windows)

 

  mpm_winnt模块是专门针对Windows操作系统而优化设计的MPM模块。它只创建一个单独的子进程,并在这个子进程中轮流产生多个线程来处理请求。

  (1)由于apache默认状态下mpm模块的代码是注释的,所以需要先修改apche核心配置

  

  修改为

  # Server-pool management (MPM specific)
  Include conf/extra/httpd-mpm.conf

  (2)修改httpd-mpm.conf

  <IfModule mpm_winnt_module>

    ThreadsPerChild 150 #推荐设置:小型网站=1000 中型网站=1000~2000 大型网站=2000~3500

    MaxRequestsPerChild 0 #推荐设置:小=10000 中或大=20000~100000

  <IfModule>

  

  对应的配置参数作用如下:

  ThreadsPerChild
  每个子进程的最大并发线程数。
  MaxRequestsPerChild
  每个子进程允许处理的请求总数。如果累计处理的请求数超过该值,该子进程将会结束(然后根据需要确定是否创建新的子进程),该值设为0表示不限制请求总数(子进程永不结束)。

  该参数建议设为非零的值,可以带来以下两个好处:

    1. 可以防止程序中可能存在的内存泄漏无限进行下去,从而耗尽内存。
    2. 给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。

     注意:在以上涉及到统计请求数量的参数中,对于KeepAlive的连接,只有第一个请求会被计数。

猜你喜欢

转载自www.cnblogs.com/Mr-10/p/10973854.html
今日推荐