카테고리 없음

SpringBoot Tomcat acceptCount 풀 정보

기록만이살길 2021. 2. 27. 09:26
반응형

SpringBoot Tomcat acceptCount 풀 정보

1. 질문(문제점):

저는 springboot에서 Tomcat 구성을 다루고 있습니다.

다음 구성이 있다고 가정 해 보겠습니다.

server:
  tomcat:
    min-spare-threads: ${min-tomcat-threads:20}
    max-threads: ${max-tomcat-threads:20}
    accept-count: ${accept-concurrent-queue:1}
    max-connections: ${max-tomcat-connections:100}

이 코드로 간단한 RestController가 있습니다.

    public String request(@Valid @RequestBody Info info) {
        
        log.info("Thread sleeping");
          
        Thread.sleep(8000);
        
        return "OK";

    }

그런 다음 다음 테스트를 수행합니다.

  1. 초당 200 개의 HTTP 요청을 보냅니다.
  2. 로그를 확인하고 예상대로 100 개의 동시 실행이 표시되고 8 초 후에 마지막 실행 (대기 중)이 표시됩니다.
  3. 다른 실행은 거부됩니다.

내가 가진 주요 문제는 클라이언트 호출에 대한 제한 시간 제어 (예 : 5 초)가있는 경우 대기중인 작업이 클라이언트에서 거부 된 경우에도 서버에서 처리된다는 것입니다. 이 상황을 피하고 싶어서 다음과 같이 시도했습니다.

server:
  tomcat:
    min-spare-threads: ${min-tomcat-threads:20}
    max-threads: ${max-tomcat-threads:20}
    accept-count: ${accept-concurrent-queue:0}
    max-connections: ${max-tomcat-connections:100}

그러나이 "0"은 완전히 무시됩니다 (이 경우 "무한"을 의미한다고 생각합니다). 그래서, 내 질문은 : ¿ 최대 연결 제한에 도달하면 작업을 대기열에 넣지 않도록 Tomcat을 구성 할 수 있습니까? 아니면 ¿ 대기열에있는 작업을 거부하도록 Tomcat을 구성 할 수 있습니까?

미리 감사드립니다.

친애하는.

2. 해결방안:

acceptCount 매개 변수 의 값은 운영 체제에 직접 전달됩니다. 예를 들어 UNIX-es의 경우에 전달됩니다 listen. 들어오는 연결은 JVM이 수락하기 전에 항상 OS 대기열에 배치되므로보다 낮은 값은 1의미가 없습니다. Tomcat은 이러한 값을 명시 적으로 무시하고 기본값을 유지합니다 100.

그러나 Tomcat의 실제 대기열은 OS 대기열에서 수락되었지만 처리 스레드 ( maxThreads) 부족으로 인해 처리되지 않는 연결입니다 . 당신은 기껏해야 maxConnections - maxThreads + 1그러한 연결을 가질 수 있습니다 . 귀하의 경우 처리 대기중인 연결은 81 개입니다.

65779046
반응형