Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当我的accept count=100000时,为什么会得到SocketTimeoutException?_Java_Performance_Spring Boot_Jmeter_Load Testing - Fatal编程技术网

Java 当我的accept count=100000时,为什么会得到SocketTimeoutException?

Java 当我的accept count=100000时,为什么会得到SocketTimeoutException?,java,performance,spring-boot,jmeter,load-testing,Java,Performance,Spring Boot,Jmeter,Load Testing,我正在用JMeter对我的Spring引导服务器进行负载测试,并且 application.properties server.tomcat.accept-count=100000 server.tomcat.max-threads=1000 Application.java public static void main(String[] args) { ApplicationContext context = SpringApplication.run(Application.cl

我正在用JMeter对我的Spring引导服务器进行负载测试,并且

application.properties
server.tomcat.accept-count=100000
server.tomcat.max-threads=1000
Application.java
public static void main(String[] args) {
    ApplicationContext context = SpringApplication.run(Application.class, args);
    ServerProperties serverProperties = context.getBean(org.springframework.boot.autoconfigure.web.ServerProperties.class);
    Tomcat tomcat = serverProperties.getTomcat();
    Logger.getLogger(Application.class.getName()).info("acceptCount = " + tomcat.getAcceptCount());
    Logger.getLogger(Application.class.getName()).info("maxConnections = " + tomcat.getMaxConnections());
    Logger.getLogger(Application.class.getName()).info("maxThreads = " + tomcat.getMaxThreads());
控制台
2019-10-24 20:22:31.174  INFO 57472 --- [  restartedMain] c.s.s.Application : acceptCount = 100000
2019-10-24 20:22:31.174  INFO 57472 --- [  restartedMain] c.s.s.Application : maxConnections = 10000
2019-10-24 20:22:31.175  INFO 57472 --- [  restartedMain] c.s.s.Application : maxThreads = 1000
loadtest.jmx
    <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
      <boolProp name="LoopController.continue_forever">false</boolProp>
      <stringProp name="LoopController.loops">100</stringProp>
    </elementProp>
    <stringProp name="ThreadGroup.num_threads">10000</stringProp>
    <stringProp name="ThreadGroup.ramp_time">10</stringProp>
摘要报告显示,在错误停止测试之前,它获得了多达11000个样本。我不明白,因为接受计数为100000,它不应该在开始拒绝并导致JMeter获得SocketTimeoutException之前接受队列中的100000个连接吗


我还尝试了
accept count=10000
max connections=1000
,JMeter得到了8000个样本,最大时间12000ms(HTTP请求的超时时间为30秒),它给出了错误
响应代码:非HTTP响应代码:org.apache.HTTP.conn.HttpHostConnectException
响应消息:非HTTP响应消息:连接到本地主机:8080[localhost/127.0.0.1,localhost/0:0:0:0:0:0:1]失败:连接被拒绝:连接
。在拒绝之前,它至少应该排队等待10000个连接

根据

maxConnections

服务器在任何给定时间接受和处理的最大连接数当达到此数字时,服务器将接受但不处理另一个连接。此附加连接将被阻止,直到正在处理的连接数降至maxConnections以下,此时服务器将再次开始接受和处理新连接。请注意,一旦达到限制,操作系统仍可能根据acceptCount设置接受连接。默认值因连接器类型而异。对于NIO和NIO2,默认值为10000。对于APR/native,默认值为8192

因此,我的期望是服务器能够处理10k并发连接,并且将上面的连接放入队列。如果这是您想要的行为-只需在JMeter中增加连接/响应超时,则“高级”选项卡下的设置有效:


accept count
似乎只是
listen()
的backlog参数。它与“非HTTP响应消息:读取超时”没有任何关系,这仅仅表示连接已建立(排除积压)且请求已发送,在超时期间未收到响应,这可能表示服务器正忙,或出现死锁或错误。我将超时设置为30秒以匹配生产。我认为使用100000
accept connect
它可以接受队列中几乎所有的连接,而不会超时。我不了解队列、连接、超时和响应的一系列事件。我发现默认值是100左右。可能计算机(Windows)无法排队超过此数,或者排队需要30秒以上的时间?您可以使用或监视load generator计算机上的网络特定指标,可能需要增加,即。
Response code: Non HTTP response code: java.net.SocketTimeoutException
Response message: Non HTTP response message: Read timed out