Увеличение времени ожидания соединения для Tomcat в Spring Boot - PullRequest
0 голосов
/ 24 июня 2018

Как можно увеличить время ожидания, чтобы до обработки ответа запрос не превышался?

Настройки Tomcat в Spring Boot:

server.tomcat.max-connections=2000
server.tomcat.max-threads=200
server.connection-timeout=1200000

Количество запросов в секунду было увеличено constantUsersPerSec(20) during (15) до 300 в течение 15 секунд, и все запросы были обработаны, как видно на графике ниже из гатлинга (синий).

scn.inject(
      constantUsersPerSec(20) during (15), 
    )

Это связано с max-connections = 2000, который обслуживал 300 запросов с использованием 200 рабочих потоков.

Контроллер написан на Spring MVC, который возвращает DeferredResult, который выполняет асинхронную обработку запроса и, следовательно, возобновит ответ после обработки ответа.

Requests Per Sec

Но даже если server.connection-timeout установлен на большое число 1200000, к концу (много) 503 (красный)

> status.find.in(200,304,201,202,203,204,205,206,207,208,209), b     78 (100.0%)
ut actually found 503

Response Per Sec

Gatling.conf также настроен на увеличение времени ожидания:

   timeOut {
      simulation = 8640000 # Absolute timeout, in seconds, of a simulation
    }
    ahc {
      #keepAlive = true                                # Allow pooling HTTP connections (keep-alive header automatically added)
      connectTimeout = 600000                          # Timeout when establishing a connection
      handshakeTimeout = 600000                        # Timeout when performing TLS hashshake
      pooledConnectionIdleTimeout = 600000             # Timeout when a connection stays unused in the pool
      readTimeout = 600000                             # Timeout when a used connection stays idle
      #maxRetry = 2                                    # Number of times that a request should be tried again
      requestTimeout = 600000           

1 Ответ

0 голосов
/ 24 июня 2018

Согласно комментариям от Rcordoval -

Проверьте это свойство: spring.mvc.async.request-timeout = # Количество время ожидания обработки асинхронного запроса

Этот параметр помогает с остальными конфигурациями Гатлинга

spring.mvc.async.request-timeout=1200000

Основная причина, однако, заключается в том, что когда запросы поступают в больших количествах, тогда все рабочие потоки (200) занимаются загрузкой открытых соединений (2000) (контроллер принимает MultipartFile в качестве аргумента и возвращает DeferredResult)

Я думаю, DeferredResult светится, когда логика обслуживания запросов быстрая, а бизнес-логика медленная (работает на forkjoin.commonPool). Он не совсем подходит для загрузок MultiPartFile (блокирует и медленно) и более того, когда размеры файлов велики с тех пор, ответы не быстро возобновляются (как видно на приведенном выше графике ответов в секунду, только через несколько секунд ответы возобновляются, так как открытые подключения 2000 и рабочие только 200). Если количество рабочих увеличивается, это все равно уменьшает преимущества асинхронной обработки.

В этом случае обработка запросов (загрузка и блокировка) была медленной, а бизнес-логика - быстрой. поэтому ответы готовились, но все рабочие потоки (200) настолько заняты, обслуживая все больше и больше запросов, что в результате ответы не возобновляются и в результате не выполняется тайм-аут.

Вероятно, имеет место наличие отдельного пула для request serve и response resume при асинхронной обработке с DeferredResult?

...