Почему я получаю SocketTimeoutException, если у меня accept-count = 100000? - PullRequest
0 голосов
/ 25 октября 2019

Я нагрузочно тестирую свой сервер Spring Boot с JMeter и имею

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());
Console
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>

(10000 пользователей x100 циклов = 1 миллион запросов)

В JMeter View Results Tree я вижу ошибки:

Response code: Non HTTP response code: java.net.SocketTimeoutException
Response message: Non HTTP response message: Read timed out

Summary Report показывает, что он получил до 11 000 выборок, прежде чем ошибки остановили тест. Я не понимаю, потому что со счетчиком принятия 100 000, не должен ли он принять 100 000 подключений в очереди, прежде чем он начнет давать отклонения и заставить JMeter получить исключение SocketTimeoutException?


Я также пытался accept-count=10000, max-connections=1000, и JMeter получил до 8000 выборок, максимальное время 12000 мс (время ожидания 30 с при HTTP Request), и выдал ошибку Response code: Non HTTP response code: org.apache.http.conn.HttpHostConnectException Response message: Non HTTP response message: Connect to localhost:8080 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect. Он должен как минимум поставить в очередь 10 000 соединений, прежде чем отказаться.

1 Ответ

0 голосов
/ 28 октября 2019

Согласно документации Tomcat

maxConnections

Максимальное количество соединений, которые сервер будет принимать и обрабатывать в любой данный момент. время. Когда этот номер будет достигнут, сервер примет, но не обработает, еще одно соединение. Это дополнительное соединение будет заблокировано до тех пор, пока количество обрабатываемых соединений не станет ниже maxConnections, и в этот момент сервер снова начнет принимать и обрабатывать новые соединения. Обратите внимание, что после достижения предела операционная система может по-прежнему принимать соединения на основенастройка acceptCount. Значение по умолчанию зависит от типа разъема. Для NIO и NIO2 значение по умолчанию - 10000. Для APR / native значение по умолчанию - 8192.

Поэтому я ожидаю, что сервер может работать с 10k одновременных подключений, а те, которые указаны выше, помещаются вочередь. Если вы хотите именно такое поведение - просто увеличьте время ожидания соединения / ответа в JMeter HTTP Request Defaults , настройки находятся на вкладке «Дополнительно»:

enter image description here

...