CH09. JVM과 톰캣 튜닝
아꿈사 - 최문규
1. JVM튜닝
• JVM튜닝이라 쓰고 GC튜닝이라 읽는다.
• JVM이 작동하는데 있어, 메모리 구조와 GC(Garbage
Collection)은 성능에 밀접한 관계
1.1 GC란 무엇인가?
• 사용하지 않는 메모리를 자동으로 거둬들이는 기능
• stop-the-world
• 클래스 인스턴스는 사용자 코드에 의해 명시적으로 생성되
고 가비지 컬렉션에 의해 자동으로 파괴된다.
1.2 GC동작 방법
• JVM메모리 영역
메모리 구조
• new/young

객체가 생성되지 마자 저장되는곳. 시간에 지남에 따라 old영역으로 이동
• old

new/young영역에서 저장되었던 객체 중, 오래된 객체가 이동되어 저장
• perm

class, method등의 코드가 저장되는 영역
GC알고리즘즘
• Minor GC
• Copy & Scavenge : eden, survivor영역
• Full GC
• Mark & Compact : old영역
다양한 GC알고리즘
• Default Collector
• Parallel GC for young generation
• Concurrent GC for old generation
• Incremental GC
Parallel GC
• JDK1.4부터는 Minor GC를 동시에 여러개의 스레드를 이요
해 사용가능
• 4 cpu, 256M이상에서 성능 발휘?
• Low-pause(stop-the-world 최소화)

Throughput(ASAP) 두 가지 방식을 사용
Concurrent GC
• Full GC의 단점(stop-the-world)를 보완하기 위해
• Initial Mark : 활성화 객체 미리 찾기
• Concurrent Mark : 참조가 끊긴 객체 확인
• Concurrent Sweep : 정리 정리
Incremental GC
• Full GC에 의해서 발생하는 stop-the-world pause를 줄이자
• Minor GC가 일어날 때마다, old영역을 조금씩 GC해서자

결과적으로 Full GC를 최소한으로 일어나게 만들자
GC로그 수집과 분석 방법
• java -verbosegc
• java -XX:+PrintGCDetails
GC관련 파라미터
• 전체 힙 크기 조정

-Xms1024M -Xmx1024M
• perm크기 조정

-XX:MaxPermSize
• new영역과 old영역의 크기 조정

-XX:NewSize
• survivor영역 비율 조정

-XX:SurvivorRatio http://www.oracle.com/technetwork/java/javase/
community/vmoptions-jsp-140102.html
• ref : http://www.oracle.com/technetwork/java/javase/community/
vmoptions-jsp-140102.html
GC관련 파라미터
• -server
• 어플리케이션 서버에 적합한 compiler최적화, 메모리구조
• new 영역 > old영역
• -client
• 클라이언트 어플리케이션에 적합한 compiler최적화, 메모리
구조
• new영역 < old영역
JVM GC튜닝
1. 어플리케이션의 종류와 튜닝 목표 값 설정
2. 힙 크기와 perm크기 설정
3. 테스트와 로그분석
4. perm크기 조정
5. GC 수행시간 분석
6. 파라미터 변경
2. tomcat 튜닝
• 시나리오 : HTTP/JSON, REST형태로 API서버

L4스위치

server.xml튜닝
• Listener설정
• tomcat이 기동할 때, root로 실행금지
• 설정파일, 로그파일들이 루트권한으로 바뀌어서

일반 계정으로 재 실행시, 권한 문제 발생
Connector설정
• acceptCount=“10”
• 큐의 길이를 정의
• 큐의 길이를 적당히 조절해, 요청을 처리 하지 못하는걸
빨리 알려주는 예외처리시
• enableLoopups=“false”
• http요청에 대한 IP를 조회하는 명령을 비활성
Connector설정
• maxConnection=“8192”
• tomcat가 사용가능한 FD(file descriptior) 수
• TIME_WAIT로 인한, socket close지연
• maxKeepAliveRequest=“1”
• keep alive연결 시, 최대 유지연결 갯수 지정
Connector설정
• maxThread=“100”
• tomcat내의 스레드 수를 설정한다.
2.5메모리 옵션
• 메모리 튜닝은 중요하다
• 힙크기는 최소 값, 최대 값을 같은 크기로 지정
• 힙 덤프옵션사용으로, out of memory발생시 해당 위치를
찾기 용이
• parallel GC + Concurrent GC
• GC로그 사용

