[java] Tomcat과 Jetty의 성능 튜닝 방법

Tomcat과 Jetty는 모두 자바 기반의 웹 서버 및 서블릿 컨테이너로 유명하다. 그러나 대량의 트래픽 처리 및 높은 성능을 요구하는 웹 애플리케이션을 구축할 때 추가적인 성능 튜닝이 필요할 수 있다. 이 글에서는 Tomcat과 Jetty의 성능을 향상시키기 위한 몇 가지 방법을 알아보겠다.

1. 스레드 풀 설정 조정

Tomcat 및 Jetty 모두 기본적으로 스레드 풀을 사용하여 클라이언트 요청을 처리한다. 하지만 기본 설정은 일반적인 애플리케이션에 적합하며 많은 양의 동시 요청을 처리하는 경우에는 성능 저하가 발생할 수 있다. 스레드 풀의 크기를 증가시켜 병렬 처리 능력을 향상시키는 것이 좋다. 일반적으로 CPU 코어 수에 따라 적절한 스레드 풀 크기를 설정하면 좋은 결과를 얻을 수 있다.

Tomcat에서 스레드 풀 설정

Tomcat의 server.xml 파일에서 Connector 구성 요소를 찾아 maxThreadsacceptCount 속성을 조정할 수 있다. maxThreads는 풀에 생성될 최대 스레드 수를 설정하고, acceptCount는 풀에 대기 중인 요청의 최대 수를 설정한다.

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           maxThreads="200"
           acceptCount="200"
/>

Jetty에서 스레드 풀 설정

Jetty의 jetty.xml 파일에서 ThreadPool 구성 요소를 찾아 maxThreadsminThreads 속성을 조정할 수 있다. maxThreads는 최대 스레드 수를 설정하고, minThreads는 최소 스레드 수를 설정한다.

<New id="ThreadPool" class="org.eclipse.jetty.util.thread.QueuedThreadPool">
    <Set name="maxThreads">200</Set>
    <Set name="minThreads">10</Set>
</New>

2. 정적 콘텐츠 캐싱

웹 애플리케이션에서 정적 콘텐츠는 매우 자주 요청되는데, 매번 요청이 들어올 때마다 동적으로 생성할 필요는 없다. Tomcat 및 Jetty에서는 정적 콘텐츠를 캐싱하여 중복된 요청을 처리할 필요 없이 빠르게 응답할 수 있다. 정적 콘텐츠의 캐싱 설정은 웹 서버의 성능을 크게 향상시킬 수 있다.

Tomcat에서 정적 콘텐츠 캐싱 설정

Tomcat의 web.xml 파일에 다음과 같이 캐시 관련 설정을 추가한다.

<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
        <param-name>cacheMaxSize</param-name>
        <param-value>512000</param-value>
    </init-param>
    <init-param>
        <param-name>cacheObjectMaxSize</param-name>
        <param-value>4096</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/static/*</url-pattern>
</servlet-mapping>

Jetty에서 정적 콘텐츠 캐싱 설정

Jetty의 jetty-web.xml 파일에서 다음과 같이 캐시 관련 설정을 추가한다.

<Configure class="org.eclipse.jetty.webapp.WebAppContext">
    <Set name="cacheControl">max-age=3600,public</Set>
    <Set name="maxCachedFiles">512</Set>
    <Set name="maxCachedFileSize">4096</Set>
</Configure>

3. JVM 옵션 최적화

Tomcat 및 Jetty는 JVM 위에서 실행되므로 JVM 옵션의 최적화도 성능 향상에 큰 영향을 미칠 수 있다. 메모리 할당, GC 수행 등과 관련된 JVM 옵션을 조정하여 웹 서버의 성능을 최적화할 수 있다.

Tomcat에서 JVM 옵션 설정

Tomcat의 setenv.sh 파일(또는 setenv.bat 파일)에 다음과 같이 JVM 옵션을 추가한다.

export CATALINA_OPTS="-Xms2048m -Xmx4096m -XX:+UseG1GC -XX:MaxGCPauseMillis=200"

Jetty에서 JVM 옵션 설정

Jetty의 jetty.sh 파일(또는 jetty.bat 파일)에 다음과 같이 JVM 옵션을 추가한다.

export JAVA_OPTIONS="-Xms2048m -Xmx4096m -XX:+UseG1GC -XX:MaxGCPauseMillis=200"

위의 예제는 Tomcat 및 Jetty의 성능 튜닝을 위해 몇 가지 가이드라인을 제공한다. 실제로는 각 애플리케이션과 환경에 따라 적절한 설정을 찾아야 하며, 프로파일링 및 테스트를 통해 성능 문제를 해결해야 한다.


참고 자료