ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JVM Warm-up 이란
    Java/자바를 더 깊게 2023. 9. 9. 00:01
    728x90

    JVM Warm-up 이란?

    warm-up은 흔히 워밍업으로 우리가 알고 있으며 몸풀기 준비운동이라는 뜻입니다.

     

    그렇다면 JVM의 준비운동은 어떤것을 의미할까요?

     

    이를 이해하기 위해서는 자바언어의 컴파일 과정을 알아볼 필요가 있습니다.

     

    자바 언어의 컴파일 과정

    JVM 실행 전

    1) 소스 코드인 .java 파일을 바이트 코드인 .class 파일로 변환합니다.

     

     

    JVM 실행 후

    2) 클래스를 사용하는 시점에 클래스 로더가 lazy loading을 수행합니다.

    3) 로딩된 클래스를 OS가 이해할 수 있는 기계어로 변환합니다.

     

    즉, 클래스가 실제로 사용되는 시점에 기계어로 변환됩니다.

     

    새로운 버전의 애플리케이션을 배포한 직후에는 대부분의 클래스들이 사용되지 않았기 때문에 메모리에 적재되지 않은 상태이며 응답지연이 발생하게 됩니다.

     

    컴파일 시 단점을 보완하기 위해 JIT 컴파일러 사용

    JIT 컴파일러는 바이트 코드를 기계어로 변환하는 과정에서 캐시를 이용하는 방식입니다.

     

    그에 더해 런타임 환경에 맞춰 코드도 최적화함으로써 성능을 향상합니다.

     

    하지만 모든 바이트코드를 기계어로 변환하는데 애플리케이션 기동시간이 오래 걸리기 때문에 기동시간과 최적화 사이의 밸런스를 잘 맞추어야 합니다.

     

    JIT 컴파일러는 자주 실행된다고 판단되는 특정 부분만 기계어로 컴파일하고 이 부분을 핫스팟이라 부릅니다.

     

    문제는 애플리케이션이 처음 기동될 때 캐싱된 기계어가 없고 응답 지연이 발생할 수 있습니다.

     

    따라서 애플리케이션 시작 후 강제로 로직을 호출하여 기계어를 캐싱해 두는 작업이 필요한데, 이를 warm-up이라고 합니다.

     

    라인 기술블로그의 사례에서는 애플리케이션 배포초기에 응답속도가 지연되어 평균 응답 속도에 비해 6배 정도 느렸다고 합니다.

     

    실제 마주한 사례로 Reflection을 활용하는 기능에서 새로운 배포가 발생했을 때 3초 정도의 지연이 발생한 적이 있었고 해당원인을 추적해 보니 새로운 배포시점에 응답지연으로 인해 발생하였습니다.

     

    JIT 컴파일러의 내부 동작 (C1 컴파일러, C2 컴파일러)

    JIT 컴파일러의 내부동작을 살펴보면 최적화 수준에 따라 복수개의 단계로 구성되며 이를 Tiered Compliation이라 부릅니다.

     

    C1 컴파일러는 빠르지만 제한된 수준으로 최적화를 수행합니다. (기본값 1500회)

     

    C2 컴파일러는 코드가 더 많이 호출되어야 하지만 더 높은 수준으로 최적화를 수행합니다. (기본값 10000회)

     

    JVM Warm-up 수행방법

    이제 원인을 파악했으니 2가지 해결책을 수행해야 합니다.

    1. 클래스를 메모리에 적재해주어야 한다.
    2. 바이트코드가 최적화된 기계어로 변환되어야 한다.

    이를 요약하자면 런타임에 의도적으로 코드들을 호출해주어 최적화를 수행해주어야 합니다.

     

    예를 들어 아래와 같은 방법을 활용해 볼 수 있습니다.

    1. Spring의 ApplicationRunner 등을 이용해 스프링 애플리케이션 기동 시 특정 코드를 실행할 수 있도록 구성할 수 있습니다.

    2. 카나리배포를 활용하여 새로운 애플리케이션에 트래픽을 조금씩만 흘려주면서 warm-up을 수행되기 전에는 모든 트래픽을 처리하지 않도록 할 수 있습니다.

    3. 쿠버네티스와 결합하여 Spring Actuator의 커스텀 HealthIndicator를 활용하여 웜업 상태 진단 기능도 제공할 수 있습니다.

     

    이때 warm-up을 적용함에 따르는 트레이드오프를 잘 고려해주어야 합니다.

     

     

    Warm-up을 수행할 때 고려해 볼 트레이드오프

    1. 실제 기능은 잘 동작하지만, 웜업에 실패하는 경우 배포가 안될 수 있습니다.

     

    2. 외부 호출이 포함되는 경우에 동시에 수많은 호출로 외부 시스템을 망가뜨리는 DDos 공격과 비슷한 현상이 발생할 수 있습니다.

     

    3. 애플리케이션의 새로운 버전을 배포할 때 등의 애플리케이션 구동 시간이 늘어날 수 있습니다.

     

     

     

     

     

     

    참고자료

    https://mangkyu.tistory.com/232

    https://jerry92k.tistory.com/65

    https://junuuu.tistory.com/126

    https://engineering.linecorp.com/ko/blog/apply-warm-up-in-spring-boot-and-kubernetes

    https://devwithpug.github.io/project/randhand-4-jvm-warmup-on-spring-cloud-msa/

    https://hudi.blog/jvm-warm-up/

     

    댓글

Designed by Tistory.