jmeter运行报错“Non HTTP response message: The target server failed to respond”

      在用jmeter运行是报错“Non HTTP response message: The target server failed to respond”和“Non HTTP response code: java.net.SocketException”,修改jmeter.properties文件中的属性值httpclient.timeout=<time in ms>,一般修改成<time in ms>这边是毫秒,根据情况设置10-60毫秒,能解决报错问题,但相应时间是正常测试的2-3倍,响应时间变长,问题还是没有真正解决。

     jmeter 的http请求中中,工具会默认勾选Use KeepAlive ,在运行时,jmeter.properties中的时间(httpclient.timeout)设置默认是注销的,也就是连接空闲,立马断开,这也可能是报错的原因。

    jmeter官网上对socket报错,给出修改建议,有兴趣可以看看,https://wiki.apache.org/jmeter/JMeterSocketClosed

---------------------------------------------------------------------------------

转:http://liuzhigong.blog.163.com/blog/static/1782723752011412551547/相关知识:

      

HTTP Keep Alive
HTTP Keep-Alive 很大程序上被误解了,下面介绍一下它在HTTP/1.0和HTTP/1.1版本下是如何工作的,以及其在JAVA中的运行原理。
HTTP是一个 请求<->响应模式的典型范例,即客户端向服务器发送一个请求信息,服务器来响应这个信息。在老的HTTP版本中,每个请求都将被创建一个新的 客户端->服务器的连接,在这个连接上发送请求,然后接收请求。这样的模式有一个很大的优点就是,它很简单,很容易理解和编程实现;它也有一个很大的缺点就是,它效率很低,因此Keep-Alive被提出用来解决效率低的问题。
 
HTTP/1.0
在HTTP/1.0版本中,并没有官方的标准来规定Keep-Alive如何工作,因此实际上它是被附加到HTTP/1.0协议上,如果客户端浏览器支持Keep-Alive,那么就在HTTP请求头中添加一个字段 Connection: Keep-Alive, 当服务器收到附带有Connection: Keep-Alive的请求时,它也会在响应头中添加一个同样的字段来使用Keep-Alive。这样一来,客户端和服务器之间的HTTP连接就会被保 持,不会断开(超过Keep-Alive规定的时间,意外断电等情况除外),当客户端发送另外一个请求时,就使用这条已经建立的连接
 
HTTP/1.1
在 HTTP/1.1版本中,官方规定的Keep-Alive使用标准和在HTTP/1.0版本中有些不同,默认情况下所在HTTP1.1中所有连接都被保 持,除非在请求头或响应头中指明要关闭:Connection: Close  ,这也就是为什么Connection: Keep-Alive字段再没有意义的原因。另外,还添加了一个新的字段Keep-Alive:,因为这个字段并没有详细描述用来做什么,可忽略它

Not reliable(不可靠)

HTTP 是一个无状态协议,这意味着每个请求都是独立的,Keep-Alive没能改变这个结果。另外,Keep-Alive也不能保证客户端和服务器之间的连接 一定是活跃的,在HTTP1.1版本中也如此。唯一能保证的就是当连接被关闭时你能得到一个通知,所以不应该让程序依赖于Keep-Alive的保持连接 特性,否则会有意想不到的后果

Keep-Alive和POST

在 HTTP1.1细则中规定了在一个POST消息体后面不能有任何字符,还指出了对于某一个特定的浏览器可能并不遵循这个标准(比如在POST消息体的后面 放置一个CRLF符)。而据我所知,大部分浏览器在POST消息体后都会自动跟一个CRLF符再发送,如何解决这个问题呢?根据上面的说明在POST请求 头中禁止使用Keep-Alive,或者由服务器自动忽略这个CRLF,大部分服务器都会自动忽略,但是在未经测试之前是不可能知道一个服务器是否会这样 做。 

Java实现--客户端

在客户端,Java抽象了 Keep-Alive,和程序员分享离开来,HttpURLConnection类自动实现了Keep-Alive,如果程序员没有介入去操作Keep- Alive,Keep-Alive会通过客户端内部的一个HttpURLConnection类的实例对象来自动实现。也就是说,在java中keep- alive是由一个Java类库来实现的,但在其他类库中不一定可用。

Java实现--服务器端
在 服务器端,Java依然是将Keep-Alive抽象出来,HttpServlet、HttpServletRequest、和 HttpServletResponse类自动实现 了Keep-Alive。这种情况下一些由第三方控制的操作是可能的,如在KeepAliveServlet中提到的 JavaWebServer,Keep-Alive是否启用由两个因素决定,内容长度和输出大小,如果内容长度是响应的一部分(即这段内容长度输出后还有 内容需要输出),则Keep-Alive被启用(当然需要客户端支持的情况下);如果内容长度未设定,则Servlet会试着计算响应缓冲区长度以确定内 容长度,在Javasoft实现中,使用一个4KB的缓冲区(相当于上面说的响应)。也就是说如果内容长度未设定,并且返回数据超过4KB,此时相当于内 容长度大于响应长度,而不是响应长度一部分,Keep-Alive就不会被启用 。

猜你喜欢

转载自km-moon11.iteye.com/blog/2315190