자바 최적화 chap 1. 성능과 최적화

YeJI Kang·2021년 4월 11일
0
post-thumbnail

1.1 자바 성능: 잘못된 방법

자바 초창기에 메서드 디스패칭 성능은 정말 최악이었기 때문에, 메서드를 잘게 나누지 말고 하나의 덩치 큰 메서드로 작성하는게 좋다고 권고하는 개발자가 있었다. 하지만, 최신 자바 가상 머신 (Java Virtual Machine)에서는 자동 인라이닝을 지원하기 때문에 '모든 코드를 한 메서드에 욱여넣어라' 라는 말은 JIT 컴파일러와 어울리지 않는 퇴물이 되었다.

모든 최적화 기법에는 개발자가 사용하기 전에 알아야 할 함정과 트레이드 오프가 도사리고 있으니 조심해야 한다. 아래의 내용을 명심하자.

  • JVM을 더 빨리 작동시키는 '마법 스위치' 같은 것은 없다.
  • 자바를 더 빨리 실행하게 만드는 '팁, 트릭'은 없다.
  • 여러분이 못 보게 꼭꼭 숨겨둔 '비밀 알고리즘' 같은 것도 없다.

1.2 자바 성능 개요

자바는 블루 칼라(주로 생산직에 종사하는 육체 노동자) 언어입니다. 박사 학위 논문 주제가 아니라 일을 하려고 만든 언어죠.

  • 제임스 고슬링, 자바 창시자

자바는 처음부터 아주 실용적인 언어이다. 개발 생산성이 높아지면 성능 희생은 감수할 만하다는 입장이다.

서브시스템(managed subsystem)이 가장 대표적인 예이다. 가비지 수집 서브 시스템으로 개발자는 메모리를 의식할 필요 없이 개발을 할 수 있다.

이러한 자바의 시스템 때문에 자바는 런타임 동작이 복잡하고, 이를 측정하는 데에도 기초 통계 기법만 가지고는 분석하기 어렵다. 그리고 필자는 자바 성능 측정값 때문에 판단이 흐려지기 쉬우므로 조심해야 한다고 당부한다.

1.3 성능은 실험과학이다

JVM 성능 튜닝의 목표는 시스템 유저가 추구하는 측정 결과를 얻는 것이다. 아래의 원칙을 기억하자.

  • 원하는 결과를 정의한다.
  • 기존 시스템을 측정한다.
  • 요건을 충족시키려면 무슨 일을 해야 할지 정한다.
  • 개선 활동을 추진한다.
  • 다시 테스트한다.
  • 목표가 달성됐는지 판단한다.

즉, 적량적인 일련의 목표가 수립되어야 한다.

1.4 성능 분류

기본적인 JVM 성능 지표에 대해서 알아보자.

  • 처리율(throughput) : 서브 시스템이 수행 가능한 작업 비율을 나타낸 지표이다. 보통 일정 시간동안 완료한 작업 단위 수로 표시한다.
  • 지연(latency) : 하나의 트랜잭션을 처리하기까지 소요된 시간을 표현한다.
  • 용량(capacity) : 시스템이 동시에 처리가 가능한 작업단위(트랜잭션)의 개수를 뜻한다.
  • 사용률(utilization) : 워크로드에 따라 사용되는 리소스의 사용률을 뜻한다.
  • 효율(efficiency) : 처리율을 리소스 사용률로 나눈 값이다.
  • 확장성(scalability) : 시스템 확장성은 궁극적으로 리소스를 투입한 만큼 처리율이 변경되는 형태를 지향한다.
  • 저하(degradation) : 시스템이 풀 가동된 상태일 때, 처리율일 더 이상 늘지 않는 지연이 증가하는 형태를 뜻한다.

위의 성능 측정값은 어떤 식으로든 서로 연결되어 있어 서로 영향을 준다.

1.5 성능 그래프 읽기

아래 그래프는 부하가 증가하면서 예기치 않게 저하가 일어난 그래프로, 성능 엘보(performance elbow)라고 한다.

이를 해결하기 위해 클러스터 장비를 추가하면 선형적으로 문제를 해결할 것 같지만, 실제로는 그렇지 않다. 암달의 법칙(Amdal's Law)에 의하면 프로세스 개수에 대한 시간 단축 그래프는 아래와 같다.

profile
재밌는 것만 하고 싶어 ʕ•ﻌ•ʔ

0개의 댓글