본문 바로가기
프로그래밍

👨‍💻 [Go] Go 에서 프로파일링 이란 무엇이며, 어떻게 활용할 수 있나요?

by 밝음의기둥 2025. 1. 9.
반응형

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."


👨‍💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.

Go 에서 프로파일링 이란 무엇이며, 어떻게 활용할 수 있는지 간략히 알아보았습니다.


질문 >

Go 에서 프로파일링 이란 무엇이며, 어떻게 활용할 수 있나요?

답변 >

Go에서 프로파일링(Profiling)이란?

프로파일링은 프로그램의 실행 중 성능 데이터를 수집하고 분석하여 코드의 병목현상, CPU 사용량, 메모리 소비 등을 파악하는 과정입니다. Go는 표준 라이브러리의 pprof 패키지를 통해 효율적인 프로파일링 도구를 제공합니다. 이를 통해 프로그램의 성능을 최적화할 수 있습니다.


Go에서 프로파일링의 주요 목적

  • CPU 사용량 분석:
    • 어떤 함수가 CPU 시간을 가장 많이 사용하는지 확인.
  • 메모리 사용량 분석:
    • 어떤 부분에서 메모리를 많이 할당하거나 해제하지 않는지 확인.
  • 고루틴 분석:
    • 실행 중인 고루틴의 상태와 갯수를 파악.
  • 병목현상 발견:
    • 느린 작업이나 자원 소비가 많은 작업을 식별.

프로파일링 설정 및 실행 방법

1. HTTP 서버 기반 프로파일링

Go 프로그램에 HTTP 서버를 추가하고 net/http/pprof를 등록하여 실시간으로 프로파일링 데이터를 수집할 수 있습니다.

코드 예제

package main

import (
    "fmt"
    "net/http"
    _ "net/http/pprof"
)

func main() {
    go func() {
        fmt.Println(http.ListenAndServe("localhost:6060", nil))
    }()

    // 프로그램의 로직
    for i := 0; i < 100000; i++ {
        fmt.Println(i)
    }
}

실행 방법

  • 프로그램을 실행합니다.
  • 웹 브라우저에서 http://localhost:6060/debug/pprof/로 접근합니다.
  • 다양한 프로파일링 데이터를 확인할 수 있습니다:
    • CPU 프로파일: /debug/pprof/profile
    • Heap 프로파일: /debug/pprof/heap
    • 고루틴 상태: /debug/pprof/goroutine

2. 명령줄 기반 프로파일링

pprof 도구를 사용하여 프로파일링 데이터를 파일로 저장하고 분석할 수 있습니다.

CPU 프로파일 생성

package main

import (
    "os"
    "runtime/pprof"
)

func main() {
    f, _ := os.Create("cpu.prof")
    pprof.StartCPUProfile(f)
    defer pprof.StopCPUProfile()

    // 성능을 측정할 코드
    for i := 0; i < 1000000; i++ {
        _ = i * i
    }
}

Heap 프로파일 생성

package main

import (
    "os"
    "runtime/pprof"
)

func main() {
    f, _ := os.Create("heap.prof")
    defer f.Close()

    // 성능을 측정할 코드
    data := make([]byte, 1000000)
    _ = data

    pprof.WriteHeapProfile(f)
}

프로파일 분석

프로파일링 결과를 분석하려면 go tool pprof 명령어를 사용합니다.

go tool pprof cpu.prof

명령어 예제

  • Top 사용량 보기:
top

  • 콜그래프 보기:
    • (Graphviz 설치 필요)
web


3. Bench 및 Test와 함께 프로파일링

Go는 벤치마크와 테스트 실행 시에도 프로파일링을 지원합니다.

CPU 프로파일

go test -bench=. -cpuprofile=cpu.prof

메모리 프로파일

go test -bench=. -memprofile=mem.prof

프로파일 분석

go tool pprof <프로파일 파일>


프로파일링 데이터 분석

pprof 주요 명령어

  • top:
    • 가장 많은 CPU 시간을 소비한 함수 표시.
  • list <함수 이름>:
    • 특정 함수의 상세 분석 결과 표시.
  • callgrind:
    • callgrind 형식으로 프로파일을 출력(그래프 분석 도구 사용 가능).
  • web:
    • 프로파일 데이터를 그래프로 시각화(웹 브라우저에서 확인).

고급 사용: Flame Graph

Flame Graph는 함수 호출 스택의 시각화를 제공하여 병목현상을 직관적으로 파악할 수 있습니다.

생성 방법:

  • Flame Graph 도구 설치:
go install github.com/google/pprof@latest

  • Flame Graph 생성:
go tool pprof -http=:8080 cpu.prof

  • 웹 브라우저에서 http://localhost:8080으로 접근하여 Flame Graph 확인.

프로파일링 시 주의사항

  • 테스트 환경에서 실행:
    • 프로파일링은 성능 오버헤드를 유발하므로 실제 운영 환경에서는 사용하지 않는 것이 좋습니다.
  • 최적화 대상 선정:
    • 전체 성능의 80%는 20%의 코드에서 소비된다는 "80/20 법칙"에 따라 최적화 대상을 선택합니다.
  • 객관적인 데이터 활용:
    • 주관적인 추측이 아닌 프로파일링 데이터를 기반으로 성능 문제를 분석합니다.

프로파일링을 활용한 최적화 프로세스

  • 프로파일링 실행:
    • 코드의 성능 병목 구간을 식별.
  • 분석:
    • pprof 결과를 통해 CPU 및 메모리 사용량 확인.
  • 최적화:
    • 병목 구간의 알고리즘을 개선하거나 자원 사용을 최적화.
  • 재측정:
    • 최적화된 코드를 다시 프로파일링하여 개선 효과 확인.

결론

Go에서 프로파일링은 성능 문제를 분석하고 해결하는 데 필수적인 도구입니다. pprof 패키지를 통해 CPU, 메모리, 고루틴 등 다양한 리소스의 사용을 추적할 수 있으며, 이를 바탕으로 코드 최적화와 성능 향상을 이끌어낼 수 있습니다. Flame Graph와 같은 시각화 도구를 활용하면 더 직관적으로 데이터를 분석할 수 있습니다.



🎬 유튜브 채널 🎬

 

위로그@WiLog

📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌

www.youtube.com

🎬 치지직 채널 🎬

 

위로그 채널 - CHZZK

지금, 스트리밍이 시작됩니다. 치지직-

chzzk.naver.com


반응형