1. 개요

Heap 메모리 할당에 따라, 부하가 있을 때, GC 횟수에 어떠한 차이가 있는지 확인해 보고자 한다.


2. 실험환경

  • JDK 1.7 64bit
  • Tomcat 8.0.12
  • jPetstore 애플리케이션

3. 실험조건

  • 요청 유형은 조회 + 로그인 + 장바구니 등이 혼합된 총 5000건

4. 실험결과

Heap Tomcat 기동시간(초) 요청처리시간(초) 초당처리건수 GC횟수 FullGC횟수
64m 61224 2194 2.279 569 380
128m 13473 2167 2.307 245 4
256m 13131 2162 2.313 123 0
512m 13814 2164 2.311 62 0
1024m 13014 2163 2.312 32 0
2048m 13343 2165 2.309 16 0
4096m 13140 2165 2.309 9 0

 

  • Heap 64m인 경우는 Tomcat 기동에 약 1분 소요되나, Heap 128m 이상인 경우 약 13초 정도로 Tomcat 기동 시간에 큰 차이가 없었음
  • GC 횟수로 볼 때 할당 메모리에 정비례하여 줄어드는 것을 확인할 수 있었음
  • 이 테스트에서 Heap 256m 이상에서 Full GC는 전혀 발생하지 않았음
  • 이 테스트에서 초당처리건수를 볼 때 전체적으로 큰 차이는 없었음
  • 다만, 테스트 결과에 나타나지 않은 서버/프로세스 CPU 사용률을 확인할 필요가 있음 (GC = CPU 사용)

 


5. 대량 조회

  • 응용 시스템에서 대량 조회가 발생할 때, 과연 WAS, JVM 레벨에서만 대응하는 것은 옳지 않다. 응용 시스템 레벨에서는 다음과 같이 대응할 필요가 있다.
  • Framework에서 특정 건수 이상에서는 멈추도록 조치 (Exception 처리)
  • 데이터 조회 제한 : 비즈니스적으로 1) 조회가 꼭 필요한지, 2) 필요하다면 조회 범위 축소가 가능한지 확인
  • 페이징 처리 : DB 처리 부하를 줄이는 것이 핵심
    예) 건수와 데이터 처리를 분석함수를 이용하여 한 문장으로 실행할 수 있도록 처리 (스칼라 쿼리는 실제 건수만큼만 수행)
  • 대량 조회 전용 WAS 구성
  • 대량 데이터 업/다운로드 시 HTTP 출력 스트리밍과 JDBC ResultSet을 연동하여 처리
  • 메커니즘 변경
    - MyBatis ResultHandler + Jackson 사용
  • 엑셀 처리 시 매커니즘 변경
    - 업로드 : MyBatis ResultHandler + POI BufferedStream (SAX) 방식 사용
    - 다운로드: BufferedStreaming (SXSSF) 방식 사용