[Go 공식문서 한국어 정리] ⓪17. Go 프로그램 프로파일링
[Go 공식문서 한국어 정리] ⓪17. Go 프로그램 프로파일링
원문 제목: Profiling Go Programs
작성자: Russ Cox; Shenghou Ma
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 1. 서론 — 이 문서가 다루는 내용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Go는 내장 프로파일링 도구를 제공하여 느린 프로그램을 분석하고 최적화할 수 있습니다.
이 문서는 go tool pprof를 사용하여 루프 인식 알고리즘의 성능을 11배 향상시킨 실제 사례를 보여줍니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 2. 핵심 개념
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
① CPU 프로파일링
runtime/pprof 패키지로 CPU 사용량을 측정합니다.
pprof.StartCPUProfile과 pprof.StopCPUProfile으로 프로파일을 시작/종료합니다.
go tool pprof로 topN, web, list 등의 명령으로 분석합니다.
② 메모리 프로파일링
pprof.WriteHeapProfile로 힙 메모리 사용량을 기록합니다.
메모리 할당량과 객체 수를 분석할 수 있습니다.
③ topN 명령
샘플 수가 가장 많은 함수를 보여줍니다.
flat(직접 실행 시간)과 cum(누적 실행 시간)으로 정렬할 수 있습니다.
④ web/list 명령
web: SVG 그래프로 함수 호출 관계와 샘플 수를 시각화합니다.
list: 소스 코드 라인별 샘플 수를 보여줍니다.
⑤ HTTP 프로파일링
net/http/pprof를 임포트하면 /debug/pprof/ 엔드포인트가 활성화됩니다.
실제 서버에서 라이브 프로파일을 수집할 수 있습니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 3. 주요 내용 상세
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
초기 프로그램은 C++보다 느리고 2배 이상의 메모리를 사용했습니다.
CPU 프로파일을 분석하니 runtime.mapaccess1_fast64와 main.FindLoops가 병목입니다.
main.DFS 함수에서 map[*BasicBlock]int를 사용하는 것이 비효율적이었습니다.
기본 블록에는 고유한 시퀀스 번호가 있으므로 []int 슬라이스로 대체했습니다.
이 변경만으로 실행 시간이 거의 절반으로 줄었습니다(25초 → 16초).
메모리 프로파일을 분석하니 FindLoops에서 56.3MB를 할당하고 있습니다.
특히 nonBackPreds[i] = make(map[int]bool)에서 맵 할당이 많았습니다.
맵을 슬라이스로 바꾸고 appendUnique 함수로 중복을 제거했습니다.
실행 시간이 16초 → 11초로 줄었습니다.
여전히 runtime.mallocgc가 50.9%를 차지했습니다.
FindLoops가 매 호출마다 큰 구조체를 할당하기 때문입니다.
전역 캐시를 도입하여 이전 호출의 메모리를 재사용했습니다.
실행 시간이 11초 → 8초로 줄었습니다.
추가로 작업 리스트와 루프 그래프 저장소를 재사용하고,
관용적인 Go 스타일로 리팩토링한 최종 버전은 2.29초에 실행됩니다.
최초 25초보다 11배 빠르고, 메모리 사용량도 3.7배 줄었습니다.
C++로 동일 알고리즘을 구현한 결과와 비슷한 성능을 보였습니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 4. 실전 활용 / 예시
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
성능 문제가 있는 Go 서비스에서 CPU/메모리 프로파일을 수집하여 병목을 파악합니다.
map을 과도하게 사용하는 경우 슬라이스나 구조체로 대체할 수 있습니다.
HTTP 서버에서는 net/http/pprof를 활용하여 실시간 프로파일링을 수행합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 5. 정리
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
go tool pprof는 Go 프로그램의 성능 분석을 위한 필수 도구입니다.
CPU 프로파일로 실행 시간 병목을, 메모리 프로파일로 할당 병목을 찾습니다.
단순한 데이터 구조 변경만으로도 큰 성능 향상을 얻을 수 있습니다.
📎 출처 링크
https://go.dev/blog/pprof
#Go #Golang #pprof #profiling #performance #공식문서

오뉴노노 님의 최근 댓글
ㅋㅋㅋㅋㅋ 2019 01.14 잘 읽었습니다 2018 12.30 포인트가 없어서 아직 시작을 못하고있는데요! 글은 잘 읽었습니다! 포인트 쌓고 도전할거에요 2018 12.30