Java World

Tomcat 성능 튜닝하기

Tomcat 성능 튜닝하기


성능이 떨어지는(느리고 답답한) 애플리케이션을 좋아하는 사람은 없음. Tomcat은 성능이 점점 좋아지므로 항상 최신 버전을 사용할 것.

1. JVM heap 메모리 크기 변경
– $CATALINA_HOME/bin/catalina.sh 파일에 아래 내용을 추가한다.

JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:+DisableExplicitGC"

(*) JVM의 기본 heap 메모리 사이즈는 64MB 이므로 최소한 -server, -Xms, -Xmx 옵션은 설정해야 한다.
(*) JVM 옵션 목록: http://blogs.sun.com/watt/resource/jvm-options-list.html
(*) Blog2Book, 자바 성능을 결정짓는 코딩 습관과 튜닝 이야기 추천함.

2. JRE 메모리 누수 처리
– Tomcat 6.0.26부터 메모리 누수를 탐지하는 기능이 추가되었다.
– $CATALINA_HOME/conf/server.xml 파일에서 아래 코드를 찾아 주석을 해제한다.

<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />

3. 스레드 풀(thread pool) 설정
– 클라이언트의 요청을 처리하는 스레드 수 설정. 기본 값은 200이며 그 이상의 요청이 있을 경우 “connection refused” 메시지를 리턴한다.
– $CATALINA_HOME/conf/server.xml 파일에서 <Connector />의 속성을 수정한다.

<Connector port="8080" address="localhost" maxThreads="250" maxHttpHeaderSize="8192" emptySessionPath="true" protocol="HTTP/1.1" enableLookups="false" redirectPort="8181" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" />

– 만약 maxThreads 값이 최대 값인 750을 넘을 경우 두 대의 Tomcat을 이용해 클러스터링 구성을 하는 것이 좋다. 하나의 Tomcat에 maxThreads=1000을 설정하지 말고 두 개의 Tomcat에 각각 maxThreads=500 설정을 하라는 뜻이다.
(*) 잘 모르겠으면 대충 설정하지 말고 Tomcat을 기본값으로 운영하면서 숫자를 조금씩 조정해야 함.

4. 압축
– 특정 mime-type에 대해 데이터를 압축하여 전송할 수 있다.

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8181" compression="500" compressableMimeType="text/html,text/xml,text/plain,application/octet-stream" />

– compression=”500″은 500 bytes 이상의 파일만 압축하라는 뜻이다.
– 닥치고 압축하려면 compression=”on”으로 설정한다.
(*) HTTP compression: 서버에서 파일을 압축한 뒤 클라이언트로 전송하는 기능임. Tomcat의 고유한 기능이 아니라 HTTP 스펙에 있는 기능임.

5. 데이터베이스 성능 튜닝
– NamedQuery를 쓴다면 애플리케이션 초기화할 때 모두 로드할 것.
(*) JDBC를 사용한다면 try…catch…finally를 사용하여 반드시 DB connection을 close 할 것.

6. Tomcat Native Library
– Apache Portable Runtime(APR)이라는 게 있는데 이게 성능 향상이 많은 도움을 줌.
– 설치방법: http://www.techbrainwave.com/?p=1017(영어)
(*) 설치방법: Tomcat Native Library – Apache Portable Runtime(APR) 설치(한글)
(*) 굳이 Apache httpd와 연동할 필요가 없는 이유임.
(*) 진실 혹은 거짓: Tomcat과 Apache httpd를 연동하는게 항상 성능을 향상시키는가?

7. 기타
– 웹 브라우저 캐시 사용함으로 설정할 것.
– 서버 재시작시 반드시 자동으로 Tomcat이 재시작 되도록 설정할 것.
– HTTPS가 HTTP에 비해 약간 느리긴 하지만 보안이 중요하다면 HTTPS를 사용할 것.


튜닝한다고 설치기 전에 정말 튜닝을 해야만 하는지 다시 한 번 생각해 보자.

 

 

 

자바 Http URL 호출

package com.test.httpurl
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import org.json.JSONObject;
import org.springframework.stereotype.Service;
@Service
public class HttpConnectionReader {
public String getURLBufferedReader(String url, String encoding) {
String sInputData = “”;
String sInputLine = “”;
BufferedReader in = null;
try {
URL ocu = new URL(url);
URLConnection con = ocu.openConnection();
con.setConnectTimeout(2000);
if (encoding.equals(“”)) {
in = new BufferedReader(new InputStreamReader(con.getInputStream()));
} else {
in = new BufferedReader(new InputStreamReader(con.getInputStream(),encoding));
}
while ((sInputLine = in.readLine()) != null) {
sInputData += sInputLine + “n”;
}
return sInputData;
}catch(Exception ex){
//System.out.println(“[API]-” + ex);
}finally{
if( in != null ) {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
//System.out.println(“[API][CLOSE ERROR]-” + e.toString());
}
}
}
return “”;
}
public JSONObject toJSON(String input) {
return new JSONObject(input);
}
}