복붙노트

[SPRING] 봄 부팅시 Tomcat에 대한 연결 시간 초과 증가

SPRING

봄 부팅시 Tomcat에 대한 연결 시간 초과 증가

응답이 처리 될 때까지 요청이 시간 초과되지 않도록 시간 초과를 늘릴 수 있습니까?

Spring Boot의 Tomcat 설정 -

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

초당 요청 수는 15 초 동안 constantUsersPerSec (20)을 (15) 동안 300으로 올렸으며 모든 요청은 gatling (파란색) 아래의 줄거리에서 볼 수 있듯이 제공되었습니다.

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

이것은 200 개의 작업자 스레드를 사용하여 300 개의 요청을 처리 한 max-connections = 2000 때문입니다.

Controller는 비동기 요청 처리를 수행하는 DeferredResult를 반환하는 Spring MVC로 작성되므로 응답이 처리되면 응답을 다시 시작합니다.

하지만 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

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. ==============================

    1.Rcordoval의 의견에 따라 -

    Rcordoval의 의견에 따라 -

    이 설정은 나머지 채우기 구성에 도움이됩니다.

    spring.mvc.async.request-timeout=1200000
    

    그러나 근본적인 원인은 요청 수가 많은 경우 열려있는 연결 (2000)을 업로드 할 때 모든 작업자 스레드 (200)가 가득 차는 것입니다 (컨트롤러가 MultipartFile을 인수로 사용하여 DeferredResult를 반환 함)

    나는 요청 로직이 빠르며 비즈니스 로직이 느릴 때 DeferredResult가 빛난다 고 생각한다. (forkjoin.commonPool에서 실행된다.) MultiPartFile 업로드 (차단 및 느림)에 적합하지 않으며 파일 크기가 커지면 응답이 빨리 다시 시작되지 않습니다. (초당 응답 수에서 볼 수 있듯이 열린 연결 이후 몇 초 후에 응답이 다시 시작됩니다. 2000 년이고 노동자는 200 명). 근로자가 증가하면 어쨌든 비동기 처리의 이점이 완화됩니다.

    이 경우 요청 처리 (업로드 및 차단)가 느리고 비즈니스 논리가 빠릅니다. 응답은 준비 중이지만 모든 작업자 스레드 (200)는 응답이 다시 시작되지 않고 결과가 시간 초과되는 요청이 점점 많아지고 있습니다.

    아마도 DeferredResult를 사용하여 비동기 처리에서 요청 서비스 및 응답 재개를위한 별도의 풀을 갖는 경우를 만들었습니까?

  2. from https://stackoverflow.com/questions/51006913/increasing-connection-timeout-for-tomcat-in-spring-boot by cc-by-sa and MIT license