Application Server(Tomcat)의 효과적인 운영 방안
1. 어플리케이션 서버에서 필요한 메모리 계산 방법
- 계산식 : (MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads
- 메모리 계산 예
가정 : Java 1.5를 사용중이며 OS가 120MB를, 디폴트 스택사이즈는 0.5M
2. Application Server 에러 대처 방안(java.lang.OutOfMemoryError: PermGen space 현상)
- 계산식 : (MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads
- 메모리 계산 예
가정 : Java 1.5를 사용중이며 OS가 120MB를, 디폴트 스택사이즈는 0.5M
- JVM에 1.5GB할당되었을 경우 : (2GB-1.5Gb-120MB)/(1MB) = ~380 threads
- JVM에 1.0GB할당되었을 경우 : (2GB-1.0Gb-120MB)/(1MB) = ~880 threads
2. Application Server 에러 대처 방안(java.lang.OutOfMemoryError: PermGen space 현상)
- Tomcat의 경우 v6.0.14이상의 안정적 릴리즈 된것을 선택
- JDK1.4보다는 1.5, 1.6의 사용을 권고함
- -XXMaxPermSize 설정을 통해 perm 사이즈를 증가시킴
- JHat으로 메모리릭 원인을 찾고 JConsole, Lambda probe 등을 통해 메모리 모니터링을 함
- Application Server운영자는 Garbage Collection에 대한 이해가 있어야 함
3. Tomcat에서 설정 예시
- 힙메모리 정보를 출력 : -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC
위 설정을 통해 출력되는 로그를 보고 New Generation의 eden 영역, Old Generation 영역, Permanent 영역을 확인하여 각 영역이 작으면 아래와 같은 설정으로 적당 사이즈를 확보해 줍니다.
- 도출된 설정 : -Xms256m -Xmx512m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:MaxPermSize=128m -XX:SurvivorRatio=5
-Xms : 최소 힙 싸이즈
-Xmx : 최대 힙 싸이즈
-XX:NewSize : New Generation의 최소 싸이즈
-XX:MaxNewSize : New Generation의 최대 싸이즈
-XX:MaxPermSize : Permanent Generation의 최대 싸이즈 가 되겠다.
-XX:SurvivorRatio : 영역비율(New Generation)
결론적으로 적용할 설정은 아래와 같습니다.
- CATALINA_OPTS="-server -Xss256k -Xms256m -Xmx512m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:MaxPermSize=128m -XX:SurvivorRatio=5 -XX:ReservedCodeCacheSize=128m -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -Djava.net.preferIPv4Stack=true -Djava.awt.headless=true "
Open Soure는 100% 안정적이지 않기 때문에 가장 최신의 안정적인 버젼이 릴리즈되는지 항상 예의 주시하여 버전업에 게을러서는 안됩니다
Java Tips : Java Connection Pool에서 ERROR 피하기
데이터 베이스 리스타트를 할 경우, 이중화 장비 한대가 죽었을 경우 등에 커넥션 풀을 재접속하여 서비스에 에러가 발생하면 안됩니다. 보통 iBatis와 Hibernate에서는 Apache DBCP를 커넥션 풀로 많이 사용하기 때문에 DBCP에 대한 설정부분을 공유합니다.
커넥션 오류를 피하기 위해서...
주의 사항으로 testOnBorrow값이 true로 오기 위해서는 validationQuery 파라미터가 non-null string이 어야만 합니다. 네트워크 장애에 의한 무응답일 경우는 어쩔수 없습니다.
상용 커넥션 풀인 경우 무응답 기간을 설정하여 재 커넥션을 요청하게 됩니다.
아래는 설정 내용이니 참고하세요.
커넥션 오류를 피하기 위해서...
- validationQuery : 적어도 한 row를 출력할 수 있는 SEELCT 쿼리를 지정하여 줌
- testOnBorrow : Object가 Validation하지 않을 경우 연결된 pool을 제거하고 다른 커넥션 풀을 하나 가져오는 작업을 수행함
주의 사항으로 testOnBorrow값이 true로 오기 위해서는 validationQuery 파라미터가 non-null string이 어야만 합니다. 네트워크 장애에 의한 무응답일 경우는 어쩔수 없습니다.
상용 커넥션 풀인 경우 무응답 기간을 설정하여 재 커넥션을 요청하게 됩니다.
아래는 설정 내용이니 참고하세요.








