(声明:本文引用了别人的的原创文章的内容,因此只是作为一个学习笔记记录,若涉侵权则删之,谢谢)
最近在用Jmeter进行性能测试时遇到了这样个问题:Jmeter会failed to respond.尽管从图像上看,似乎对关键指标的曲线的影响不大,但是也有约0.05%左右的错误率。作为一个强迫症患者,还是要对这个问题进行重视。
搜了一下度娘,此处转载一个链接 jMeter解决failed to respond Connection reset;侵删。
其最重要的原因就是当服务端超时之后,发送给Fin+ACK后,jmeter端并不会再回一个Fin+ACK,而是回的ACK,这样就不会理会服务端的主动关闭;
于是服务端存在很多的Fin_wait_2,而客户端有很多的Close_wait。正基于此,客户端的http请求发送给服务端时,只到了tcp层面就被RST了,所以返回的http是空应答,当返回给HttpClient进行头解析时没有Http的数据包,而是返回的TCP数据包。因此才有了以上的报错信息。
这里我有一个疑问,那就是当服务端处于Fin_wait_2状态时,如果接收到了请求信息,那么tcp协议是如何处理这个连接请求的。
最后终于在这篇文章中找到了答案主动关闭TCP连接的一方为什么要有TIME_WAIT状态
TCP连接是全双工通信,主动方和被动方都需要自主关闭通信链路,TCP正常情况下连接断开会进行四次挥手(流程如上图所示):
1.由主动断开方发起FIN
2.被动方回复ACK
3.待被动方数据传输完成,被动方发送FIN
4.主动方回复ACK,并进入TIME_WAIT状态
TIME_WAIT的状态会持续2MSL (MSL是报文在网络中生存的最大生命周期)。
那这里为什么需要2MSL的状态?原来TCP是建立在非连接链路的可靠传输通信方式,若在步骤4中发出ACK,由于网络原因ACK报文被动方没有收到,等到2MSL从而触发被动方重新发送FIN包,若主动方不存在TIME_WAIT 会出现如下情况:
a. 原来的TCP信息已经不存在,主动方回复RST,引起被动方关闭流程错乱
b.在原来端口上建立了新的TCP连接,影响新的流程
理解了上述的描述,回过头来jmeter的这个问题原因就已经找到了。
那么,如何解决呢?
- 首先,jmeter的在这里是客户端的角色,它为什么只发了ACK,但不发FIN指令呢?这个问题还无法搞清楚;
- 那么退而求其次,有没有办法让它发送ACK+FIN呢?答案肯定是有的。在jmeter.properties中有的idletimeout的时间设置上;
根据文章描述,idletimeout<connectionTime是最有效的方式;此外还提供了一种方式:
那这个问题就落在服务端的主动关闭上了,不让服务端主动关闭就行了。----把 connectionTimeout 尽可能的调大,建议 connectionTimeout = 最耗时接口的一次并发的总时间 * 接口个数Ideltimeout <= 最耗时接口的一次并发的总时间----测试完,把connectionTimeout这个值在改回原值即可。
我认为,最后这个提议是比较好的方式;这篇文章的分析非常好,让我对TCP/IP协议与HTTP协议的关系有了一定程度的了解;
网友评论