JVM의 옵션 튜닝은 JVM으로 기동 되는 미들웨어나 애플리케이션의 성능에 영향을 끼칠 수밖에 없다. 따라서 JVM 옵션의 튜닝 포인트를 명확히 이해하고 적용하는 것이 애플리케이션이나 미들웨어의 성능을 최적화하는 최선의 방법이다.
이번 포스팅에서는 JVM 옵션 적용을 통한 성능의 튜닝 포인트에 대해 다루워 보려고 한다.
일반적인 성능 튜닝의 정의
성능 튜팅에 앞서 '성능'을 어떤 관점에서 바라볼 것인가에 대한 기준이 필요하다. 일반 적으로 성능은 TPS와 응답 시간으로 구분될 수 있는데 JVM을 튜닝하기 전 TPS에 초점을 둘 것인지 응답 시간에 초점을 둘 것인지 정한 뒤 성능 튜닝에 초점을 맞추는 것이 필요하다.
TPS(Transaction Per Seconds) | 응답시간(Response Time) |
1초 당 처리 가능한 트랜잭션의 수 | 사용자가 서버로 요청을 보낸 시간부터 응답을 받을 때까지의 모든 시간 |
서버의 성능을 측정하는데 있어서 가장 대표적으로 사용하는 항목 | Network Time + Transaction Time |
동시 사용자가 증가하더라도 단위 시간 당 처리 건수, 즉 TPS는 변경되지 않음(따라서 서버 측정 기준으로 TPS 사용) | 시스템에서 처리할 수 있는 한계치 이상으로 동시 접속자가 늘어날 경우 평균 응답 시간은 점점 증가 |
Java의 성능 튜닝
Java의 경우 GC 알고리즘 처리 방식으로 인해 목적에 따라 Throughput(처리량) 또는 Response(응답속도) 관점에서 튜닝을 한다.
Throughput 관점 GC | Response 관점 GC |
주어진 시간 내에 최대한 많은 일을 처리하는 것을 목적으로 하는 GC | 요청에 대한 응답시간 측면에서 성능을 높이기 위한 GC |
대표 GC 알고리즘: Perallel GC | 대표 GC 알고리즘: CMS GC, G1 GC |
GC 알고리즘 선택
성능의 관점이 처리량 혹은 응답시간등 상대적인 개념이기 때문에 최고 성능의 GC 알고리즘이란 운용 환경에 가장 적합한 GC 알고리즘을 선택하는 것임
GC 알고리즘 | 내용 |
Parallel GC | - '처리량'이 중요한 시스템에서 주로 사용 - Full GC 수행 시 compaction 작업이 수행되기 때문에 GC 시간 자체는 많이 소요되나 일정한 멈춤 시간을 제공함 |
CMS GC | - 응답시간이 중용한 시스템에사 주로 사용 - compaction 미수행으로 Stop-The-World 시간은 짧으나 자주 Compaction이 발생하는 시스템의 경우 오히려 Full GC 보다 Compation 시간이 오래 걸릴 수 있음 - 자원 사용량이 증가하는 점도 고려해야 함 |
G1 GC | - 성능적으로 가장 우수한 GC 방식이나, JDK 7 버전부터 정식 제공되었으며, Java 9 에서 Default GC 방식으로 채택 |
메모리의 크기 설정
JVM의 메모리의 크기는 GC 발생 횟수와 수행 시간에 영향을 끼치기 때문에 성능과 밀접한 관계가 있다.
메모리 크기 시나리오 | 내용 |
메모리 크기가 클 경우 | - GC 발생 횟수 감소 - GC 수행 시간 증가 |
메모리가 작은 경우 | - GC 발생 횟수 증가 - GC 수행 시간 감소 |
New 영역 크기가 작은 경우 | - Old 영역으로 메모리가 많이 넘어가 GC 발생횟수 및 수행 시간 증가 |
위 표와 같이 메모리 크기는 그 사이즈 설정에 따른 트레이드오프(Trade Off) 성격이 있기 때문에 다음과 같이 적용하는 것이 바람직하다. 즉, 서버의 성능에 따라, 사용하는 객체의 크기에 따라 실제 소요시간이 다르게 나타날 수 있음. 따라서 모니터링 및 성능테스트 작업 등을 통해 최적의 값을 찾아서 적용하는 것을 고려해야 함
Java 메모리 구조의 이해
이 블로그에선 아래와 같이 몇 번에 걸쳐 JVM 메모리 구조는 설명을 했다.
JVM 구조에 대해 좀더 깊은 이해가 필요한 분은 시간이 날때 위 링크의 내용을 참조하기 바란다.
JVM 구조
Java Memory 튜닝을 위한 영역별 설정 값
Heap Memory 최대값/최소값 설정
- Java 객체가 생성, 실행, 보관되는 실질적인 영역에 대한 튜닝
- -Xms를 통해 최소(기본) Heap Memory 영역과 -Xmx를 통해 Reserved(예약) 영역을 설정해 -Xms가 모두 소진되었을 경우 확장 할 수 있는 영역 예약
- 설정 시 주의사항
- 최소값의 경우, 평상시 할당하는 Heap 크기와 동일하게 설정 (불필요한 리소스 사용을 줄이기 위해서)
- 최소값과 최대값을 다르게 가져가야 하는 경우
- Heap 사용량을 모니터링 해보았을 때 최소값에 가까운 사용량을 보이다가 특정 시점에 한 번씩 증가하는 시스템
- 최소값과 최대값을 같게 가져가야 하는 경우
- Heap size 확장이 자주 발생하는 시스템
- 기동 후 할당된 Heap Size 를 조절할 필요가 없어 부수적인 리소스 낭비를 줄일 수 있음
- 다만 최소값이 커지면서 WAS 인스턴스 기동 및 Full GC 시간이 더 오래 걸리는 단점이 발생할 수 있음
Heap Memory - New 영역크기지정
New 영역 설정 값 | 내용 |
-XX:NewSize | - New 영역 크기 설정 - e.g. -XX:NewSize=512m |
-XX:MaxNewSize | 최대 New 영역 크기 설정 - e.g. -XX:MaxNewSize=1024m |
-XX:NewRatio | 전체 Heap 크기 중 New 영역과 Old 영역의 비율 - e.g. -XX:NewRatio=2 → New:Old 비율이 1:2 라는 의미 |
- NewRatio와 NewSize 두 항목을 동시에 지정했을 때는 두 값 중 큰 값을 사용
- 대부분의 객체는 생존 기간이 길지 않기 때문에 New 영역의 크기 지정이 GC 전반적인 성능에 영향 줌
- New 영역은 일반적으로 기본 전체 영역의 10% 이상으로 설정
- New 영역이 작은 경우, Old 영역으로 넘어가는 메모리의 양이 많아 Full GC가 자주 발생하며 시간도 오래 걸림
- New 영역이 지나치게 클 경우 오히려 응답 반응성이 떨어질 수 있는 문제가 발생
- JVM 에서 공식적으로 제공하는 OS 별 NewRatio 값 참고
끝
'Middleware > Tuning' 카테고리의 다른 글
Java GC 알고리즘 및 주요 옵션 (0) | 2021.07.28 |
---|---|
Java Heap 메모리 옵션 (2) | 2021.07.26 |
Java JVM 구조 (0) | 2021.07.26 |