zoukankan      html  css  js  c++  java
  • jmeter压测-"java.net.SocketException: Socket closed"解决方法

    前提:

    今天在做jmeter压测某一个接口时,发现现象:

    线程数=100个  循环次数=20     但是请求到40多个请求的时候  后面的请求的响应结果就出现了报错   
    报错---成功---又出现报错
    中间有一个是成功   剩下后面的都是报错的  CPU也才升到6-7%

    分为两个报错:

    报错1:

    java.net.SocketException: Socket closed
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.socketRead(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:137)
    at org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:153)
    at org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:280)
    at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:138)
    at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:56)
    at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259)
    at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:163)
    at org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:157)
    at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:273)
    at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:272)
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
    at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
    at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
    at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.executeRequest(HTTPHC4Impl.java:850)
    at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:561)
    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:67)
    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1282)
    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1271)
    at org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:627)
    at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:551)
    at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:490)
    at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:257)
    at java.lang.Thread.run(Unknown Source)

    百度得知引起 java.net.SocketException: Socket closed 错误的原因通常是 未设置连接的超时时间。

    解决方法:

    该问题可以尝试通过以下方法解决。

    如果在 HTTP Request Sampler 的 Basic 里勾选了Use KeepAlive,那么建议在 Advanced 页签下:

    1、Implementation 选为 HttpClient4

    2、Timeouts 中的 Connect 一般设置一个10~60秒的值,表示连接的空闲超时时间,避免由于没收到被压测端的响应回来的 Keep-Alive 的 Header 导致的连接断开

    这个值的单位是毫秒:15s*1000=15000s

    通过上述方法设置后,再次压测,还是会出现这个错误

    再次百度,

    https://cwiki.apache.org/confluence/display/jmeter/JMeterSocketClosed?spm=a2c4g.11186623.2.16.41ff41eaJzLjlR

    报错2:

    <html>
    <head><title>502 Bad Gateway</title></head>
    <body bgcolor="white">
    <center><h1>502 Bad Gateway</h1></center>
    <hr><center>nginx/1.10.3</center>
    </body>
    </html>



    咱未验证:
    先百度到的解决方法:
    一般情况下是由nginx默认的fastcgi进程响应慢引起的,但也有其他情况,这里我总结了一些解决办法供大家参考。

    1. 情况一:由于nginx默认的fastcgi进程响应缓冲区太小造成

             这种情况下导致fastcgi进程被挂起,如果fastcgi服务队这个挂起处理不是很好的话,就可能提示“504 Gateway Time-out”错误。

    2.  

      情况一解决办法:

             默认的fastcgi进程响应的缓冲区是8K,我们可以设置大一点,在nginx.conf里,加入:fastcgi_buffers 8 128k

             这表示设置fastcgi缓冲区为8块128k大小的空间。

    3.  

      情况一解决办法(改进):

             在上述方法修改后,如果还是出现问题,我们可以继续修改nginx的超时参数,将参数调大一点,如设置为60秒:

             send_timeout 60;

             经过这两个参数的调整,结果没有再提示“504 Gateway Time-out”错误,说明效果还是挺不错的,问题基本解决。

    4.  

      情况二:PHP环境的配置问题

             这里我们需要对php-fpm和nginx进行配置修改。因为这种情况下,也会出现“504 Gateway Time-out”错误提示。

    5.  

      情况二解决办法( php-fpm配置修改):

            将max_children由之前的10改为30,这样操作是为了保证有充足的php-cgi进程可以被使用。

            将request_terminate_timeout由之前的0秒改成60秒,这样使php-cgi进程处理脚本的超时时间提高到60秒,可以防止进程被挂起以提高利用效率。

    6.  

      情况二解决办法(nginx配置修改):

            为了减少fastcgi的请求次数,尽量维持buffers不变,我们要更改nginx的几个配置项,如下:

            将fastcgi_buffers由4 64k改为2 256k;

            将fastcgi_buffer_size 由64k改为128k;

            将fastcgi_busy_buffers_size由128k改为256k;

            将fastcgi_temp_file_write_size由128k改成256k。

    7.  

      情况二解决办法修改完,我们需要重新加载php-fpm和nginx的配置,然后再进行测试。之后就没有发现“504 Gateway Time-out”错误,效果也还是不错的!

     

    https://jingyan.baidu.com/article/6fb756ecbf4774241858fb9a.html

  • 相关阅读:
    高性能MySQL学习总结二----常见数据类型选择及优化
    springboot admin图文+视频教程
    xxl-job图文教程+视频讲解
    mybatis-plus视频教程
    springcloud视频教程
    springcloud系统化学习图文+视频教程
    docker系统化学习图文+视频教程
    【分享】docker全套视频教程
    是用Git还是SVN?
    NOIP知识点汇总
  • 原文地址:https://www.cnblogs.com/yiyaxuan/p/12673496.html
Copyright © 2011-2022 走看看