timewait过多怎么办?教你几招快速解决问题!

吉云

今天搞服务器的时候,发现一个挺烦人的问题,就是客户端那边老是报连接失败,一看就是端口不够用。我赶紧去查一下,果然,服务器上一堆的timewait。

啥是 timewait?

简单说,就是TCP连接断开的时候,不会立马就消失,还得等一会儿,这个等待的状态就叫timewait。 搞这玩意儿主要是为防止一些网络上的幺蛾子,比如旧的连接数据包延迟到达之类的。

timewait过多怎么办?教你几招快速解决问题!

我是咋发现这个问题的?

我发现某个服务访问特别慢,就去看下那个服务的日志,没啥问题。我又去看看nginx的访问日志,用 tail -f 瞅瞅,发现访问状态码都是200,也挺正常。然后我就去看看服务器的状态,CPU、内存啥的都正常,负载也不高。我想到网络连接问题,会不会是连接数太多?

排查过程:

我用个命令:netstat -n awk '/^tcp/ {++S[$NF]} END {for(a in S) print a}。这个命令能看到当前服务器上各种TCP连接状态的数量。一运行,好家伙,timewait 状态的数量吓人。

咋解决的?

我试几个方法:

timewait过多怎么办?教你几招快速解决问题!

  • 改几个内核参数:

**_tw_reuse = 1

**_tw_recycle = 1

**_syncookies = 1

timewait过多怎么办?教你几招快速解决问题!

改完之后,我用 sysctl -p 命令让配置生效。

改完这些,timewait 数量是少些,但是感觉还是不够彻底。

  • 我还想过调大可用端口范围:

就是改 **_local_port_range 这个参数,不过这个方法只能稍微缓解一下,不是长久之计。

timewait过多怎么办?教你几招快速解决问题!

timewait 这玩意儿,我觉得,不是说看到就一定要干掉。只要服务器还能正常跑,就别太纠结。真到必须处理的时候,再想办法优化。我这回就是先改那几个内核参数,然后继续观察,看看情况再说。毕竟服务器稳定才是最重要的!

免责声明:由于无法甄别是否为投稿用户创作以及文章的准确性,本站尊重并保护知识产权,根据《信息网络传播权保护条例》,如我们转载的作品侵犯了您的权利,请您通知我们,请将本侵权页面网址发送邮件到qingge@88.com,深感抱歉,我们会做删除处理。

目录[+]