콘텐츠로 이동

async-profiler - 저오버헤드 JVM 프로파일러 치트시트

async-profiler - 저오버헤드 JVM 프로파일러 치트시트

async-profiler는 JVM을 위한 저오버헤드 샘플링 프로파일러입니다. 전통적인 Java 프로파일러는 안전점에서만 샘플하는데, 이는 안전점 근처에 있는 코드로 결과를 편향시키고 실제 핫 경로를 숨길 수 있습니다. async-profiler는 AsyncGetCallTrace 및 perf 이벤트를 사용하여 어디에서나 샘플하며, 네이티브 코드 및 커널 프레임을 포함하여, 훨씬 더 정직한 그림을 제공합니다. CPU, 할당, 락 경쟁 등을 프로필링하고 플레임 그래프 또는 JFR을 내보냅니다.

설치

방법방법
다운로드플랫폼용 릴리스 tarball 가져오기
추출tar xzf async-profiler-*.tar.gz
실행./bin/asprof <pid> (최신) 또는 ./profiler.sh <pid>
권한sysctl kernel.perf_event_paranoid=1kernel.kptr_restrict=0 필요할 수 있음
확인./bin/asprof --version

기본 프로파일링

명령설명
asprof -d 30 -f out.html <pid>30초 프로필 → 플레임 그래프
asprof -e alloc -d 30 -f alloc.html <pid>할당 프로파일링
asprof -e lock -d 30 -f lock.html <pid>락 경쟁
asprof -e wall -d 30 -f wall.html <pid>벽시계 (대기 포함)
asprof start <pid> / asprof stop -f out.html <pid>수동 시작/중지
jpsJVM pid 찾기

이벤트 타입

이벤트측정
cpuCPU 시간 (기본값)
alloc스택별 힙 할당
lock락/모니터 경쟁
wall차단 시간 포함 벽시계
itimerperf를 사용할 수 없을 때 폴백
cache-misses, page-faults하드웨어/소프트웨어 perf 이벤트
# 앱이 실제로 벽시계 시간을 어디에 쓰는가 (IO 대기 포함)?
./bin/asprof -e wall -t -d 30 -f wall.html <pid>

출력 형식

플래그생성
-f out.html대화형 플레임 그래프
-o collapsed폴드 스택 (FlameGraph 도구용)
-o tree호출 트리
-o flat평탄 핫 메서드 목록
-f out.jfrJFR 기록 (JMC에서 열기)
-t스레드별 분할

에이전트로 시작

# JVM 시작부터 프로파일 (워밍업 캡처)
java -agentpath:/path/libasyncProfiler.so=start,event=cpu,file=profile.html \
  -jar app.jar
에이전트 옵션목적
start즉시 시작
event=cpu|alloc|lock샘플할 것
file=NAME출력 경로
interval=10ms샘플링 간격
jfrJFR 형식 방출

플레임 그래프 읽기

기능의미
너비샘플의 공유 (시간) — 넓을수록 뜨거움
높이스택 깊이, 비용 아님
색상Java (녹색), 네이티브 (황색), 커널 (주황색)
클릭부분 트리로 확대
검색일치하는 프레임 강조

넓은 고원을 찾으세요 — 큰 수평 공유를 소비하는 단일 프레임이 핫 스팟입니다. Java/네이티브/커널 프레임 혼합은 정확히 안전점 편향 프로파일러가 숨기는 것입니다.

일반적인 워크플로

# 1) 실행 중인 서비스의 CPU 핫스팟
./bin/asprof -d 60 -f cpu.html $(jps | grep MyApp | cut -d' ' -f1)

# 2) GC 압력 추구 — 누가 가장 많이 할당하는가?
./bin/asprof -e alloc -d 60 -f alloc.html <pid>

# 3) 스레드는 유휴 상태이지만 지연시간이 높음 → 벽시계
./bin/asprof -e wall -t -d 30 -f wall.html <pid>

# 4) 공유 리소스에 경쟁
./bin/asprof -e lock -d 30 -f lock.html <pid>

async-profiler vs 대안

측면async-profilerJFRVisualVM
안전점 편향회피됨감소됨현재
네이티브/커널 프레임제한적아니오
오버헤드매우 낮음낮음더 높음
할당 프로파일링기본
최고의 용도정확한 JVM 핫스팟기본 제공 연속 기록빠른 GUI 검사

네이티브 코드를 위한 perf + FlameGraph의 JVM 대응물입니다.

리소스