Post

성능과 최적화

1. 성능과 최적화

1.1 자바 성능: 잘못된 방법

과거에는 메서드를 분리하지 않는 것이 성능에 좋다고 함 -> 현재와는 전혀 다름

자바 코드가 실행되는 속도는 매우 변화무쌍하며 전적으로 코드를 실행하는 하부 JVM에 따라 다름

우수한 성능 목표를 달성하기 위해 필요한 여러 가지 단면을 종합적으로 집중 소개

  • 전체 소프트웨어 수명주기의 성능 방법론
  • 성능과 연관된 테스트 이론
  • 측정, 통계, 툴링(도구선정)
  • (시스템 + 데이터) 분석 스킬
  • 하부 기술과 메커니즘

모든 최적화 기법에는 개발자가 사용하기 전에 알아두어야 할 함정과 트레이드오프(trade-off)가 도사리고 있으니 조심!!

일반적인 원칙

  • JVM을 더 빨리 작동시키는 ‘마법의 스위치’같은 건 없습니다.
  • 자바를 더 빨리 실행하게 만드는 ‘팁,트릭’은 없습니다.
  • 꼭꼭 숨겨둔 ‘비밀 알고리즘’같은 것도 없습니다.

1.2 자바 성능 개요

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

자바는 지극히 실용적인 언어

서브시스템(managed subsytem): 개발자가 일일이 용량을 세세하게 관리하는 부담을 덜어주고, 대신 저수준으로 제어 가능한 일부 기능을 포기

ex. 메모리 관리: JVM이 탈착형 가비지 수집 서브시스템 형태로 메모리를 자동 관리하는 덕분에 프로그래머는 수동으로 메모리를 의식하며 개발할 필요가 없습니다.

자바 성능 측정값 때문에 판단이 흐려지기 쉬우므로 조심해야 함

측정하는 행위 자체도 오버헤드를 일으키며, 너무 자주 샘플링하거나 매번 결과를 기록하는 것 역시 성능 결과 수치에 적잖은 영향을 끼침

1.3 성능은 실험과학이다

JVM도 다른 복잡한 고성능 시스템처럼 최상의 성능을 발휘하려면 어느 수준 이상의 스킬과 경험이 필요

JVM 성능 튜닝은 기술, 발법론, 정량적 측정값, 툴을 망라한 개념

목표는 시스템 소유자/유저가 추구하는 측정 결과를 얻는 것

즉, 성능은 다음과 같은 활동을 하면서 원하는 결과를 얻기 위한, 일종의 실험과학

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

성능 분석은 통계치에 근거해 적절히 결과를 처리하는 활동

1.4 성능 분류

기본 성능 지표

  • 처리율
  • 지연
  • 용량
  • 사용률
  • 효율
  • 확장성

1.4.1 처리율

시스템이 수행 가능한 작업 비율을 나타낸 지표

보통 일정 시간 동안 완료한 작업 단위 수

처리율이 실제 성능을 반영하는 의미 있는 지표가 되려면 수치를 얻은 기준 플랫폼에 대해서도 내용을 기술해야 함

1.4.2 지연

하나의 트랜잭션을 처리하고 그 결과를 반대편 수도관 끝에서 바라볼 때까지 소요된 시간(주로 수도관에 비유함 == 수도관 길이)

지연을 종단 시간이라고도 하며, 대개 그래프에서 워크로드에 비례하는 함수로 표시

1.4.3 용량

시스템이 동시 처리 가능한 작업 단위(트랜잭션) 개수

용량은 처리율/지연과 밀접한 연관

그래서 보통 용량은 어떤 처리율 또는 지연 값을 전제로 가능한 처리량으로 표시

1.4.4 사용률

사용률은 워크로드에 따라서 리소스별로 들쑥날쑥 할 수 있다.(ex. 계산집약적 워크로드에서는 CPU 사용률은 100%에 육박하지만, 메모리사용률은 얼마 안 나옴)

1.4.5 효율

처리율을 리소스 사용률로 나눈 값으로 측정

1.4.6 확장성

리소스를 투입한 만큼 처리율이 변경되는 형태

1.4.7 저하

시스템이 더 많은 부하를 받으면 지연/처리율 측정값에 변화가 생김 -> 저하

1.4.8 측정값 사이의 연관 관계

다양한 성능 측정값은 어떤 식으로든 서로 연결돼 있다.

1.5 성능 그래프 읽기

성능 엘보

부하가 증가하면서 예기치 않게 저하가 발생한 그래프

준 선형적(near-linear) 확장

클러스터에 장비를 추가함에 따라 거의 선형적으로 처리율이 확장되는 케이스

ex. 서버 하나에 세션 어피니티(session affinity)가 필요없는, 무상태 프로토콜(stateless protocol)을 확장하는 경우

세션 어피니티(session affinity): 로드 밸런서가 사용자 세션은 특정 서버에 고정되도록 바인딩하는 기술

무상태 프로토콜(stateless protocol): 어떠한 이전 요청과도 무관한 각각의 요청을 독립적인 트랜잭션으로 취급하는 프로토콜, 통신이 독립적인 쌍의 요청과 읍담을 이룰수 있게 하는 방식(ex. IP, HTTP)

최선의 경우라도 사실상 선형 확장은 불가능

부하가 높을 때 상당한 지연 발생

부하가 증가하면서 시스템이 악화되다가 결국 시스템 성능이 급락하는 변곡접에 이르게 됨

참조

  1. Optimizing Java(자바 최적화)
This post is licensed under CC BY 4.0 by the author.