Apache Tomcat 튜닝으로 성능 향상
Apache Software Foundation에서 개발한 Apache Tomcat 은 웹 서버로도 기능하는 오픈 소스 Java 서블릿 컨테이너입니다. 100,000개가 넘는 웹사이트가 웹 서버로 Tomcat에 의존하는 반면, Java 애플리케이션 서버에 대한 Plumbr 설문 조사에 따르면 Java 기술을 사용하는 웹사이트의 60% 이상이 비즈니스 로직을 호스팅하기 위해 Apache Tomcat에 의존하는 것으로 나타났습니다.
프로덕션 환경은 고성능이어야 합니다. 이를 위해서는 Apache Tomcat이 가능한 최대 부하를 처리하도록 구성되어야 하지만 사용자에게 최상의 응답 시간을 제공해야 합니다. 애플리케이션 서버가 제공하는 성능은 종종 구성 방법에 따라 달라집니다. 제공되는 기본 설정은 종종 최적이 아닙니다.
eG Innovations에서, 저희 eG Enterprise IT 성능 모니터링 솔루션은 웹 서버로 Apache Tomcat을 사용합니다. 수년에 걸쳐, 저희는 Tomcat을 구성하여 가능한 가장 높은 수준의 확장성을 달성하기 위한 몇 가지 팁과 요령을 발견했습니다. 이 블로그 게시물은 프로덕션에서 Tomcat을 배포할 때 사용해야 하는 모범 사례에 대한 저희의 학습 내용을 문서화합니다.
Tomcat 성능 조정에는 전체적인 접근 방식이 필요
고성능을 달성하기 위한 첫 번째 단계는 Tomcat 애플리케이션 서버만 튜닝하는 것으로는 충분하지 않다는 것을 인식하는 것입니다. 결국 Tomcat은 Java 가상 머신 (JVM) 위에서 실행됩니다. 따라서 구성이 잘못된 JVM은 성능을 저하시킵니다. 마찬가지로 JVM은 운영 체제에서 실행되며 가능한 한 최고의 성능을 달성하기 위해 최상의 운영 체제 구성을 갖는 것이 중요합니다. 애플리케이션 코드 의 병목 현상조차도 “Tomcat이 느리다”는 불만을 초래할 수 있습니다. 결론적으로 Tomcat 성능 튜닝에는 전체적인 접근 방식을 취해야 합니다.
성능 튜닝은 운영 체제, JVM, Tomcat 컨테이너, 애플리케이션 코드 수준 등 모든 계층에서 수행되어야 합니다. 다음 섹션에서는 최상의 성능을 위해 운영 체제, JVM, Tomcat 컨테이너 및 애플리케이션 코드를 구성하는 모범 사례를 소개합니다.
Tomcat 성능을 위한 운영 체제 최적화
지속적으로 높은 성능을 유지하려면 Tomcat 운영체제를 조정해야 합니다.서버 운영 체제가 예상 작업 부하에 맞게 올바르게 크기가 조정되었는지 확인합니다. 서버 CPU 및 메모리 사용률을 모니터링하여 CPU 및 메모리 병목 현상이 없는지 확인합니다. 최상의 성능을 얻으려면 64비트 운영 체제를 사용합니다.
최상의 성능을 위해 Tomcat에 전용 시스템이 제공되었는지 확인하십시오. 사용 중인 시스템이 가상 머신인 경우 VM 준비 시간이 낮은지(5% 미만) 확인하십시오. 즉, VM이 필요할 때 CPU를 얻고 있다는 의미입니다. 클라우드 환경에서 서버의 리소스 사용량이 리소스 구성 제한에 도달하지 않았는지 확인하십시오(예: Microsoft Azure에서 DTU 사용량이 100%에 가깝지 않음).
최대 성능을 얻기 위해 적용해야 할 잘 문서화된 운영 체제 조정도 많이 있습니다. 예를 들어, Linux 시스템의 경우, Tomcat 성능에 영향을 미치지 않을 만큼 열린 파일의 제한이 충분히 높은지 확인합니다(자세한 팁은 여기에서 찾을 수 있습니다 ). 마찬가지로, 운영 체제 수준에서 TCP 설정도 조정하여 운영 체제 수준에서 연결 요청 버스트를 처리할 수 있도록 해야 합니다. TCP 포트 고갈 문제도 피해야 합니다.
Tomcat의 JVM 튜닝
Tomcat은 JVM을 사용하므로 JVM의 성능은 Tomcat의 성능에도 영향을 미칩니다. 설정을 조정하기 전에 애플리케이션에 최신 JVM을 선택했는지 확인해야 합니다. 각 Java 버전에서 5-20%의 성능 향상을 나타내는 벤치마크가 많이 있습니다.
JVM의 성능은 Tomcat의 성능에 영향을 미칩니다.많은 JVM이 32비트 및 64비트 모드로 제공됩니다. 32비트 모드는 2GB 메모리로 제한되는 반면, 64비트 JVM은 Java 힙을 훨씬 더 높게 설정할 수 있습니다. 따라서 최상의 성능과 가장 높은 확장성을 위해 64비트 JVM을 사용하고 있는지 확인하세요.
가비지 콜렉션 은 Java 프로그램이 자동 메모리 관리를 수행하는 프로세스입니다. 과거에는 가비지 콜렉션이 stop-the-world 방식으로 수행되었습니다. 즉, 가비지 콜렉션이 발생하면 메모리를 회수하기 위해 애플리케이션이 일시 중지되었습니다. 오늘날에는 가비지 콜렉션이 애플리케이션 실행과 병렬로 수행되는 가비지 콜렉션 구현이 많이 있습니다.
최상의 성능을 얻으려면 G1GC (Garbage First Garbage Collector)나 Z Garbage Collector 와 같은 최신 가비지 콜렉터를 선택하세요 . JVM의 MaxGCPauseMillis 설정은 환경에서 예상되는 최대 일시 정지 시간을 설정하는 데 사용할 수 있습니다. 최상의 성능을 위해 이 값을 500-2000ms 사이로 설정하는 것이 좋습니다. 일시 정지 시간이 길수록 처리량이 늘어나는 반면, 일시 정지 시간이 짧을수록 대기 시간과 처리량이 줄어듭니다 . 다양한 GC 설정 외에도 프로덕션에서 Tomcat 서버를 모니터링하고 JVM이 가비지 수집에 사용하는 시간의 백분율이 낮은지 확인하십시오. 5%를 넘는 값은 Tomcat 성능에 해롭습니다. JVM의 메모리 가용성도 Tomcat 성능에 부정적인 영향을 미칠 수 있습니다.
모든 힙 및 비힙 메모리 풀에서 충분한 메모리를 사용할 수 있는지 확인해야 합니다. 메모리 풀 중 하나에서 사용 가능한 메모리가 부족하면 OutOfMemory 예외가 발생하고 애플리케이션이 예상치 못한 방식으로 실패할 수 있습니다. JVM의 Xmx 및 Xms 플래그를 사용하여 최대 힙 크기와 스택 크기를 설정하고 XX 플래그를 사용하여 사용 중인 JRE 버전에 따라 PermSize 또는 MetaspaceSize를 설정합니다
메모리 제한을 설정하는 것은 종종 시행착오 과정입니다. 메모리 제한을 너무 낮게 설정하면 예외가 발생할 수 있고, 너무 높게 설정하면 리소스 낭비가 발생할 수 있습니다. JVM 모니터링 도구를 사용하여 일주일 이상 동안 성능을 분석하고 피크 시간도 고려하여 JVM 메모리 풀의 최적 값을 결정합니다. JVM에서 메모리가 무제한으로 증가하는 경우 애플리케이션에 메모리 누수가 있는지 확인해야 합니다.
JvisualVM 및 Jconsole과 같은 Java 내장 도구를 사용하여 메모리 힙 덤프를 가져옵니다. Eclipse Memory Analyzer(MAT)와 같은 도구를 사용하여 메모리 누수 의심 사항을 확인합니다. MAT의 Dominator Tree는 스레드/객체가 메모리 누수를 일으키는 범위를 좁히는 데 도움이 됩니다.
마지막으로 JVM에서 스레드 활동을 추적합니다.
이와 같이 Apache Tomcat 성능 향상을 위한 다양한 관점에서의 최적화가 필요한데요. 본 포스팅을 참고하여 현재 운영중인 사이트의 문제점을 파악해보고 성능 튜닝이 되지 않았다면 다양한 설정들을 변경하여 적용해보시기 바랍니다.