TIME-WAIT多一定会影响服务吗?

本文阅读量 Posted by Kird on 2019-08-09
都知道TimeWait太多会影响业务,那么需要关注哪些值呢?TimeWait数量多一定有问题吗?

TIME-WAIT单服务端最大数量

何为单服务端最大Tine-wait数量呢?为何要引入这个名词?
了解完TimeWait相关概念和理论后,我们知道,TimeWait这个状态是TCP链接上的正常状态,但是如果太多,对服务器会有影响。具体怎么定义这个多?数量达到什么情况下会影响?怎么查看?能否通过监控某个值可以直接指导当前系统是否有风险?

1.如果太多,对服务器会有影响。具体的影响,在工作中和互联网博客上也看到不少,最常见的是端口耗尽,nginx error日志出现 Cannot Assign address 错误码为99的错误日志。此时nginx将无法代理正常请求,nginx 消耗CPU也变大,此时业务会出现问题。

2.怎么查看当前机器上的TimeWait数量?

1
2
3
4
5
6
7
8
9
ss -an | awk '{++state[$1]} END {for(key in state) print key,"\t",state[key]}'
SYN-SENT 67
ESTAB 428
State 1
FIN-WAIT-1 54
FIN-WAIT-2 8
TIME-WAIT 140751
CLOSE-WAIT 1
LISTEN 17

140751 ?这个值好大,远大于65535,现在服务是不是有问题?其实,这只是我的一台测试机,除了nginx配置,根本没业务流量,更不用说压力了。
所以14W这个数不算多,怎么才算多呢?

3.怎么才算TimeWait多?达到多少系统会有风险,需要提前优化?
这个问题得看上面第二个问题的取值是否是咱们想要的:
上面取值为140751,是当前连接池里所有的五元组(不知道5元组的可以看看上篇“聊聊TimeWait”的文章),如果后端服务端数量很多,平均下来每个五元组占用的并不多,所以在需要分配地址的时候,使用其他的随机端口就可以新建一个连接。
所以,这个14W并不是我们想要的值。
有同学会发现,还有一个地方也能看端口数,但是这个值永远不会超过65535,这个数可以通过下面的命令查看:

1
2
3
ss -s
Total: 1182 (kernel 1167)
TCP: 156444 (estab 370, closed 155367, orphaned 34, synrecv 0, timewait 155328/0), ports 58737

上面的58737,就是当前系统使用的随机端口。
那问题就来了…58737,离65535差的不多,是不是代表当前系统随机端口快要占满了呢?

不对!
这个值是随机端口占用总数,一点也没有错。但是这个值,不能成为我们的参考指标。
这个值的意义是从ss -an里拿出来当前所有连接状态里,使用到的随机端口总数,这个取值不关心源地址,更不关心5元组。
举个例子,当前ss存在以下连接:

1
2
3
4
5
6
1.1.1.1:10001 -> 5.5.5.5:8001
...
1.1.1.1:20000 -> 5.5.5.5:8001
1.1.1.1:20001 -> 6.6.6.6:8001
...
1.1.1.1:30000 -> 6.6.6.6:8001

取ss -s 这个port值得出来的是10000+10000=20000,实际我们关心的是这个数吗?

当业务因为出现源端口不够时,机器上的瓶颈是:

1
2
3
4
5
6
1.1.1.1:1025 -> 5.5.5.5:8001
...
1.1.1.1: 62500-> 5.5.5.5:8001
1.1.1.1:20001 -> 6.6.6.6:8001
...
1.1.1.1:30000 -> 6.6.6.6:8001

这种情况下,只有1.1.1.1 和 5.5.5.5 新建连接时,才会出现问题。如果此时nginx消耗CPU不增加的情况下,对1.1.1.1 和 6.6.6.6 新建连接是毫无影响的。
所以,通过这个例子,我们发现,我们需要找到的参考值,也不是这个值。

根据上面的分析,也可以发现,可以通过ss -an,写脚本自己拿到和后端单个服务器,当前已使用的最大的一个随机端口数。
这才是我们关心的值。

1
2
3
4
5
6
ss -an |grep $(hostname -i) |awk '{print $4,$5}'|sort -u |awk '{print $2}' |sort |uniq -c |sort -rn |head -2

修改后为:
ss -an |grep $(hostname -i) |awk '{print $NF}' |sort |uniq -c |sort -rn |head -2
16876 5.5.5.5:8001
16663 6.6.6.6:8001

这行shell输出为两列,第二列是后端服务端的IP:Port,第一列是当前本机和后端服务维持的连接池有多少随机端口被占用,这个值如果快到60000,说明快要到随机端口分配瓶颈了。

综上,TimeWait数量不足评估当前系统是否有风险,高并发的接入层服务下,TimeWait数量也会变多。而需要更多的关注TIME-WAIT单服务端最大数量,更明确地说,关注单服务端对本机占用的最大随机端口数,该数最大值为60000(左右,具体需要看系统配置的保留随机端口),如果较大,会有一定的风险,需要提前优化,之后会写相关的问题介绍如果有风险,该如何优化TW。



支付宝打赏 微信打赏

赞赏支持一下