现在一个测试项目,发现性能测试机中有很多TIME_WAIT状态的TCP连接,在网上查了一下,这种状态也叫TCP半连接状态。
测试环境:9台windows测试机,其中包括一台压力控制机,即controller机器
服务器环境:IIS7.0+MS SQL
问题表现:controller机器使用其中任何一台windows测试机并发5个vuser或者更多,都会在8分钟或者10分钟左右出现大量的失败交易
分析:通过在cmd中查看netstat -ano > d:/port.txt(把netstat打印的信息输出到当前D盘根目录下)查看TCP连接,有大量的TIME_WAIT状态的TCP连接,大约有6W多个time_wait状态的TCP连接,咱们windows系统最大端口数量才只有65536个端口,性能测试机每次通过TCP访问server都会占用一个本地端口,导致time_wait状态(半连接状态)过多,并且不释放,导致新的TCP连接去寻找新的端口。如果widows提供的65536个端口全部用完,time_wait状态大量存在,就不会再有新建立的连接,则会出现timeout,导致大量的并发用户数宕掉。这严重影响了并发的发起,该问题已经提交到运维部,请他们来协助
解决办法:
1、修改注册表中的tcpip的属性值:TIMEWAIT回收时间
在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters,添加名为TcpTimedWaitDelay的DWORD键,设置为十进制0,以缩短TIME_WAIT的等待时间。
测试结果:TIME_WAIT状态的连接依然大量存在,每台机器可以承担少量的并发不会出现错误;当并发增大时则会出现大量的错误。