성능 최적화란? 용어 정리 Optimizing Java #1

BaekGwa·2024년 8월 8일

Optimizing Java

목록 보기
1/5
post-thumbnail

이글은, 오라일리 사의 Optimizing Java 책을 참고하여, 정리한 내용이다.

성능과 최적화

Java 성능 최적화의 원칙

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

성능 향상을 위한 활동

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

성능 분석은 비기능 요건을 정의 하고 달성하는 활동

성능 분류

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

모든 지표가 동시에 최적화되는 경우는 거의 없다.

처리율?

  • 처리율(throughtput)은 시스템이 수행 가능한 작업 비율을 나타낸 지표. 보통 일정 시간 동안 완료한 작업 단위 수로 표시
    예) 초당 처리 가능한 트랜잭션 수.

  • 수치를 얻은 기준 플랫폼에 대한 내용또한 기술해야, 의미있는 지표가 된다.
    예) 하드웨어 스팩, OS, 소프트웨어 스택 등

  • 1초100리터를 흘려보내는 수도관의 처리율은, 100리터 이다.

지연?

  • 지연(Latency)1초100리터를 흘려보내는 수도관의 길이를 의미한다.
  • 즉, 하나의 트랜젝션을 처리하고 그 결과를 반대편 수도관 끝에서 바라볼때 까지 소요된 시간이다.

용량?

  • 용량(capacity)는 시스템이 보유한 작업 병렬성의 총량을 의미한다
  • 즉 시스템이 동시 처리 가능한 작업단위 (트랜젝션) 개수를 말한다.
  • 용량은 처리율과, 지연과 밀접한 연관이 있다.
  • 따라서, 용량은 처리율 또는 지연 값을 전제로 가능한 처리량으로 표시한다.

사용률

  • 성능 분석 업무 중 가낭 흔한 태스크는 시스템 리소스효율적으로 활용하는 것이다.
  • 예로 CPU라는 리소스는 놀리는(OS에 시간을 뺏기거나, 다른 태스크를 수행하거나) 것보다, 실제 작업 단위를 처리하는데 쓰이는게 온당할 것이다.
  • 사용률(utilization)은 워크로드에 따라서 리소스 별로 들쑥날쑥할 수 있다.
    • 워크로드 : 시스템이 주어진 시간 내에 처리해야 할 작업 할당량
  • 예) 그래픽 처리, 암호화 등의 워크로드를 할당하면 CPU 사용률을 100%에 육박하지만, 메모리 사용률은 얼마 안나올 것이다.

효율

  • 효율(efficiency처리율리소스 사용률로 나눈 값이다.
  • 처리율이 높을 수록 효율적이고, 리소스 사용률이 높을 수록 비효율적이다.

확장성

  • 처리율이나, 시스템 용량은 처리하는데 끌어 쓸 수 있는 리소스에 달려있다.
  • 리소스 추가에 따른 처리율 변화는 시스템/애플리케이션의 확장성(scalability)을 가늠하는 척도이다.
  • 시스템 확장성은 정확히 리소스를 투입한 만큼 처리율이 변경되는 형태를 지향한다.

성능 그래프 읽기

1. 성능 엘보 (Performance elbow)

  • 그래프처럼, 부하 (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에 대해서 깊게 살펴보겠다.
profile
현재 블로그 이전 중입니다. https://blog.baekgwa.site/

0개의 댓글