Tuning Java Garbage Collection for HBase 발번역 & 정리
2 min readNov 26, 2015
http://blog.cloudera.com/blog/2014/12/tuning-java-garbage-collection-for-hbase/
Imported from Agit
요약 정리
- round-trip latency 를 100ms 이하로 유지하고 싶음 (평균 말고 99th percentile)
-- 99th percentile 이 뭐지? : https://answers.yahoo.com/question/index?qid=20100113073210AAkGQ95
- latency 에는 여러 가지가 영향을 끼치지만, 가장 큰 요인은 JVM GC 의 Stop the world -> GC 를 튜닝하자!
- 테스트
-- H/W 사양: 1대, CPU Xeon Ivy-bridge hyperthreading 포함 논리 Core 40 개, 메모리 DDR3-1600 256G, 3 * 400G SSD
-- 클러스터 구성: 1대에 master-slave 모두 구성, HBase 0.98.1, HDFS 없이 로컬 파일시스템 사용, BlockCache 40 % & Memstore 40 %
-- 테스트 데이터: 4억 row, 크기는 580G
-- 테스트 방법: YCSB 사용, 100% read workload, 600 개 work thread 로 동시 조회, 1시간 정도 수행
-- JDK & GC : Oracle jdk7u21, jdk7u60, G1 GC
-- GC 옵션 : -XX:+UseG1GC -Xms100g -Xmx100g -XX:MaxGCPauseMillis=100
- 테스트 결과
-- jdk7u21, 튜닝 전, initial spike 포함 : GC count 286 (간격 12.6s), Max 17.5 s, Min 0.007s, Avg 1.79s, Stdev 2.1s
-- jdk7u21, 튜닝 전, 안정화 시점 (150회 GC) : 간격 12.6s, Max 4.723s, Min 0.010s, Avg 1.548s, Stdev 1.26s
-- jdk7u60, 튜닝 전, initial spike 포함 : GC count 1029 (간격 3.5s), Max 3.79s, Min 0.302s, Avg 0.42s, Stdev 0.32s
-- jdk7u21, 튜닝 전, 안정화 시점 (150회 GC) : 간격 3.5s, Max 0.639s, Min 0.304s, Avg 0.369s, Stdev 0.056s
- G1 GC 설명 : 알아서 보세요 (...)
- 테스트로는 HeapOccupancyPercent 가 full GC 까지 올라가지 않음을 확인, 즉 Young Gen 의 STW 가 튜닝 대상
- G1 GC 옵션 튜닝
-- -XX:+ParallelRefProcEnabled -> Young / Mixed GC 때 멀티쓰레드로 ref 수 증가
--- HBase 와 같이 사용 시 GC remarking 시간이 75% 로 경감, 전체 GC 멈춤 시간이 30% 로 경감
-- -XX:-ResizePLAB 및 -XX:ParallelGCThreads=8 + (논리 core 수 - 8) (5 / 8)
--- PLAB 은 Young GC 시에 멀티 쓰레드가 GC 를 돌면서 복사할 객체를 보관하는 곳, 쓰레드 당 survival 용 1개, oldgen 용 1개가 존재
--- 문서에는 PLAB resize 를 막아서 GC 쓰레드끼리의 통신 비용을 피하라고 함
--- GC 쓰레드 수 계산은 최근에 Oracle 이 권장한 계산이라고 함
-- -XX:G1NewSizePercent=1 -> Eden 크기를 결정, 기본값 5
--- GC 확인 결과 Eden 정리하는 데 시간을 많이 소요 -> 5G Eden 을 정리하는 데 369ms 소요
--- 1로 줄여서 (Eden 1G) 100ms 안쪽으로 끊음
--- 테스트 HBase 환경에서 G1 이 Eden 을 정리하는 시간은 대강 100ms 당 1G 정도 혹은 1s 당 10G 정도
- 최종 JVM 옵션은 -XX:+UseG1GC -Xms100g -Xmx100g -XX:MaxGCPauseMillis=100 -XX:+ParallelRefProcEnabled -XX:-ResizePLAB -XX:ParallelGCThreads=28 -XX:G1NewSizePercent=1
- 최종 JVM 옵션으로 재테스트
-- initial spike 때도 Max 1.684s, 대부분 1s
-- 안정화 후 모든 GC 가 100ms 전후로 유지
-- Avg 106ms, Stdev 7ms