TIME-WAIT单服务端最大数量
何为单服务端最大Tine-wait数量呢?为何要引入这个名词?
了解完TimeWait相关概念和理论后,我们知道,TimeWait这个状态是TCP链接上的正常状态,但是如果太多,对服务器会有影响。具体怎么定义这个多?数量达到什么情况下会影响?怎么查看?能否通过监控某个值可以直接指导当前系统是否有风险?
1.如果太多,对服务器会有影响。具体的影响,在工作中和互联网博客上也看到不少,最常见的是端口耗尽,nginx error日志出现 Cannot Assign address 错误码为99的错误日志。此时nginx将无法代理正常请求,nginx 消耗CPU也变大,此时业务会出现问题。
2.怎么查看当前机器上的TimeWait数量?
1 | ss -an | awk '{++state[$1]} END {for(key in state) print key,"\t",state[key]}' |
140751 ?这个值好大,远大于65535,现在服务是不是有问题?其实,这只是我的一台测试机,除了nginx配置,根本没业务流量,更不用说压力了。
所以14W这个数不算多,怎么才算多呢?
3.怎么才算TimeWait多?达到多少系统会有风险,需要提前优化?
这个问题得看上面第二个问题的取值是否是咱们想要的:
上面取值为140751,是当前连接池里所有的五元组(不知道5元组的可以看看上篇“聊聊TimeWait”的文章),如果后端服务端数量很多,平均下来每个五元组占用的并不多,所以在需要分配地址的时候,使用其他的随机端口就可以新建一个连接。
所以,这个14W并不是我们想要的值。
有同学会发现,还有一个地方也能看端口数,但是这个值永远不会超过65535,这个数可以通过下面的命令查看:
1 | ss -s |
上面的58737,就是当前系统使用的随机端口。
那问题就来了…58737,离65535差的不多,是不是代表当前系统随机端口快要占满了呢?
不对!
这个值是随机端口占用总数,一点也没有错。但是这个值,不能成为我们的参考指标。
这个值的意义是从ss -an里拿出来当前所有连接状态里,使用到的随机端口总数,这个取值不关心源地址,更不关心5元组。
举个例子,当前ss存在以下连接:
1 | 1.1.1.1:10001 -> 5.5.5.5:8001 |
取ss -s 这个port值得出来的是10000+10000=20000,实际我们关心的是这个数吗?
当业务因为出现源端口不够时,机器上的瓶颈是:
1 | 1.1.1.1:1025 -> 5.5.5.5:8001 |
这种情况下,只有1.1.1.1 和 5.5.5.5 新建连接时,才会出现问题。如果此时nginx消耗CPU不增加的情况下,对1.1.1.1 和 6.6.6.6 新建连接是毫无影响的。
所以,通过这个例子,我们发现,我们需要找到的参考值,也不是这个值。
根据上面的分析,也可以发现,可以通过ss -an,写脚本自己拿到和后端单个服务器,当前已使用的最大的一个随机端口数。
这才是我们关心的值。
1 | ss -an |grep $(hostname -i) |awk '{print $4,$5}'|sort -u |awk '{print $2}' |sort |uniq -c |sort -rn |head -2 |
这行shell输出为两列,第二列是后端服务端的IP:Port,第一列是当前本机和后端服务维持的连接池有多少随机端口被占用,这个值如果快到60000,说明快要到随机端口分配瓶颈了。
综上,TimeWait数量不足评估当前系统是否有风险,高并发的接入层服务下,TimeWait数量也会变多。而需要更多的关注TIME-WAIT单服务端最大数量,更明确地说,关注单服务端对本机占用的最大随机端口数,该数最大值为60000(左右,具体需要看系统配置的保留随机端口),如果较大,会有一定的风险,需要提前优化,之后会写相关的问题介绍如果有风险,该如何优化TW。
赞赏支持一下