Arthas 는 서비스 중단을 유발하지 않고도 런타임 환경에서 Java 애플리케이션의 상태를 확인하고 문제를 진단할 수 있도록 설계된 오픈소스 도구입니다. 이 리포트는 해당 도구의 기본 세팅 과정과 성능 병목 현상 해결에 필수적인 핵심 명령어를 체계적으로 다룹니다.
1. 초기 환경 구축 및 실행
최신 버전의 Arthas 를 다운로드하여 실행 가능한 JAR 파일로 저장합니다. 터미널에서 아래 스크립트를 실행하면 자동으로 가장 recent 한 배포판을 가져옵니다.
# 아키텍처 자동 감지용 스크립트 다운로드
wget https://arthas.aliyun.com/arthas-boot.jar --no-check-certificate
# 목표 JVM 프로세스를 선택하여 진단 도구 로드
java -jar arthas-boot.jar
구현이 완료되면 시스템 내에서 실행 중인 Java 프로세스 목록이 나열됩니다. 화면에 표시되는 숫자를 입력하면 지정된 인스턴스에 디버거가 연결되며, 이후 모든 명령어가 해당 프로세스에 적용됩니다.
2. 메서드 호출 경로 및 비용 분석: trace
복잡한 비즈니스 로직 내何处에서 지연 시간이 발생하는지를 파악하기 위해 `trace` 명령어를 사용합니다. 이 명령은 특정 메서드 내부의 각 줄까지 분리하여 소요 시간을 측정하므로, 미세한 최적화 지점을 찾는 데 유용합니다.
명령 구조:
trace [전체 클래스 명] [메서드 이름] '[조건식]' -n [반복 횟수]
구체적 사례:
다음 예시는 재고 관리 모듈에서 아이템 존재 여부를 확인하는 로직을 모니터링하는 경우입니다. 50ms 초과 걸리는 호출만 캡처하며 최대 3 회만 관찰합니다.
trace com.store.management.InventoryControl checkItemAvailability '#cost > 50' -n 3
결과 해석: 출력 로그는 계층 구조를 따르며, 대괄호 `[]` 안쪽의 숫자가 해당 호출 시점을 나타냅니다.
`---ts=2023-10-12 10:20:00;thread_name=http-nio-8080-exec-5;id=5;
`---[128.40ms] com.store.management.InventoryControl:checkItemAvailability()
+---[10.20ms] com.db.pool.DBHelper:connect()
+---[98.50ms] com.repo.ItemRepository:query() # ⚠️ 주요 병목 지점
`---[12.50ms] com.log.SystemLogger:info()
- 기본 설정에서는 `java.*` 내부 호출은 숨겨지며, 하위 레이어까지 보기 위해 `-x` 옵션을 사용하거나 정규식을 활용할 수 있습니다.
- 여러 클래스를 동시에 감시하려면 `-E` 플래그와 함께 패턴을 지정합니다. 예:
trace -E 'com.service.*|com.dao.*' find*
3. 런타임 객체 상태 점검: watch
코드를 수정하지 않고도 실제 동작 시점에 파라미터 값이나 반환 결과를 실시간으로 주시할 수 있는 기능입니다. 이는 오류 발생 원인을 즉각적으로 규명하는 데 사용됩니다.
주요 관찰 식별자:
params | 메서드에 전달된 인자 배열 |
returnObj | 메서드가 반환한 객체 |
throwExp | 예외 발생 시 StackTrace 정보 |
target | 현재 객체의 속성값 |
옵션 파라미터:
-b: 호출 전 단계 (Before)-s: 호출 후 단계 (After)-e: 예외 발생 시 (Exception)-f: 최종 종료 시 (Finish)-x 4: 객체 깊이를 4 단계까지 펼침
활용 시나리오:
Case A: 예외 발생 원인 추적
주문 생성 과정에서 NullPointerException 가 발생할 때, 어떤 값이 Null 이었는지 확인합니다.
watch com.api.order.OrderGateway placeOrder '{params[0].orderNo, throwExp}' -e -x 3
@String[null], # ⚠️ 주문 번호 누락
ctd.lang.NullPointerException: order number required!
]
Case B: 응답 데이터 검증
사용자 조회 시 반환되는 필드의 값을 직접 확인하여 데이터 불일치를 파악합니다.
watch com.core.user.UserMgr getProfile '{returnObj.email, returnObj.roles}' -s
Case C: 상태 변수 변경 감지
캐시 서비스가 업데이트될 때 메모리 할당량을 모니터링합니다.
watch com.cache.LRUManager evictKey 'target.currentSize' -f
4. 운영상 유의사항 및 최적 전략
프로덕션 서버에서 이러한 도구를 사용할 때는 주의가 필요합니다. 불필요한 로그 생성이나 오버헤드가 트래픽 증가로 이어질 수 있으므로, 테스트 환경에서 먼저 실험하는 것이 원칙입니다.
- 경계 조건 처리:
-f같은 끝난 시점에 트리거되는 옵션은 빈번한 호출이 있을 경우 로그 폭포현상을 일으킬 수 있으니 신중하게 적용합니다. - 연동 분석: 성능 저하 구간을
trace로 먼저 좁히고, 정확한 데이터를 확보하기 위해watch를 연이어 실행하는 워크플로우가 효율적입니다. - 패턴 매칭: 광범위한 클래스를 대상으로 모니터링해야 할 때는
-E플래그를 사용하여 복잡한 규칙 표현식을 지원합니다.
웹 콘솔을 통해 GUI 기반으로도 동일한 기능을 수행할 수 있으며, 이를 통해 복잡한 스레드 덤프 분석이나 CPU 부하 분포 시각화를 지원받을 수 있습니다.