今天搞服务器的时候,发现一个挺烦人的问题,就是客户端那边老是报连接失败,一看就是端口不够用。我赶紧去查一下,果然,服务器上一堆的timewait。
啥是 timewait?
简单说,就是TCP连接断开的时候,不会立马就消失,还得等一会儿,这个等待的状态就叫timewait。 搞这玩意儿主要是为防止一些网络上的幺蛾子,比如旧的连接数据包延迟到达之类的。
我是咋发现这个问题的?
我发现某个服务访问特别慢,就去看下那个服务的日志,没啥问题。我又去看看nginx的访问日志,用 tail -f
瞅瞅,发现访问状态码都是200,也挺正常。然后我就去看看服务器的状态,CPU、内存啥的都正常,负载也不高。我想到网络连接问题,会不会是连接数太多?
排查过程:
我用个命令:netstat -n awk '/^tcp/ {++S[$NF]} END {for(a in S) print a}
。这个命令能看到当前服务器上各种TCP连接状态的数量。一运行,好家伙,timewait 状态的数量吓人。
咋解决的?
我试几个方法:
- 改几个内核参数:
**_tw_reuse = 1
**_tw_recycle = 1
**_syncookies = 1
改完之后,我用 sysctl -p
命令让配置生效。
改完这些,timewait 数量是少些,但是感觉还是不够彻底。
- 我还想过调大可用端口范围:
就是改 **_local_port_range
这个参数,不过这个方法只能稍微缓解一下,不是长久之计。
timewait 这玩意儿,我觉得,不是说看到就一定要干掉。只要服务器还能正常跑,就别太纠结。真到必须处理的时候,再想办法优化。我这回就是先改那几个内核参数,然后继续观察,看看情况再说。毕竟服务器稳定才是最重要的!