TIME_WAIT太多解决思路和方法

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_37886429/article/details/80166340

问题描述

环境是SLB+2台ECS实例,在ECS实例上跑的是的LNMP服务,在某一天下午三点中app包加载数据很慢,平时可能一两秒就能加载完成js,css等样式

解决方法

1、找到加载慢的域名和URL
访问后端数据库,看获取数据情况,访问数据正常。


2、查看操作系统CPU、内存、负载、网络情况
查看CPU命令:top
查看内存命令:free -m
服务器负载:uptime
网络:ping 域名


检测完后都没有问题


3、查看nginx访问日志
通过 tail -f 日志文件 查看,访问url地址,状态码都是200,证明正常


4、查看数据库
通过 show full processlist 查看数据库的整体状况,正在执行的SQL等情况。


备注:
这个我没有执行,因为我前面检测都没有问题,也能获取到数据,返回状态码是200,说明数据库是没有问题的。
如果有很多的SQL,有explain检索下,看看是否需要优化


5、查看TCP状态
命令:netstat -an | awk ‘/^tcp/{++S[$NF]}END{for(i in S) print i,S[i]}’
发现TIME_WAIT的数量有近五千个,后来就先查看内核中tcp相关的参数
> sysctl -a | grep ‘tw’
net.ipv4.tcp_max_tw_buckets = 5000 #TIME_WAIT的数量
net.ipv4.tcp_tw_recycle = 0 #关闭TCP连接中TIME_WAIT sockets的快速回收,开启快速回收是不安全的,尤其是在nat模式下
net.ipv4.tcp_tw_reuse = 0 #不开启将TIME_WAIT sockets重新用于新的TCP连接


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


②TIMEOUT时间
net.ipv4.tcp_fin_timeout = 30




首先修改内核参数:
> cat >> /etc/sysctl.conf << END
net.ipv4.tcp_max_tw_buckets = 32768
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_fin_timeout = 30
END
> sysctl -p


其次,清理内存里面的数据
> sync
> echo 3 > /proc/sys/vm/drop_caches


执行完上述操作,TIME_WAIT 的数量并没有降下来


最后设置为长链接,才解决。


6、nginx和apache长链接设置方式
(1)当nginx为web服务器的时候,长链接设置方式,只需要将9000端口修改为sock连接即可。
(2)当nginx作为代理服务器的时候,需要在
upstream backend {
server xxxxxx;
keepalive 165;
}


location /http/ {
##设置开启长连接
proxy_http_version 1.1 ;
proxy_set_header Connection “” ;


proxy_pass http://backend ;
}


(3)apache开启长链接参数
KeepAlive On
KeepAliveTimeout 60

产生大量TIME_WAIT的原因

一般情况服务器端不会出现TIME_WAIT状态,因为大多数情况都是客户端主动发起连接并主动关闭连接。但是某些服务如pop/smtp、ftp却是服务端收到客户端的QUIT命令后主动关闭连接,这就造成这类服务器上容易出现大量的TIME_WAIT状态的连接,而且并发量越大处于此种状态的连接越多。另外,对于被动关闭连接的服务在主动关闭客户端非法请求或清理长时间不活动的连接时(这种情况很可能是客户端程序忘记关闭连接)也会出现TIME_WAIT的状态。

有 TIME_WAIT 不一定不好,也不是因为它多,而是占用了资源致使不能创建更多的socket。
TIME_WAIT 对于web服务器来说,占用了一个socket 60秒,socket的数量是有限的,最多65535。

解决 TIME_WAIT 问题思路

①解决发起端的IP地址,添加更多的IP(time_wait多的服务器)
②改用长链接方式
③修改程序代码,这个是我在面试的时候面试官说的,我没有实践过

展开阅读全文

没有更多推荐了,返回首页