프로파일링 방법 30초만에 pprof와 함께 하세요

Go에서 빠른 소개 프로파일링을 찾고 있었는데 모든 것이 번거로워서 다들 pprof를 가리키는 것 같습니다.

프로파일링하려는 코드가 다음과 같다고 가정해 보겠습니다.

package main

import (
    "fmt"
    "sync"
    "time"
)

// Some function that does work
func hardWork(wg *sync.WaitGroup) {
    defer wg.Done()
    fmt.Printf("Start: %v\n", time.Now())

    // Memory
    a := []string{}
    for i := 0; i < 500000; i++ {
        a = append(a, "aaaa")
    }

    // Blocking
    time.Sleep(2 * time.Second)
    fmt.Printf("End: %v\n", time.Now())
}

func main() {
    var wg sync.WaitGroup
    wg.Add(1)
    go hardWork(&wg)
    wg.Wait()
}



이제 프로필을 작성해 보겠습니다. 그렇게 하려면 다음이 필요합니다.
  • 종속성 설치:apt-get install graphviz gv (데비안) 또는 brew install graphviz (맥)
  • pprof 설치: go get -u github.com/google/pprof
  • 가져오기 추가: import _ "net/http/pprof"
  • pprof에 대한 서버 추가:

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


    다음과 같아야 합니다.

    package main
    
    import (
        "fmt"
        "net/http"
        "sync"
        "time"
    
        _ "net/http/pprof"
    )
    
    // Some function that does work
    func hardWork(wg *sync.WaitGroup) {
        defer wg.Done()
        fmt.Printf("Start: %v\n", time.Now())
    
        // Memory
        a := []string{}
        for i := 0; i < 500000; i++ {
            a = append(a, "aaaa")
        }
    
        // Blocking
        time.Sleep(2 * time.Second)
        fmt.Printf("End: %v\n", time.Now())
    }
    
    func main() {
        var wg sync.WaitGroup
    
        // Server for pprof
        go func() {
            fmt.Println(http.ListenAndServe("localhost:6060", nil))
        }()
        wg.Add(1) // pprof - so we won't exit prematurely
        wg.Add(1) // for the hardWork
        go hardWork(&wg)
        wg.Wait()
    }
    
    


    서버가 실행 중인 동안 go tool pprof http://localhost:6060/debug/pprof/heap를 입력한 다음(다른 터미널에서) png를 입력하면 다음과 같은 내용이 표시됩니다.


    보시다시피 hardWork가 약간의 메모리를 사용하고 있습니다.
    고루틴을 확인하고 싶다면 줄을 다음과 같이 바꿀 수 있습니다.go tool pprof http://localhost:6060/debug/pprof/goroutine
    다음 중에서 선택할 수 있습니다.
  • CPU: profile?seconds=10
  • 메모리: heap
  • 고루틴: goroutine
  • 고루틴 차단: block
  • 자물쇠: mutex
  • 추적: trace?seconds=5
  • 좋은 웹페이지 즐겨찾기