Optimizing Java - 성능 개요
1. 자바의 성능
1) 성능 개요
자바 성능의 본질을 이해하려면 자바의 철학을 이해할 필요가 있다. 자바는 지극히 실용적인 언어로 개발자의 생산성을 높이고 어느정도 성능 희생은 감수하도록 설계되었다. 가비지 콜렉터(Garbage Collector) 등 아주 방대한 서브시스템이 개발자 대신 저수준의 기능을 관리한다.
이러한 거대한 구조로 인해 직접 하나하나 뜯어보며 성능을 파악하기보다는 실험을 통해 통계치를 내어 성능을 측정하고 개선하게 된다.
성능 분석은 닭을 해부해보거나 점을 치는 과정이 아니라 통계치에 근거해 적절히 결과를 처리하는 활동
2) 성능 측정
이처럼 상당히 복잡한 JVM의 성능 양상을 측정하고 개선하는 과정은 일종의 실험과학으로 진행된다.
- 원하는 결과를 정의
- 기존 시스템을 측정
- 요건을 충족하기 위한 방법 정의
- 개선
- 개선된 시스템을 측정(테스트)
- 목표가 달성되었는지 판단
성능이 개선되었는지 판단하기 위해서는 실험을 통한 정량 평가가 매우 중요할 것이다.
2) 성능 지표
비기능 요구사항(Non Functional Requirements) 중 성능을 측정하기 위한 일반적인 지표들은 다음과 같다.
(1) 처리율(Throughput)
기준 시간 당 처리한 작업 수이다. 의미있는 처리율을 산정하기 위해서는 실험을 진행하는 플랫폼에 대한 기술과 함께 실험에서 제공하는 작업 또한 동일해야 한다. 예를 들어 개선 전과 개선 후 얼마나 많은 트랜잭션을 처리할 수 있는지 처리율을 계산하고자 할 때에는 동일한 플랫폼에서 동일한 부하의 작업을 수행해야 할 것이다.
(2) 지연(Latency)
하나의 작업이 끝나는데(요청을 보내고 응답을 받을 때까지) 소요되는 시간을 의미한다.
(3) 용량(Capacity)
시스템이 동시에 처리할 수 있는 작업 수를 말한다. 시스템이 보유한 병렬 처리 능력을 측정하는 지표이기 때문에 일반적으로 특정 처리율과 지연을 전제로 하고 표시한다. 동일한 병렬 구조에 처리율이 높고 지연이 낮다면 당연히 동시에 처리할 수 있는 작업 수는 늘어나기 때문에 미리 고정을 한다.
(4) 사용률(Utilization)
시스템 리소스를 얼마나 효율적으로 사용하는지 확인할 수 있는 지표이다. 작업의 특성에 따라 리소스별로 사용률이 달라질 수 있는데 계산 집약적인 워크로드는 CPU 사용률은 100%에 가깝지만 메모리 사용률이 작을 가능성이 높다.
(5) 효율(Efficiency)
효율 = 처리율(Throughput) / 리소스 사용률(Utilization)
동일한 리소스로 얼마나 많은 작업을 처리할 수 있는지 확인할 수 있는 지표이다. 동일한 작업 수(처리율)에 CPU 리소스를 많이 사용한다면 효율이 낮다. 반대로 동일한 CPU 리소스에 많은 작업을 할 수 있다면 효율이 높을 것이다.
(6) 확장성(Scalability)
리소스를 투입할 때 처리율이 어떻게 변경되는지 확인할 수 있는 지표이다. 서버 리소스를 두 배 증가할 때 실제 처리율 또한 두 배 늘었다면 이상적인 선형 확장을 달성한 시스템이다. 하지만 여러 요소로 인해 어느 정도까지 리소스를 확장하면 확장성이 감소하게 된다.
(7) 저하(Degradation)
기존 시스템의 리소스 사용률이 높다면(부하를 많이 받는다면) 더 많은 작업을 받을 때 처리율이 더 늘어나지 않고 지연이 증가하는 상태를 저하라고 한다.
3) 측정값 사이의 연관 관계
처리율과 지연, 사용률은 서로 상호작용하고 있으며 이러한 양상은 시스템의 부하에 따라 달라질 수 있다. 현재 부하가 적은 상태라면 처리율과 사용률은 늘어나고 지연은 큰 변화가 없지만 부하가 많은 상태라면 처리율과 사용률은 크게 늘어나지 않고 지연이 증가할 수 있다.
부하가 증가할 때 시스템의 리소스가 변화하는 시스템이라면 오히려 더 많은 요청이 오더라도 지연이 감소할 수 있다. 수평 확장(고가용성 시스템)이나 캐싱(JIT 컴파일러) 등을 활용할 때 이러한 효과를 확인할 수 있다.