[아줄=사이먼 리터(Simon Ritter) Java Champion & Deputy CTO] 많은 기업이 클라우드에서 하나 이상의 자바 애플리케이션을 실행하고 있으며 이슈는 항상 존재한다. 클라우드, 특히 쿠버네티스(Kubernetes, k8s)와 같은 리소스 관리자에서 자바를 실행하는 데는 여러 가지 복잡한 문제가 있다. 높은 리소스 사용량과 비효율적인 비용 관리는 로드 프로필에 따라 신속하게 확장‧축소할 수 없기때문에 직접적으로 발생한다.

문제를 완화하려면 일반적으로 집중적인 엔지니어링 노력이 필요하다. 특히 클라우드 네이티브 JVM은 리소스를 확장해 성능을 개선하고 비용을 절감하는 데 도움이 될 수 있다.

[사진=게티이미지뱅크]
[사진=게티이미지뱅크]

◆ 클라우드에서 자바의 ‘숨겨진 비용’

자바 클라우드 문제의 가장 큰 원인은 자바 및 기타 JVM 기반 언어의 가장 큰 강점인 JIT(Just-In-Time) 컴파일러이다.

자바는 네이티브 머신 코드로 직접 컴파일되지 않았고 JIT 컴파일러가 이를 수행합니다. 작동 방식을 설명하면 자바는 중간 바이너리 바이트코드로 컴파일된다. JVM은 바이트코드를 연산별로 해석해 성능 프로필 및 실행 통계와 같은 런타임 정보를 수집한다. JIT 컴파일러는 이러한 성능 데이터를 사용해 바이트코드를 실행 중인 플랫폼에 최적화된 네이티브 머신 코드로 컴파일한다.

지나치게 복잡한 설계처럼 들리지만 런타임 환경을 최대한 활용하고, 새로운 JVM 버전으로 동일한 애플리케이션이 재컴파일 없이 사용할 수 있는 새로운 최적화를 제공한다. 자바 서비스와 애플리케이션의 빠른 실행을 가능하게 한다.

그러나 이 컴파일 프로세스는 쿠버네티스와 같은 최신 환경에서는 가장 큰 장애물이기도 하다. k8s는 로드 프로파일이 허용하는 경우 서비스 인스턴스 수를 축소하거나 확장한다. 서비스 인스턴스의 임시적인 특성은 애플리케이션 환경이 많은 리소스를 점유하는 것을 방지하는 데 도움이 된다. 이 경우 JVM의 워밍업이 느리기 때문에 JVM이 요청을 최대한 처리할 준비가 될 때까지 시간이 걸린다.

물론 해결 방법은 있다. 일부 기업에서는 실제 데이터를 새로운 프로세스에 공급해 성능 프로필과 JIT 컴파일러를 인위적으로 워밍업하지만 문제의 여지가 있다. 사용되지 않거나 향후 워크로드에 적합하지 않은 프로필로 성능을 워밍업해야 하는 등 더 많은 방법을 찾아야 한다.

◆ 적시 컴파일 대안 ‘AOT‧JAOTC’

적시 컴파일의 한 가지 대안은 AOT(ahead-of-time) 컴파일로 C/C++ 또는 Go와 같은 고유하게 컴파일된 프로그래밍 언어의 개념과 유사하다. AOT 컴파일러는 자바 바이트코드를 가져와서 선택한 대상 환경(예: x64/Linux)에 따라 기본 실행 파일로 컴파일한다.

두 번째 접근 방식은 지정된 자바 클래스 파일에 있는 자바 메소드에 대한 공유 라이브러리 형태의 네이티브 코드를 생성하는 자바 AOT 정적 컴파일러인 JAOTC 명령이다. JVM은 이러한 AOT 라이브러리를 로드하고 해당 자바 메소드가 호출될 때 해당 네이티브 코드를 사용할 수 있다. 현재 JAOTC는 OpenJDK에서 삭제된 상태다.

AOT 접근 방식은 JVM 워밍업 시간을 단축하지만, 현재 CPU 플랫폼에 기반한 특정 최적화에 따른 동적 컴파일이라는 JVM 언어의 가장 큰 이점을 약화시킨다. AOT의 더 일반적인 문제는 런타임에 실제 성능 프로파일에 적합한 프로파일이 아닌 모든 것이 동등한 컴파일 중에 일반 성능 프로파일을 사용해야 한다는 것이다. 이는 네이티브 컴파일 시점에는 존재하지 않는다.

