이글은, 오라일리 사의 Optimizing Java 책을 참고하여, 정리한 내용이다.
성능과 최적화
Java 성능 최적화의 원칙
- JVM을 더 빨리 작동시키는 '마법의 스위치' 같은건 없다.
- 자바를 더 빨리 실행하게 만드는 '팁, 트릭'은 없다.
- 여러분이 못 보게 꼭꼭 숨겨둔 '비밀 알고리즘' 같은건 없다.
성능 향상을 위한 활동
- 원하는 결과를 정의한다.
- 기존 시스템을 측정한다.
- 요건을 충족시키려면 무슨 일을 해야 할지 정한다.
- 개선 활동을 추진한다.
- 다시 테스트한다.
- 목표가 달성됐는지 판단한다.
성능 분석은 비기능 요건을 정의 하고 달성하는 활동
성능 분류
모든 지표가 동시에 최적화되는 경우는 거의 없다.
처리율?
-
처리율(throughtput)은 시스템이 수행 가능한 작업 비율을 나타낸 지표. 보통 일정 시간 동안 완료한 작업 단위 수로 표시
예) 초당 처리 가능한 트랜잭션 수.
-
수치를 얻은 기준 플랫폼에 대한 내용또한 기술해야, 의미있는 지표가 된다.
예) 하드웨어 스팩, OS, 소프트웨어 스택 등
-
1초에 100리터를 흘려보내는 수도관의 처리율은, 100리터 이다.
지연?
지연(Latency)는 1초에 100리터를 흘려보내는 수도관의 길이를 의미한다.
- 즉, 하나의 트랜젝션을 처리하고 그 결과를 반대편 수도관 끝에서 바라볼때 까지 소요된 시간이다.
용량?
용량(capacity)는 시스템이 보유한 작업 병렬성의 총량을 의미한다
- 즉 시스템이 동시 처리 가능한 작업단위 (트랜젝션) 개수를 말한다.
- 용량은 처리율과, 지연과 밀접한 연관이 있다.
- 따라서, 용량은 처리율 또는 지연 값을 전제로 가능한 처리량으로 표시한다.
사용률
성능 분석 업무 중 가낭 흔한 태스크는 시스템 리소스를 효율적으로 활용하는 것이다.
- 예로 CPU라는 리소스는 놀리는(OS에 시간을 뺏기거나, 다른 태스크를 수행하거나) 것보다, 실제 작업 단위를 처리하는데 쓰이는게 온당할 것이다.
사용률(utilization)은 워크로드에 따라서 리소스 별로 들쑥날쑥할 수 있다.
- 워크로드 : 시스템이 주어진 시간 내에 처리해야 할 작업 할당량
- 예) 그래픽 처리, 암호화 등의 워크로드를 할당하면 CPU 사용률을 100%에 육박하지만, 메모리 사용률은 얼마 안나올 것이다.
효율
효율(efficiency은 처리율을 리소스 사용률로 나눈 값이다.
처리율이 높을 수록 효율적이고, 리소스 사용률이 높을 수록 비효율적이다.
확장성
처리율이나, 시스템 용량은 처리하는데 끌어 쓸 수 있는 리소스에 달려있다.
리소스 추가에 따른 처리율 변화는 시스템/애플리케이션의 확장성(scalability)을 가늠하는 척도이다.
시스템 확장성은 정확히 리소스를 투입한 만큼 처리율이 변경되는 형태를 지향한다.
성능 그래프 읽기

- 그래프처럼, 부하 (Users)가 증가하면서, 예기치 않게 저하, 지연 (Response Time)이 발생하는 그래프.
2. near-linear

- 1과 반대로, 클러스터에 장비를 추가함으로써 선형적으로 처리율이 확장되는 그래프. 이상적이고 운이 아주 좋은 그래프
- 이런 결과는 환경이 극단적으로 순조로울 경우에 가능하다.
- 예시) 서버 하나에, Session affinity가 필요없는 무상태 프로토콜을 확장하는 경우 등
- Session Affinity : 로드밸런서가 사용자 세션을 특정 서버(인스턴스)에 고정되도록 하는 바인딩 기술.
3. 암달의 법칙

- 태스크를 처리할 때 프로세서 개수를 늘려도 실행 속도를 최대 실행 속도를 최대 어느 정도 높일 수 있는가에 대한 그래프
- 세로축 : 시간 단축 (배율)
- 가로축 : 프로세스 (개수)
- 즉, 프로세서 개수에 따라, 시간 단축이 얼만큼 되는지에 대한 그래프이다.
- 하부 태스크를 95% 병렬화 (순차비율 5%) 하여 작업을 진행하는 경우에도, 12배의 시간을 단축하려면 프로세서가 32개나 필요하다 라는걸 확인 할 수 있다.
- 실제로는 순차 비율이 5% 보다 훨씬 높은 알고리즘이 태반이라, 최대 속도 향상은 더욱 제약받는다.
즉, 하드웨어 (프로세서)를 늘려 성능 최적화를 이루기에는 임계점도, 한계점도 명확하다 라는걸 확인 할 수 있다.
JVM 메모리 사용 그래프

메모리 할당률 분포 (Feat : 피보나치 수열)

- 해당 그래프는 피보나치 수열을 계산하는 애플리케이션을 실행하여 얻은 그래프이다.
- 메모리 할당률은 성능 튜닝할 때 아주 중요한 그래프이다.
- 90초쯤, 할당률이 급격하게 떨어지고 있다.
- 이 그래프에서는 나오지 않지만, 다른 그래프를 통해, 이 지점에서 애플리케이션에 가비지 수집 문제가 발생했고, GC Thread 들이 CPU 경합을 벌여, 메모리를 충분히 할당받지 못했다는 사실을 확인 할 수 있었다.
- 또한, 할당 서브시스템도 4GB/s 라는 미친 속도로 메모리를할당 하고 있었다.
즉, 문제가 있는 할당률 분포라는 것이다.
리소스 누수 징후 그래프

- 초당 트랜잭션 수가, 증가할때마다 지연 시간이 급격하게 나빠진다.
마무리
- 이번글은, 자바에 대한 성능 최적화 방법이나, 문제 도출 보다는, 성능이란 무엇인지에 대해서 알아보았다. (용어, 측정값, 그래프 등)
- 다음부터는 JVM에 대해서 깊게 살펴보겠다.