Linux perf로 분산 애플리케이션 프로파일링: 실용 가이드
성숙한 애플리케이션을 최적화하는 건 건초더미에서 바늘 찾기처럼 느껴질 수 있습니다. 실제 성능 병목 현상을 식별하는 가장 좋은 방법은 직관이 아닌 데이터가 결정을 이끌게 하는 것입니다. 실제로는 가장 시간이 많이 소요되는 코드가 가장 덜 명백한 경우가 많습니다.
코드가 느리다고 의심될 때, 수정하기 전에 먼저 증거를 확인합니다.
프로파일링은 그 직관을 측정 가능한 사실로 바꿉니다. 시장에는 수십 개의 프로파일러가 있지만, 멀티스레드 또는 분산 시스템에 적합한 도구를 선택하는 건 어려울 수 있습니다. Callgrind 같은 전통적인 명령어 카운트 프로파일러는 특히 심한 뮤텍스 경합 하에서 타이밍을 왜곡할 수 있습니다. 이들은 벽시계 시간이 아닌 명령어를 측정하기 때문입니다.
반면 통계적 프로파일러는 낮은 오버헤드로 실행 중인 프로그램을 샘플링하므로 복잡하고 동시적인 워크로드에 이상적입니다. Linux의 perf는 이 접근 방식의 대표적인 예입니다.
아래는 perf를 Brendan Gregg의 FlameGraph와 함께 사용하여 분산 애플리케이션의 핫스팟을 정확히 찾아내는 단계별 워크플로입니다. 예제는 RTI Connext 5.3.0의 c/hello_dynamic 샘플을 대상으로 합니다.
1. perf 설치
Ubuntu에서 실행:
sudo apt-get install linux-tools-common linux-tools-3.13.0-107-generic
2. FlameGraph 복제
편리한 위치(예: 홈 디렉토리)에 저장소 복제:
git clone https://github.com/brendangregg/FlameGraph
3. 예제 빌드
rti_workspace/examples/c로 이동하여 디버그 심볼로 컴파일:
export DEBUG=1 make -f makefile_Hello_x64Linux3gcc4.8.2
플랫폼에 맞는 makefile 이름으로 교체하세요.
4. 프로파일링하며 발행자 실행
구독자를 백그라운드에서 시작한 후 perf 실행:
objs/x64Linux3gcc4.8.2/Hello sub & sudo perf record -g objs/x64Linux3gcc4.8.2/Hello pub
짧은 테스트 기간 후
Ctrl+C로 발행자 중지. perf가
perf.out 생성.
5. FlameGraph용 데이터 변환
perf 출력을 접힌 스택 파일로 변환:
perf script -f | ~/FlameGraph/stackcollapse-perf.pl > out.perf-folded
그런 다음 시각적 플레임 그래프 생성:
~/FlameGraph/flamegraph.pl out.perf-folded > perf.svg
6. 결과 검사
웹 브라우저에서 perf.svg 열기. 가로축은 각 함수에서 소요된 시간을 보여주며, 스택된 막대는 호출 스택을 드러냅니다. 막대를 클릭하면 해당 스택으로 확대됩니다. 구독자 없이 발행자 실행 시 그래프의 오른쪽 부분이 제거되어 DDS가 구독자 존재 시에만 데이터를 방출함을 확인할 수 있습니다.
Perf는 더 많은 옵션을 제공합니다: 샘플링 주파수 조정, 커널 코드 제외, 특정 CPU 집중. 팁이나 프로파일링을 단순화하는 보완 도구를 발견했다면 댓글로 공유하세요.
즐거운 프로파일링!