1. 메모리 관련문제
2. JVM 파라미터 최적화
3. OS 수준의 최적화를 통한 성능 개선
[톰캣에 영향을 주는 요소들]
[톰캣 컴포넌트 튜닝]
스레드 튜닝, 포트 커스터마이즈, JVM 튜닝 등 서버 성능에 영향을 미치는 다양한 설정 가능
1. Connector
- JAVA HTTP Connector : HTTP 프로토콜을 기반. HTTP/1.1 프로토콜만 지원
- JAVA AJP Connector : AJP(아파치 JServ프로토콜)와 AJP를 통한 웹 서버 통신을 기반으로 하며 자바 서블릿 컨테이너를 인터넷에 노출하고 싶지 않을 때 AJP Connector를 사용해 톰캣 7에서 SSL Termination을 처리하지 않는 상황이라면 AJP Connector를 매우 유용하게 활용할 수 있다 - 구현체로는 mod_jk, mod_proxy등이 있다 (http://tomcat.apache.org/tomcat-7.0-doc/config/ajp.html)
※ SSL Termination은 SSL 처리를 다른 기기에 맞겨서 동시에 보다 많은 요청, 세션, 쿠키등을 처리 가능하게 함
- APR(HTTP/AJP) Connector : 확장성, 성능, 다른 웹 서버와의 협력 작업 상황에서 능력을 발휘. Open SSL,공유 메모리, 유닉스 소켓 등과 같은 부가 기능 제공 (http://tomcat.apache.org/tomcat-7.0-doc/config/apr.html)
2. 스레드 최적화
- Thread pool : 톰캣이 수락할 수 있는 연결 수 또는 서버가 수락할 수 있는 요청수로 보면 된다. Shared Pool, Dedicated Pool 2가지고 있고 serverlxml을 이용해 풀을 설정할 수 있다.
전용 thread pool ex>
<Connector port="8023" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8" />
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="9023"
enableLookups="false" redirectPort="8443" protocol="AJP/1.3" URIEncoding="UTF-8" maxKeepAliveRequests="-1" maxProcessors="500" maxThreads="250"/>
- maxThreads : 서버가 수락할 수 이쓴 최대 요청 수로 default는 150이며 서버의 CPU 사용량이 높으면 thread값을 줄이고 낮으면 높여준다. (DB연결, 네트워크 대역폭 등 다른 resource도 같이 고려해야함)
- maxKeepAlive : 종료되지 않고 동시에 대기할 수 있는 TCP 연결 수를 정의하며 default = 1 (비활성화)
when = 1
톰캣에서 SSL Termination 수행하지 않음 / 부하 균형 기법 사용 / 동시에 더 많은 사용자를 수용
when > 1
톰캣에서 SSL Termination 수행 / 적은 동시 사용자를 수용
3. JVM 튜닝
톰캣 Default Hep memory = 256MB
※ JMAP (메모리 맵) - 공유된 자바 가상 메모리 전체 못브을 출력하는 유틸로 ./jmap -heap <process id> 로 사용
옵션 |
설명 |
-dump |
자바 힙을 hprof 바이너리 형식으로 덤프 |
-finalizer info |
소멸(finalization)을 기다리는 오브젝트 정보 출력 |
-heap |
heap 요약 정보 출력 |
-histo |
heap histogram 출력 |
-permstat |
자바 힙의 영구 세대(Permanent generation)를 클래스 로더 통계로 출력 |
4. Garbage Collection
- GC 호출되면 메모리에 있는 모든 비활성 오브젝트를 수집해서 메모리를 정리
5. JVM 옵션
Java Hotspot은 VM 옵션을 크게 표준 옵션 / 비표준 옵션으로 구분
- 표준 옵션 : 기본 설정
- 비표준 옵션 : -x, -xx. 행동 옵션(VM의 기본 행동을 바꾸는 옵션) / 성능 튜닝 옵션(VM 선응을 최적화하는 옵션) / 디버깅 옵션(로그 추적 기능 활성화 관련 옵션)
옵션 |
파라미터 |
설명 |
행동옵션 |
-XX:+ScavengeBeforeFullGC |
전체 GC에 앞서 젊은 세대 GC를 수행 |
|
--XX:-UseParallelGC |
병렬 가비지 콜렉션으로 빠른 GC(Scavenge)수행 |
성능옵션 |
-XX:MaxNewSize=size |
new 영역의 최대 크기(byte단위) |
|
-XX:MaxPermSize=64m |
Perm 영역 크기(-Xmx값 초과시) |
|
-Xms |
톰캣 시작시 최소 힙 메모리 |
|
-Xmx |
인스턴스에 할당할 최대 메모리 |
|
-Xss |
힙 스택 크기 |
디버깅 |
-XX:-CITime |
JIT 컴파일러가 소비한 시간 출력 |
|
-XX:ErrorFile=./hs_err_pid<pid>.log |
발생한 에러를 기록할 파일 지정 |
|
-XX:HeapDumpPath= ./java_pid<pid>.hprof |
Heap Dump용 디렉토리 경로나 파일명 |
|
-XX:-HeapDumpOnOutOfMemoryError |
java.lang.OutOfMemoryError가 발생하면 힙을 파일로 덤프 |
|
-XX:OnError="<cmd args>;<cmd args>" |
치명적 에러 발생시 사용자가 정의한 명령 실행 |
|
-XX:OnOutOfMemoryError="<cmd args>;" |
처음으로 OOM이 발생하면 사용자가 정의한 명령 실행 |
|
-XX:-PrintClassHistogram |
Ctrl-Break 를 눌렀을 때 클래스 인스턴스의 히스토그램 출력 |
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.thml
- GC 로그에 표시된 파라미터
[%T %B->%A(%C), %D]
%T : 빠른 GC단계에서는 'GC'로 전체 GC를 수행할 때는 'Full GC:'로 표시하고 빠른 GC는 new 영역에서 살아있는 오브젝트만 수집하고 Full GC수행시 자바 힙의 모든 공간에서 오브젝트를 수집한다
%B : GC 실행하기 전의 자바 힙 크기(KB단위)
%A : GC 실행한 후의 자바 힙 크기(KB단위)
%C : 전체 자바 힙의 현재 용량(KB단위)
%D : 콜렉션에 걸린 시간(초)
- SurvivorRatio : 생존 공간 크기에 대한 eden의 비율 정의. default는 9로 각 생존 공간의 크기보다 eden이 8배 크다. -XX:SurvivorRatio=<size>
Xmn / (SurvivorRatio + 2) = 각 생존 공간의 크기
(Xmn / (SurvivorRatio + 2)) * SurvivorRatio = eden 크기
6. OS 튜닝
64bit VS 32bit : 32bit가 64bit보다 조금 더 빠르나 64bit는 더 큰 메모리를 사용할 수 있고 보통 4GB 이상의 메모리 할당 가능 (64bit JVM 사용하려면 32bit JVM에 비해 30% 메모리 더 추가)