그러나 새로운 접근 방식은 자바를 클라우드 이전 아키텍처에서 클라우드 네이티브 기술로 전환한다.

◆ 자바의 리소스 사용 최적화

새로운 자바 SE 호환 JVM 구현에는 k8과 같은 리소스 관리 환경 시대에 맞춰 자바를 중심으로 구축된 기능이 포함돼 있다.

일부 JIT 컴파일러는 독립형 기능으로 작동하며, 애플리케이션과 함께 쿠버네티스에 배포된 여러 JVM에 JIT 컴파일 서비스를 제공한다. 동일한 서비스의 여러 인스턴스 간에 컴파일된 네이티브 코드를 공유함으로써 컴파일은 한 번만 수행된다.

실제 실행 중인 응용 프로그램의 성능 프로필을 새로 시작된 응용 프로그램에서 즉시 사용할 수 있고 마이크로 서비스 기반 서비스 인스턴스에서 성능 프로필을 사용할 수 있도록 한다. 이는 각 JVM에 대해 실행되는 컴파일러에 비해 리소스 효율성과 비용 절감 효과를 크게 향상할 수 있다.

빠른 스케일다운과 같은 비용 효율적 조치가 가능해 실질적인 비용도 절감할 수 있다. 또한 배포를 간소화할 수 있어 요청을 처리하기 전에 JVM을 예열하는 사전 시작 프로세스와 같은 트릭의 필요성을 줄일 수 있다.

갑작스러운 부하 수요에 민첩하게 대응하기 위해서는 새 컨테이너를 신속하게 가동하거나 컨테이너를 제거하는 기능도 중요하다. 온라인 소매 업체의 경우 연말연시 기간 트래픽이 급증했다가 감소하는 모습을 보인다. 이때 JIT 컴파일을 사용하면 다른 시기에 과도한 리소스를 사용하지 않고도 수요를 충족하고 수익을 창출할 수 있다.

마지막으로 리소스 활용 측면에서 비용을 절감할 수 있다. 가장 저렴한 형태의 컴파일은 발생하지 않는 컴파일이다. 시간뿐만 아니라 CPU 및 메모리 사용량도 많지 않다. 자바 프로세스의 메모리 및 CPU 사용량과 필요한 리소스 사이징이 크게 줄어들어 실질적인 비용을 절감할 수 있다. 비즈니스 리더들이 클라우드 비용에 대한 인식이 높아지고 있는 지금, JIT 컴파일은 기업이 클라우드 리소스를 온프레미스로 다시 송환하는 등의 옵션을 고려하지 않고도 비용을 절감하는 데 도움이 될 수 있다.

JIT 컴파일러가 JVM에 있는 경우, 워밍업 JIT 컴파일을 처리할 수 있는 충분한 리소스가 컨테이너에 프로비저닝돼야 한다. 이 프로세스는 리소스가 필요하지 않을 수도 있기 때문에 잠재적인 오버프로비저닝으로 이어진다. 클라우드 네이티브 컴파일러는 리소스를 필요한 만큼만 줄여 빠른 워밍업에 영향을 주지 않으면서 비용을 절감한다.

클라우드 네이티브 JVM의 발전으로 쿠버네티스에서 자바를 이전보다 쉽고, 빠르고, 효율적이고, 저렴하게 실행하여 클라우드에서 효율성을 높일 수 있다. 올바른 JVM은 필요한 서비스 인스턴스 수를 줄이고, 할당된 리소스를 줄임으로써 많은 복잡성을 해결할 수 있다.

회원가입 후 이용바랍니다.
개의 댓글
0 / 400
댓글 정렬
BEST댓글
BEST 댓글 답글과 추천수를 합산하여 자동으로 노출됩니다.
댓글삭제
삭제한 댓글은 다시 복구할 수 없습니다.
그래도 삭제하시겠습니까?
댓글수정
댓글 수정은 작성 후 1분내에만 가능합니다.
/ 400
내 댓글 모음
저작권자 © 테크월드뉴스 무단전재 및 재배포 금지