1、在一些场景下,后台服务需要跟mysql进行交互,方式有两种:长连接和短连接。我们会根据不同的场合选择不同的方式。 在使用tcp短连接的时候,我们经常会发现服务器存在着大量的TIME_WAIT状态,比如:
2、TIME_WAIT的含义 在tcp四步挥手的过程中,主动关闭的一方(一般是指后台服务)会先发出close,然后等待对方的ack和fin,在接收到对方fin后,自身会进入TIME_WAIT状态。这样做的好处有两个,一是防止最后的ack N+1丢失,二是确保请求包都在网络上消失,不影响新建的连接。
3、TIME_WAIT存活时间 TIME_WAIT的存活时间被定义为2个MSL时间,而不同的地方对于MSL的定义不一样,Berkeley的实现上把MSL定义为30s,那么TIME_WAIT就是1分钟了,下面通过实践验证这个问题。
4、首先启动并关闭一个tcp连接,记录时间:
5、然后等待连接的消失,记录新的时间:
6、TIME_WAIT的影响最后我们谈一下TIME_WAIT的影响。众所周知,撮劝丛食单机上能分配到的随机端口是有限的,TIME_WAIT状态过多会导致眺螗熨膣本地端口被占满,无法分配新的端口给业务使用。理论上,系统层面上是支持到65535个端口的,但应用层能分配到的肯定达不到这个数,具体是多少呢,我们继续通过实践去验证。我们写一个小程序,不停地使用随机端口建立连接,直到建立连接失败。
7、可以看到,当出现connect fail的时候,能分配到的端口大约在2w8的样子。那么算下来,在不修改内核参数的情况下,如果1分钟内TIME_WAIT状态达到2w8,相当于tcp短连接并发达到466/s并持续1分钟,将导致新的端口无法分配,且连接建立失败。
8、解决方法需要减少1分钟的TIME_WAIT时间,开启快速回收。• sysctl -w net.ipv4.tcp_timestamps=1• sysctl -w net.ipv4.tcp_tw_recycle=1