samply - Firefox Profiler UI를 사용한 샘플링 프로파일러 치트시트
samply는 macOS, Linux, Windows용 크로스 플랫폼 명령줄 샘플링 프로파일러입니다. 명령어 또는 실행 중인 프로세스의 스택 추적을 샘플링하고 (기본 ~1000 Hz) 결과를 Firefox Profiler 웹 UI에 제공합니다. Firefox Profiler는 화염 그래프, 스택 차트, 호출 트리, 스레드별 타임라인이 있는 성숙하고 대화형 프론트 엔드입니다. 네이티브 코드 (C/C++/Rust/Go) 및 표준 스택 정보를 내보내는 기타 언어를 프로파일하며, 코드 변경이 필요하지 않습니다.
설치
| 방법 | 명령어 |
|---|
| Cargo | cargo install --locked samply |
| 바이너리 | GitHub Releases 페이지에서 다운로드 |
| Linux perf 이벤트 접근 | sysctl kernel.perf_event_paranoid=1 필요할 수 있음 (또는 더 낮음) |
| 검증 | samply --version |
기본 사용법
| 명령어 | 설명 |
|---|
samply record ./my-program args | 명령어 프로파일, UI 열기 |
samply record -- cargo run --release | -- 후 프로파일 (플래그 전달) |
samply record --pid 1234 | 이미 실행 중인 프로세스 프로파일 |
samply load profile.json.gz | UI에서 저장된 프로파일 재열기 |
samply --help | 전체 옵션 목록 |
레코딩 옵션
| 옵션 | 설명 |
|---|
-r, --rate N | Hz 샘플링 속도 (기본 ~1000) |
-o, --output FILE | 파일에 프로파일 저장 |
--save-only | 브라우저 UI 실행 없이 레코딩 |
-p, --pid PID | 실행 중인 프로세스에 연결 |
-d, --duration SECS | 고정 기간 프로파일 |
--reuse-threads | 일부 워크로드용 스레드 처리 조정 |
-- | 그 후 모든 것은 명령어 + args |
Firefox Profiler UI
레코딩 후 samply는 로컬 Firefox Profiler 보기를 엽니다. 주요 패널:
| 패널 | 표시 |
|---|
| Flame graph | 집계 스택 (시간 소비처) |
| Stack chart | X축의 시간, 수직으로 쌓인 스택 |
| Call tree | 자체/총계 시간을 포함한 상향식 / 하향식 계층 |
| Marker chart | 시간 경과 이벤트 (있는 경우) |
| Timeline | 스레드별 활동; 범위 선택으로 초점 맞추기 |
| UI 액션 | 사용 |
|---|
| 시간 범위 선택 | 실행의 일부로 분석 초점 맞추기 |
| 호출 스택 반전 | 핫 리프 함수 찾기 (자체 시간) |
| 검색 | 함수 이름으로 호출 트리 필터 |
| 공유/내보내기 | 프로파일 저장 또는 업로드 |
워크플로우 팁
| 목표 | 접근 |
|---|
| CPU 핫 경로 찾기 | 레코드, 화염 그래프 열기, 넓은 프레임 찾기 |
| 특정 느린 단계 찾기 | 타임라인에서 시간 범위 선택 |
| 빌드 비교 | 프로파일 저장 및 나란히 로드 |
| 노이즈 감소 | 디버그 정보로 릴리스 빌드 프로파일 (debug = true) |
일반적인 워크플로우
# Rust 릴리스 빌드 프로파일 (디버그 정보로 심볼 유지)
samply record -- cargo run --release
# 실행 중인 서버를 20초 동안 프로파일
samply record --pid $(pgrep -n myserver) -d 20
# CI에서 헤드리스 레코드, 나중에 아티팩트 검사
samply record --save-only -o prof.json.gz ./bench
samply load prof.json.gz
samply vs 다른 프로파일러
| 측면 | samply | perf + FlameGraph | hotspot |
|---|
| 플랫폼 | macOS/Linux/Windows | Linux | Linux |
| UI | Firefox Profiler (풍부) | 정적 SVG | Qt GUI |
| 설정 | 단일 바이너리 | 여러 도구 | GUI 설치 |
| 최고의 용도 | 크로스 플랫폼, 대화형 | 스크립팅된 Linux 프로파일링 | Qt/perf GUI 사용자 |
리소스