Tomcat 성능 튜닝의 핵심: maxThreads, maxConnections, acceptCount 완벽 이해
서론
대규모 트래픽이 발생하는 환경에서 WAS(Tomcat)가 응답하지 않거나 속도가 급격히 느려진다면, 가장 먼저 의심해야 할 곳은 쓰레드 풀(Thread Pool) 설정입니다. Tomcat의 server.xml에서 설정하는 세 가지 핵심 파라미터의 관계를 정확히 이해해야 서비스 장애를 예방할 수 있습니다.
Tomcat 요청 처리의 3단계 레이어
1. acceptCount (대기열 크기)
모든 쓰레드가 사용 중일 때, 운영체제(OS) 수준에서 요청을 대기시킬 큐의 크기입니다. 이 큐마저 가득 차면 클라이언트는 Connection Refused 에러를 받게 됩니다.
- 실무 팁: 너무 크게 설정하면 클라이언트는 타임아웃에 걸릴 때까지 하염없이 기다리게 되므로 적절한 제한이 필요합니다.
2. maxConnections (최대 연결 수)
Tomcat이 동시에 유지할 수 있는 최대 네트워크 연결 수입니다. 쓰레드 수보다 훨씬 크게 설정하여(NIO 방식), 실제 처리 중이지 않은 연결도 잠시 붙들어 둘 수 있습니다.
- 기본값: NIO 기준 10,000개
3. maxThreads (최대 처리 쓰레드 수)
실제로 요청을 처리하기 위해 생성되는 작업 쓰레드의 최대 개수입니다. CPU와 메모리 자원을 직접적으로 사용하는 가장 중요한 수치입니다.
- 설정 주의: 무조건 크게 설정한다고 좋은 것이 아닙니다. 쓰레드가 너무 많으면 컨텍스트 스위칭(Context Switching) 비용이 발생하여 오히려 성능이 저하됩니다.
최적의 설정 조합 찾기
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="200"
maxConnections="10000"
acceptCount="100" />
- 로그 분석:
jstack이나 모니터링 도구(Scouter, Jennifer 등)를 통해 현재 활성 쓰레드 수를 확인합니다. - 부하 테스트: nGrinder나 JMeter를 사용해 응답 시간이 급격히 늘어나는 시점의 쓰레드 수를 파악합니다.
- 자원 모니터링: 쓰레드 증가 시 CPU와 Memory 사용률이 임계치를 넘지 않는지 체크합니다.
핵심 SEO 포인트: 성능 병목과 에러 메시지
- Connection Refused:
acceptCount초과 시 발생. - Timeout:
maxThreads부족으로 요청 처리가 지연될 때 발생. - NIO Connector: 적은 쓰레드로 많은 연결을 관리하기 위해 반드시 NIO 방식을 사용해야 합니다.
결론
Tomcat 튜닝은 하드웨어 자원과 서비스의 특성에 맞춘 ‘최적의 지점’을 찾는 과정입니다. maxThreads를 무작정 늘리기보다, 애플리케이션의 로직(I/O 집중형인지 CPU 집중형인지)을 파악하여 점진적으로 수치를 조정해 보시기 바랍니다.