统计在一台前端机上高峰时间TCP连接的情况,统计命令:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

结果:

除了ESTABLISHED,可以看到连接数比较多的几个状态是:FIN_WAIT1, TIME_WAIT, CLOSE_WAIT, SYN_RECV和LAST_ACK;下面的文章就这几个状态的产生条件、对系统的影响以及处理方式进行简单描述。

发现存在大量TIME_WAIT状态的连接
tcp        0      0 127.0.0.1:3306              127.0.0.1:41378             TIME_WAIT
tcp        0      0 127.0.0.1:3306              127.0.0.1:41379             TIME_WAIT
tcp        0      0 127.0.0.1:3306              127.0.0.1:39352             TIME_WAIT
tcp        0      0 127.0.0.1:3306              127.0.0.1:39350             TIME_WAIT
tcp        0      0 127.0.0.1:3306              127.0.0.1:35763             TIME_WAIT
tcp        0      0 127.0.0.1:3306              127.0.0.1:39372             TIME_WAIT
tcp        0      0 127.0.0.1:3306              127.0.0.1:39373             TIME_WAIT
tcp        0      0 127.0.0.1:3306              127.0.0.1:41176             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时间
 
修改之后,再用命令查看TIME_WAIT连接数
netstat -ae|grep “TIME_WAIT” |wc –l

发现大量的TIME_WAIT 已不存在,mysql进程的占用率很快就降下来的,网站访问正常。
 不过很多时候,出现大量的TIME_WAIT状态的连接,往往是因为网站程序代码中没有使用mysql.colse(),才导致大量的mysql  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的等待时间

http://kerry.blog.51cto.com/172631/105233/

修改之后,再用
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 

如果你的服务器是Windows平台,可以修改下面的注册表键值:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"TcpTimedWaitDelay"=dword:0000001e

此值是TIME_WAIT状态的最长时间。缺省为240秒,最低为30秒,最高为300秒。建议为30秒。
 
注释:

1,TCP结束的过程如下:

Server                             Client

-------------- FIN -------------->  server: fin_wait_1

<------------- ACK --------------- client: close_wait  server:fin_wait_2

<------------- FIN  --------------- client发出fin之后就关闭

-------------- ACK ------------->  server发出ack后进入time_wait状态

Time_Wait的默认时间是2倍的MLS,就是240秒钟。MLS是TCP片在网上的最长存活时间。
TIME_Wait的主要作用是保证关闭的TCP端口不立即被使用。因为当网络存在延迟时,可能当某个端口被关闭后,网络中还有一些重传的TCP片在发向这个端口,如果这个端口立即建立新的TCP连接,则可能会有影响。所以使用2倍的MSL时间来限制这个端口立即被使用。

现在的问题在于,4分钟的时间有点长。
因此,Time_wait的影响,我想,首先每个TCP连接都各自有个数据结构,叫TCP Control Block.Time_wait的时候这个数据结构没有被释放。所以当有太多的TCP连接时,内存可能会被占用很多。
 
 
 
2,To ValorZ:TIME_WAIT状态也称为2MSL等待状态,而不是2MLS,笔误吧!

每个TCP报文在网络内的最长时间,就称为MSL(Maximum Segment Lifetime),它的作用和IP数据包的TTL类似。

RFC793指出,MSL的值是2分钟,但是在实际的实现中,常用的值有以下三种:30秒,1分钟,2分钟。

注意一个问题,进入TIME_WAIT状态的一般情况下是客户端,大多数服务器端一般执行被动关闭,不会进入TIME_WAIT状态,当在服务器端关闭某个服务再重新启动时,它是会进入TIME_WAIT状态的。

举例:
1.客户端连接服务器的80服务,这时客户端会启用一个本地的端口访问服务器的80,访问完成后关闭此连接,立刻再次访问服务器的80,这时客户端会启用另一个本地的端口,而不是刚才使用的那个本地端口。原因就是刚才的那个连接还处于TIME_WAIT状态。

2.客户端连接服务器的80服务,这时服务器关闭80端口,立即再次重启80端口的服务,这时可能不会成功启动,原因也是服务器的连接还处于TIME_WAIT状态。

windows

TcpTimedWaitDelay和MaxUserPort设置
描述:确定 TCP/IP 可释放已关闭连接并重用其资源前,必须经过的时间。
关闭和释放之间的此时间间隔通称 TIME_WAIT 状态或两倍最大段生命周期(2MSL)状态。
此时间期间,重新打开到客户机和服务器的连接的成本少于建立新连接。
减少此条目的值允许 TCP/IP 更快地释放已关闭的连接,为新连接提供更多资源。如果运行的应用程序需要快速释放和创建新连接,而且由于 TIME_WAIT 中存在很多连接,导致低吞吐量,则调整此参数。
如何查看或设置: 使用 regedit 命令访问 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/ Services/TCPIP/Parameters 注册表子键并创建名为 TcpTimedWaitDelay 的新 REG_DWORD 值。
将此值设置为十进制 30,其为十六进制 0x0000001e。
该值将等待时间设置为 30 秒。
停止并重新启动系统。 缺省值:0xF0,它将等待时间设置为 240 秒(4 分钟)。
建议值:最小值为 0x1E,它将等待时间设置为 30 秒。
MaxUserPort 描述:确定在应用程序从系统请求可用用户端口时,TCP/IP 可指定的最高端口号。
如何查看或设置: 使用 regedit 命令访问 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/ Services/TCPIP/Parameters 注册表子键并创建名为 MaxUserPort 的新 REG_DWORD 值。
停止并重新启动系统。
缺省值:无 建议值:至少十进制 32768。
注:当在 Windows NT 或 Windows 2000 操作系统上调整 WebSphere Application Server 时,同时使用这两个参数。
希望本站的知识能给您的工作、学习和生活带来方便和乐趣!  

