Tomcat 컨테이너 튜닝
Apache Tomcat 성능 최적화를 위해 커넥터 구성에 대한 중요성을 설명드리겠습니다. 1편 내용과 더불어 본문 내용을 꼼꼼하게 읽어보시면 쾌적한 웹서비스를 운영하시는데 도움을 얻을 수 있을 것입니다.
커넥터 구성
여러 개의 Tomcat 커넥터가 여러 작업 부하를 관리합니다.이것들은 Tomcat이 클라이언트로부터 요청을 수신할 수 있도록 하는 요소들입니다. 커넥터의 한 인스턴스는 서버의 특정 TCP 포트 번호에서 요청을 수신합니다.
Tomcat 서버에 다양한 유형의 워크로드가 들어오는 경우 여러 커넥터를 고려해야 합니다 . 즉, 한 유형의 트래픽은 한 포트에서 처리되고 두 번째 유형은 다른 포트에서 처리됩니다. 이렇게 하면 다양한 유형의 워크로드가 서로 간섭할 수 있는 변경 사항이 줄어듭니다.
들어오는 각 요청은 Tomcat의 스레드에 의해 처리됩니다. 커넥터의 maxThreads 속성은 커넥터에 대해 실행될 수 있는 최대 동시 스레드 수를 정의합니다. 실행되는 동시 스레드 수는 하드웨어와 CPU 수에 따라 달라집니다. 하드웨어가 좋을수록, 프로세서 수가 많을수록 Tomcat이 지원해야 할 동시성이 커집니다.
maxThreads 속성이 너무 낮게 설정된 경우, 요청은 스레드가 요청을 처리할 수 있을 때까지 기다려야 합니다. 이는 사용자가 보는 응답 시간을 증가시킬 수 있습니다. 따라서 최상의 성능을 위해 maxThreads를 충분히 높은 값으로 설정하여 스레드가 항상 Tomcat에서 수신 요청을 처리할 수 있도록 합니다. Tomcat 커넥터는 maxThreads 속성 등을 관리합니다.
Tomcat 커넥터의 속성
모니터링 관점에서 각 커넥터의 스레드 풀에서 활성화된 스레드 수를 모니터링하는 것이 중요합니다. 활성 스레드 수가 maxThreads 제한에 가까우면 커넥터에 더 큰 스레드 풀을 허용하도록 Tomcat 서버 구성을 조정하는 것을 고려해야 합니다. 들어오는 요청을 처리하기 위한 커넥터 프로토콜의 선택은 Tomcat 서버의 처리량에도 영향을 미칩니다. 예를 들어, Tomcat 9는 차단 및 비차단 커넥터를 지원합니다.
각 워커 스레드가 연관된 연결이 완료될 때까지 소모되는 차단 커넥터가 있습니다. 그러나 비차단 커넥터는 더 긴 실행 요청으로 더 나은 스레드 관리로 이어집니다. 성능 테스트에 따르면 비차단 커넥터는 더 긴 실행 요청으로 더 나은 성능을 제공합니다.
더 높은 성능을 제공하므로 비차단 커넥터를 사용하는 것을 고려하시면 됩니다. 커넥터의 enableLookups 설정은 Tomcat 서버가 각 원격 클라이언트의 호스트 이름을 찾기 위해 DNS 역방향 조회를 수행하는지 여부를 결정합니다.
DNS 조회는 비용이 많이 들고 이 값을 true로 설정하면 DNS 서비스가 느려져 Tomcat이 느린 것처럼 보일 수 있습니다. 따라서 최상의 성능을 위해 사용 중인 모든 커넥터에 대해 enableLookups를 false로 설정합니다. 또 다른 중요한 커넥터 설정은 acceptCount입니다. 이것은 처리 스레드를 기다리는 동안 요청이 배치되는 accept 대기열의 최대 길이입니다. accept 대기열이 가득 차면 추가로 들어오는 요청이 거부됩니다. 기본값인 100은 일반적인 프로덕션 워크로드에 적합하지 않습니다 .
최상의 성능을 위해 acceptCount를 서버가 수신할 수 있는 들어오는 연결의 버스트를 수용할 만큼 충분히 크게 설정합니다 . acceptCount가 너무 낮으면 클라이언트에 “연결 거부” 오류가 표시됩니다. 값이 너무 높으면 큐가 추가 서버 메모리를 차지합니다.
NIO 및 NIO2 커넥터를 사용할 때 Tomcat에서 사용하는 소켓 읽기 버퍼와 쓰기 버퍼의 크기를 구성할 수 있습니다. socket.rxBufSize 및 socket.txBufSize 속성은 버퍼 크기 설정을 제어합니다.
socket.rxBufSize와 socket.txBufSize의 값이 클수록 지원되는 처리량이 높아집니다 . 이러한 값에 대해 64KB 이상의 설정을 고려하세요. 종종 클라이언트가 WAN 링크를 통해 Tomcat 서버에 연결할 수 있습니다. 압축 속성은 Tomcat이 클라이언트에게 콘텐츠를 보낼 때 콘텐츠를 압축할지 여부를 제어합니다.
최상의 성능을 위해 이 속성을 “on”으로 설정합니다. 그러면 GZIP 압축이 사용됩니다. 압축해야 할 콘텐츠 유형은 compressibleMimeType에 제공됩니다. 클라이언트와 서버 간의 모든 통신은 HTML, XML 또는 단순히 유니코드 등 텍스트가 주를 이루더라도 간단하고 표준적인 GZIP 알고리즘을 사용하여 최대 90%까지 압축할 수 있습니다. 이는 네트워크 트래픽을 줄이는 데 큰 영향을 미쳐 클라이언트로 훨씬 더 빠르게 응답을 보낼 수 있고, 동시에 다른 네트워크 중심 애플리케이션에 더 많은 네트워크 대역폭을 사용할 수 있습니다.
executors 사용
각 커넥터에는 스레드 풀이 전용됩니다.커넥터를 사용할 때, 각 커넥터에 스레드 풀이 할당됩니다. 여러 커넥터를 사용하는 경우 실행자를 구성할 수 있습니다. 실행자는 여러 커넥터에서 공유할 수 있는 공통 스레드 풀입니다. 이를 통해 커넥터 간에 스레드를 더 잘 공유할 수 있을 뿐만 아니라, 들어오는 워크로드가 처리를 위해 이러한 스레드를 필요로 하지 않는 경우 풀의 스레드 수를 줄이는 메커니즘도 제공합니다.
커넥터당 스레드 풀을 사용할 때 Tomcat은 풀에서 스레드를 회수하지 않으므로 한 번 많은 요청이 발생하면 Tomcat 서버의 전체 수명 동안 풀의 스레드 수가 늘어날 수 있습니다. 실행자를 사용할 때 maxThreads 설정은 실행자 수준에서 정의됩니다. 이러한 경우 Tomcat 관리자는 커넥터 수준이 아닌 실행자 수준에서 스레드 풀 활동 및 사용을 모니터링해야 합니다.