jMeter解决failed to respond Connection reset
jMeter测试单个接口测试都没有问题,多个接口依次测试,就会有部分The target server failed to respond,有的会返回Connection reset。我们一步步来看看怎么解决
找到造成failed to respond的原因
1、先看一下服务端的相关配置:默认的tcp_keepalive_time是7200;tomcat的server.xml的配置 connectionTimeout是20s

2、从抓包查看浏览器中一个正常访问的开始----客户端ip:192.168.1.101,服务端ip:192.168.1.50访问 /api/vi/home----从下图wireshark的抓包数据,可以看到22行,客户端回了一个ACK,这次请求的数据已经传出完毕了,服务端连接的状态是 ESTABLISHED。----20s后,服务端发了一个FIN+ACK,主动关闭这个连接(因为tomcat中设置了20s超时),四次挥手这个连接就关闭了。

4、如果超过了20s,连接被服务端主动关闭了,浏览器中再次请求的时候,就会建立一条新的连接。----这也就是HttpClient的连接池机制,可以复用tcp连接,这样能有效减少服务端开销和缩短响应时间。----在浏览器中访问,服务端主动去关闭的时候,客户端也就跟着关闭了,四次挥手!

6、到下一个接口测试的时候,复用了这个连接,服务端tcp就会返回RST,而http就是空应答,HttpClient在解析HTTP头时,发现没有数据,因为没有返回HTTP数据包,而是返回了TCP数据包。----就会在jMeter中看到如下错误:Response code: Non HTTP response code: org.apache.http.NoHttpResponseExceptionResponse message: Non HTTP response message: The target server failed to respond

2、我们测试线程数是2,两个接口(seckill接口,home接口),循环次数1

4、可以看到: 端口57513(/api/v1/home/seckill?sec=2),在空闲20后(51行)的时候,被服务端主动关闭,等到下一个接口/api/v1/home要用的时候,服务端返回RST(63行)----这是jMeter中返回的结果:

6、我们再看看ideltimeout == 20s的时候:----可以看到无论是20s 还是10s,连接都不是实时释放的,都是等这个接口测试完,才去释放的,也就是说,这个ideltimeout 是等一个接口测试完,然后再去查看每个连接的空闲时间,如果有的超过了ideltimeout,就主动关闭它。

2、可是,正常浏览器访问请求头中也是带Connection:keep-alive的,所以去掉的话,测试出的吞吐量就不太合理。

3、那这个问题就落在服务端的主动关闭上了,不让服务端主动关闭就行了。----把 connectionTimeout 尽可能的调大,建议connectionTimeout = 最耗时接口的一次并发的总时间 * 接口个数Ideltimeout <=最耗时接口的一次并发的总时间----测试完,把connectionTimeout这个值在改回原值即可。