Go 런타임 프로파일링: 다섯 가지 프로파일이 하나의 아이디어로 수렴하는 방법

Understanding the Go Runtime: Profiling

Go 런타임 프로파일링: 다섯 가지 프로파일이 하나의 아이디어로 수렴하는 방법

이 글은 Go 런타임의 다섯 가지 프로파일(CPU, 힙, 블록, 뮤텍스, 고루틴)이 어떻게 공통된 구조를 공유하는지 설명합니다. 모든 프로파일은 pprof 형식의 파일로 저장되며, 이는 gzip으로 압축된 프로토콜 버퍼로, 샘플, 위치, 함수, 문자열 테이블로 구성됩니다. 핵심은 각 프로파일이 서로 다른 수집 모델을 사용한다는 점입니다. CPU 프로파일은 신호 기반의 비동기 스트리밍 방식으로, 잠금 없는 링 버퍼에 샘플을 기록하고 백그라운드 고루틴이 이를 집계합니다. 힙, 블록, 뮤텍스 프로파일은 할당자나 이벤트 발생 시점에 제자리에서 버킷 테이블에 집계합니다. 고루틴 프로파일은 실행 중 기록하지 않고 요청 시 모든 고루틴의 스택을 스냅샷합니다. 이 구조를 이해하면 프로파일링이 단순히 스택을 캡처하는 것이 아니라, 런타임이 프로그램의 움직임을 포착하는 다양한 방법임을 알 수 있습니다.

프로파일링은 런타임이 프로그램을 '움직이는 중'에 포착하는 것입니다 — 무엇을 하고 있는지, 시간을 어디에 쓰고 있는지 샘플링하여, `go tool pprof`로 열 수 있는 형태로 축적하는 것입니다.

이 날의 다른 글

2026-07-14