http://blog.csdn.net/gzh0222/article/details/8491178

http://www.httpclient.cn/category/time_wait/

转载于:https://www.cnblogs.com/softidea/p/6062147.html

linux 大量的TIME_WAIT解决办法相关推荐

  1. Linux服务器 大量的CLOSE_WAIT、TIME_WAIT解决办法

    Linux服务器 大量的CLOSE_WAIT.TIME_WAIT解决办法 系统上线之后,通过如下语句查看服务器时,发现有不少TIME_WAIT和CLOSE_WAIT. netstat -an | aw ...

  2. 远程连接Linux服务器无法连接解决办法

    1.查看SSH是否安装(检查是否装了SSH包) 输入命令:rpm -qa | grep ssh 如下如所示系统已经默认安装了SSH: 远程连接Linux服务器无法连接解决办法 若没有安装,则输入 yu ...

  3. windows文件上传到linux平台乱码的解决办法

    windows文件上传到linux平台乱码的解决办法 1.首先在windows上,使用ConvertZ工具,把文件名称(不是文件内容)转码,例如GBK换成Unicode 简体 2.然后上传到linux ...

  4. RedFlag Linux忘记root密码解决办法

    转于lee的http://hi.baidu.com/maozilee/item/12a62a76f371df2bd7a89c5d RedFlag Linux忘记root密码解决办法 Linux忘记ro ...

  5. linux文件系统变成只读,Linux文件系统变成只读解决办法

    this.p={ m:2, b:2, loftPermalink:'', id:'fks_0950650870810800660930850870950850840830690920860850740 ...

  6. mysql 大量 time wait_mysql出现大量的TIME_WAIT解决办法

    如果你的mysql出现大量的TIME_WAIT,最可能的原因是mysql.colse(),才导致大量的mysql TIME_WAIT 哦,有了原因解决办法很简单 1.找到有问题的程序加入 mysql. ...

  7. Kali Linux”下列签名无效“解决办法

    今天用Kali Linux在更新软件的时候,提示了一个错误: 下列签名无效:EXPKEYSIG ED444FF07D8D0BF6 Kali Linux Repository <devel@kal ...

  8. Linux终端乱码的解决办法

    用SSH连接Linux时经常会遇到乱码的情况,痛苦了好久,在网上找到一个解决办法,编辑~/.bash_profile文件,加入下面两行: LANG="zh_CN.GB18030" ...

  9. linux在双系统中消失了,win和linux双系统下,重装win系统导致linux系统消失的解决办法...

    笔者曾经遇到过这样的问题,就是在安装了windows的电脑上,在安装linux系统,然后重新安装windows后,导致了linux系统无法启动,但是在windows下,看到linux的磁盘分区还是完好 ...

最新文章

  1. 华为的全闪存存储发展历程
  2. python表达式3and not5的值_太原理工大学python考试题总结
  3. C++ - 实现strstr函数
  4. [转] Web前端优化之 内容篇
  5. python实现tsne
  6. report CRM_CREATE_REQUEST_FOR_MAT
  7. Object address check - Jurisdiction code
  8. Map类集合K/V能不能存储null值的情况
  9. 《调制解调算法》专栏导航贴
  10. 开发小计之判断输入字符串类型(正则表达式)
  11. 全网音乐解析_Android干货 | 手机端的音乐神器
  12. JAVA-1007. 素数对猜想 (20)
  13. 433M超再生无线模块编码-解码
  14. Closures in OOC
  15. 在同一个浏览器上打开同一个网址只打开一个窗口的方法
  16. 支持nfc的android手机,NFC手机有哪些 2017支持NFC功能的手机推荐 (5)
  17. 工作十年,你的职场核心竞争力在哪里
  18. 1m照片的宽和高是多少_1m等于多少kb(上传1m照片是多大尺寸)
  19. Java基础数据类型以及取值范围
  20. python里raise是什么意思_python raise有什么用

热门文章

  1. Spring Boot 实现接口幂等性的 4 种方案!还有谁不会?
  2. 10篇顶会paper,入选微软学者,上海交大吴齐天的科研思考!
  3. 深入浅出聚类算法!如何对王者英雄聚类分析,探索英雄之间的秘密
  4. 谷歌创造ImageNet1K新纪录:性能不佳的微调模型不要扔,求一下平均权重就能提升性能...
  5. 2W+好评,这个python数据分析课程免费开放3天!
  6. 都优秀!两位硕士都发一作Nature,之后选择却截然不同!
  7. 这才是程序员想弄死产品经理的真正原因!
  8. 操作系统学习:启动进入实模式
  9. linux定时任务简记
  10. Python设计模式-观察者模式