公司接了一个快递行业的单子,为了保证局方能在双十一期间系统能顺利运行,也为了证实我们应用能够抗下双十一的峰值,于是配合局方做了一次应对双十一流量高峰全链路压测。模拟局方接口发起sip协议,通过华为云的接入,并获取sip-calluuid转换为sip头,经防火墙、负载均衡器最终负载到每台机器,其中一台服务器的负载并发量为1200路并发,持续压测了十几分钟后,明显发现服务响应时间变慢,通过promotheus监控查看到调局方接口的响应延迟5+ minutes,但我们应用用的RestTemplate设置了读超时时间和写超时时间是5s,怎么算也不会到5m。通过lsof -I命令查看发现大量TCP请求出现了Time_Wait
为什么出现大量的Time_wait,这个还得从TCP的四次挥手说起,当tcp连接发起断开请求的时候并不是立马断开,而是主动关闭的一方先发起FIN请求,等被动方进入CLOSE_WAIT后,主动放将TCP状态改为TIME_WAIT,等待2MSL后才最终关闭TCP连接。那么TCP为什么设计TIME_WAIT,有两点好处:1,可靠地实现TCP全双工连接地终止;2,运行老地重发分节在网络中消逝。那么长连接出现大量地TIME_WAIT是为了保证双工通信时可靠的,我们java的http请求都是短链接,我们知道http请求是无状态的,这里TIME_WAIT是维持2MSL,这个可以查阅《TCP/IP详解》,