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=1 및 kernel.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> | 수동 시작/중지 |
jps | JVM pid 찾기 |
이벤트 타입
| 이벤트 | 측정 |
|---|
cpu | CPU 시간 (기본값) |
alloc | 스택별 힙 할당 |
lock | 락/모니터 경쟁 |
wall | 차단 시간 포함 벽시계 |
itimer | perf를 사용할 수 없을 때 폴백 |
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.jfr | JFR 기록 (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 | 샘플링 간격 |
jfr | JFR 형식 방출 |
플레임 그래프 읽기
| 기능 | 의미 |
|---|
| 너비 | 샘플의 공유 (시간) — 넓을수록 뜨거움 |
| 높이 | 스택 깊이, 비용 아님 |
| 색상 | 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-profiler | JFR | VisualVM |
|---|
| 안전점 편향 | 회피됨 | 감소됨 | 현재 |
| 네이티브/커널 프레임 | 예 | 제한적 | 아니오 |
| 오버헤드 | 매우 낮음 | 낮음 | 더 높음 |
| 할당 프로파일링 | 예 | 예 | 기본 |
| 최고의 용도 | 정확한 JVM 핫스팟 | 기본 제공 연속 기록 | 빠른 GUI 검사 |
네이티브 코드를 위한 perf + FlameGraph의 JVM 대응물입니다.
리소스