JVM과 톰캣 튜닝

  • 1.
    CH09. JVM과 톰캣튜닝 아꿈사 - 최문규
  • 2.
    1. JVM튜닝 • JVM튜닝이라쓰고 GC튜닝이라 읽는다. • JVM이 작동하는데 있어, 메모리 구조와 GC(Garbage Collection)은 성능에 밀접한 관계
  • 3.
    1.1 GC란 무엇인가? •사용하지 않는 메모리를 자동으로 거둬들이는 기능 • stop-the-world • 클래스 인스턴스는 사용자 코드에 의해 명시적으로 생성되 고 가비지 컬렉션에 의해 자동으로 파괴된다.
  • 4.
    1.2 GC동작 방법 •JVM메모리 영역
  • 5.
    메모리 구조 • new/young
 객체가생성되지 마자 저장되는곳. 시간에 지남에 따라 old영역으로 이동 • old
 new/young영역에서 저장되었던 객체 중, 오래된 객체가 이동되어 저장 • perm
 class, method등의 코드가 저장되는 영역
  • 6.
    GC알고리즘즘 • Minor GC •Copy & Scavenge : eden, survivor영역 • Full GC • Mark & Compact : old영역
  • 7.
    다양한 GC알고리즘 • DefaultCollector • Parallel GC for young generation • Concurrent GC for old generation • Incremental GC
  • 8.
    Parallel GC • JDK1.4부터는Minor GC를 동시에 여러개의 스레드를 이요 해 사용가능 • 4 cpu, 256M이상에서 성능 발휘? • Low-pause(stop-the-world 최소화)
 Throughput(ASAP) 두 가지 방식을 사용
  • 9.
    Concurrent GC • FullGC의 단점(stop-the-world)를 보완하기 위해 • Initial Mark : 활성화 객체 미리 찾기 • Concurrent Mark : 참조가 끊긴 객체 확인 • Concurrent Sweep : 정리 정리
  • 10.
    Incremental GC • FullGC에 의해서 발생하는 stop-the-world pause를 줄이자 • Minor GC가 일어날 때마다, old영역을 조금씩 GC해서자
 결과적으로 Full GC를 최소한으로 일어나게 만들자
  • 11.
    GC로그 수집과 분석방법 • java -verbosegc • java -XX:+PrintGCDetails
  • 12.
    GC관련 파라미터 • 전체힙 크기 조정
 -Xms1024M -Xmx1024M • perm크기 조정
 -XX:MaxPermSize • new영역과 old영역의 크기 조정
 -XX:NewSize • survivor영역 비율 조정
 -XX:SurvivorRatio http://www.oracle.com/technetwork/java/javase/ community/vmoptions-jsp-140102.html • ref : http://www.oracle.com/technetwork/java/javase/community/ vmoptions-jsp-140102.html
  • 13.
    GC관련 파라미터 • -server •어플리케이션 서버에 적합한 compiler최적화, 메모리구조 • new 영역 > old영역 • -client • 클라이언트 어플리케이션에 적합한 compiler최적화, 메모리 구조 • new영역 < old영역
  • 14.
    JVM GC튜닝 1. 어플리케이션의종류와 튜닝 목표 값 설정 2. 힙 크기와 perm크기 설정 3. 테스트와 로그분석 4. perm크기 조정 5. GC 수행시간 분석 6. 파라미터 변경
  • 15.
    2. tomcat 튜닝 •시나리오 : HTTP/JSON, REST형태로 API서버
 L4스위치

  • 16.
    server.xml튜닝 • Listener설정 • tomcat이기동할 때, root로 실행금지 • 설정파일, 로그파일들이 루트권한으로 바뀌어서
 일반 계정으로 재 실행시, 권한 문제 발생
  • 17.
    Connector설정 • acceptCount=“10” • 큐의길이를 정의 • 큐의 길이를 적당히 조절해, 요청을 처리 하지 못하는걸 빨리 알려주는 예외처리시 • enableLoopups=“false” • http요청에 대한 IP를 조회하는 명령을 비활성
  • 18.
    Connector설정 • maxConnection=“8192” • tomcat가사용가능한 FD(file descriptior) 수 • TIME_WAIT로 인한, socket close지연 • maxKeepAliveRequest=“1” • keep alive연결 시, 최대 유지연결 갯수 지정
  • 19.
  • 20.
    2.5메모리 옵션 • 메모리튜닝은 중요하다 • 힙크기는 최소 값, 최대 값을 같은 크기로 지정 • 힙 덤프옵션사용으로, out of memory발생시 해당 위치를 찾기 용이 • parallel GC + Concurrent GC • GC로그 사용