Arthas는 알리바바(Alibaba)에서 오픈소스로 공개한 Java 진단 도구로, 운영 중인 서비스의 가동을 중단하지 않고도 실시간으로 JVM의 상태를 확인하거나 코드를 분석할 수 있는 기능을 제공합니다. 복잡한 마이크로서비스 환경이나 직접적인 디버깅이 어려운 운영 환경에서 발생하는 다양한 기술적 난제를 해결하는 데 최적화되어 있습니다.
Arthas가 해결하는 주요 시나리오
- 특정 클래스가 어떤 Jar 파일에서 로드되었는지, 왜
ClassNotFoundException이나NoSuchMethodError가 발생하는지 추적할 때 - 수정한 코드가 정상적으로 배포되어 반영되었는지 실시간으로 소스 코드를 확인할 때
- 운영 환경에서 로그를 추가하거나 재배포하지 않고 특정 메소드의 입력값, 출력값, 예외 발생 여부를 확인하고 싶을 때
- 시스템 성능 저하의 원인이 되는 느린 메소드나 병목 지점을 찾고 싶을 때
- CPU 점유율이 높은 스레드를 실시간으로 찾아내어 해당 스레드의 Stack Trace를 분석할 때
설치 및 실행 방법
Arthas는 별도의 복잡한 설치 과정 없이 실행 가능한 Jar 파일을 다운로드하여 바로 사용할 수 있습니다.
# Arthas 부트스트랩 파일 다운로드
wget https://alibaba.github.io/arthas/arthas-boot.jar
# 실행 (분석할 Java 프로세스를 선택할 수 있는 대화형 쉘이 나타남)
java -jar arthas-boot.jar
성공적으로 실행되면 현재 실행 중인 Java 프로세스 목록이 출력됩니다. 분석하고자 하는 프로세스의 번호를 입력하면 해당 프로세스에 Arthas가 연결됩니다. 브라우저를 통해 접근하고 싶다면 http://127.0.0.1:8563으로 접속하여 Web Console을 이용할 수도 있습니다.
실시간 모니터링 및 진단 핵심 명령
1. 시스템 상태 개요 (dashboard)
dashboard 명령어를 입력하면 현재 JVM의 메모리(Heap, Non-Heap), 스레드 상태, GC 통계, 시스템 정보를 한눈에 파악할 수 있는 대시보드가 출력됩니다.
2. CPU 점유율 분석 (thread)
시스템 부하가 높을 때 어떤 스레드가 자원을 많이 사용하는지 확인하는 것이 중요합니다.
# CPU 사용량이 높은 상위 5개 스레드 확인
thread -n 5
# 특정 ID를 가진 스레드의 스택 트레이스 출력
thread [ID]
3. 런타임 코드 역컴파일 (jad)
운영 환경에 배포된 바이트코드를 소스 코드로 변환하여 로직을 확인할 수 있습니다. 이를 통해 실제 실행 중인 코드가 의도한 버전인지 즉시 알 수 있습니다.
# 특정 서비스 클래스의 소스 코드 확인
jad com.example.service.OrderService
4. 메소드 실행 시간 측정 (trace)
특정 서비스의 응답 속도가 느릴 때, 어떤 단계에서 시간이 소요되는지 계층적으로 분석합니다.
# OrderService의 createOrder 메소드 내 하위 호출들의 수행 시간 추적
trace com.example.service.OrderService createOrder
5. 실시간 데이터 관찰 (watch)
메소드가 호출될 때의 인자(Parameters)와 반환값(Return Value)을 로그 출력 없이 모니터링합니다.
# 메소드의 파라미터와 결과값을 관찰 (결과 깊이 2단계까지)
watch com.example.service.OrderService createOrder "{params,returnObj}" -x 2
6. 통계 모니터링 (monitor)
지정한 주기마다 메소드의 실행 횟수, 성공 및 실패율, 평균 응답 시간을 통계적으로 보여줍니다.
# 10초 주기로 해당 메소드의 통계 데이터 출력
monitor -c 10 com.example.controller.UserAction login
도구 종료
현재 연결된 세션만 종료하려면 exit 또는 quit 명령어를 사용합니다. 만약 타깃 프로세스에 붙어있는 Arthas 서버 자체를 완전히 종료하고 자원을 해제하려면 stop(또는 shutdown) 명령어를 실행해야 합니다.