pprof 정보

7581 단어 Gotech

TL;DR


pprof에 대해서 다시 한 번 정리해 봤습니다.
관련 포장이 많은데 처음 학자가 도입하려면 적절할 것 같아서 적어놨어요.
이 글은 Go의 웹 애플리케이션을 pprof로 분류하는 상황을 설명한다.

pprof 소개


첨부 파일과 같이 Go의 구성 도구는 브라우저에 CPU 부하, 처리 시간, 메모리 사용량 등을 표시합니다.

Graph 디스플레이


graph

Flame Graph 디스플레이


Flame Graph 디스플레이도 있습니다.
flame_graph

TOP 디스플레이


부하의function,method 정보를 열거할 수도 있습니다.
top_viewing

pprof의 구조

  • client 측에서 pprof의 시작/수령 명령을 실행
  • 서버 측의 pprof를handler로 실행하여 서버 측에서 전문화
  • 서버 측에서 일정 시간을 거친 후(간략한 경우 기본 30s) 간략한 결과를 얻을 수 있습니다.pd.쓰기 응답을 통해 gz 파일로 돌아가기
  • 다운로드 받았어요.pd.브라우저에 gz 파일 보이기overview

    pprof의Graph의 견해


    graph_explanation

  • 노드 색상:
  • 큰 정적 누적치는 빨간색
  • 큰 음cum값은 녹색
  • 0에 가까운cum값은 회색

  • 노드 글꼴 크기:
  • 글꼴 크기가 클수록 절대 평탄치가 커진다
  • 글꼴 크기가 작을수록 절대 평탄치가 작아진다

  • 가장자리 두께:
  • 가장자리가 두꺼울수록 경로를 따라 더 많은 자원을 사용합니다
  • 가장자리가 얇을수록 경로를 따라 리소스가 줄어듭니다
  • .

  • 가장자리 색상:
  • 큰 값은 빨간색
  • 큰 마이너스는 녹색
  • 0에 가까운 값은 회색

  • 가장자리 유형
  • 고체 변두리: 한 위치에서 다른 위치로 직접 호출
  • 점선 가장자리: 연결된 두 위치 사이의 일부 위치가 삭제됨
  • 원문

    pprof의 Repository와 패키지


    repository

  • https://github.com/google/pprof/
  • package


  • cmd/pprof
  • pprof 명령(내부에서 베이스를 부르는 pprof)
  • 담당

  • runtime/pprof
  • Go 프로세싱을 위한 아카이브

  • http/pprof
  • ServerSide 측의 프로 경기를 맡는다(내부에서는runtime/pprof라고 부른다)
  • pprof의 사용 방법


    엄밀히 말하면 또 다른 방법이 있어요.

    1. 넷/http/pprof를 import로 (또는 초기화된 import만)


    import(
      _ "net/http/pprof"
    )
    
    ※ 다음 항목에서는 설명하지만, 이 설정만으로는 pporf를 사용할 수 없습니다.

    2. pprof 명령 실행


    go tool pprof -http=":22222" http://localhost:8080/debug/pprof/profile
    

    ServerSide 애플리케이션에 pprof를 설치할 때 고려할 사항


    응용 프로그램에서는 아래 서술한 내용이 적혀 있으면 이동할 수 있는 기록을 볼 수 있다.
    import(
      _ "net/http/pprof"
    )
    
    사용하는 러터에 따라 직접 사용할 수 없는 경우도 있다.

    사용 가능


    한 줄만 추가하면 pprof 사용 가능
    import (
        "net"
        "net/http"
        _ "net/http/pprof" // 追加
    )
    
    func main() {
        http.HandleFunc("/", hello())
        err = http.ListenAndServe(":8080", nil)
    

    사용할 수 없음


    1줄만 추가하면 pprof를 사용할 수 없습니다.
    import (
        "github.com/gorilla/mux"
        "net"
        "net/http"
        _ "net/http/pprof" // 追加
    )
    
    func main() {
        r := mux.NewRouter() // gorilla/muxを使用
        r.HandleFunc("/", hello())
        lin, err := net.Listen("tcp", ":8080")
        if err != nil {
            panic(err)
        }
        defer lin.Close()
        s := new(http.Server)
        s.Handler = r
        s.Serve(lin)
    
    인터넷/http/pprof 패키지의 초기화 시 무엇을 하는지 봅시다.
    다음 루틴을 진행합니다.
    방금 패키지 초기화에서 다음과 같은 동작을 실행했습니다.
    func init() {
    	http.HandleFunc("/debug/pprof/", Index)
    	http.HandleFunc("/debug/pprof/cmdline", Cmdline)
    	http.HandleFunc("/debug/pprof/profile", Profile)
    	http.HandleFunc("/debug/pprof/symbol", Symbol)
    	http.HandleFunc("/debug/pprof/trace", Trace)
    }
    
    pprof를 사용하려면 상기/debug/pprof 이하의 URL은handling이 필요합니다.
    결과는 http입니다.DefaultServeMux는HandleFunc입니다.
    https://github.com/golang/go/blob/53094ac844c48b0574d5374348cc09d7649104c3/src/net/http/server.go#L2506
    즉 http.DefaultServeMux Listen http를 사용하면 동작을 초기화하기만 하면 pprof를 사용할 수 있습니다.
    하지만 gorilla/mux는 http입니다.DefaultServeMux가 아닌 자신의 httpHandler를 사용한다면 프로필을 작성할 수 없습니다.
    그런 경우에는 다음과 같은 대응이 필요하다.
  • http.DefaultServeMux에서 Handling이 완성된 메시지를 보냅니다
  • 자신의HandleFunc
  • 1. http.DefaultServeMux에서 Handling이 완성된 메시지를 보냅니다


    import (
        "github.com/gorilla/mux"
        "net"
        "net/http"
        _ "net/http/pprof" // 追加
    )
    
    func main() {
        r := mux.NewRouter()
        r.PathPrefix("/debug/pprof/").Handler(http.DefaultServeMux) // 追加
        r.HandleFunc("/", hello())
        lin, err := net.Listen("tcp", ":8080")
        if err != nil {
            panic(err)
        }
        defer lin.Close()
        s := new(http.Server)
        s.Handler = r
        s.Serve(lin)
    

    2. 자기HandleFunc


    import (
        "github.com/gorilla/mux"
        "net"
        "net/http"
        "net/http/pprof" // 追加(importしているだけ)
    )
    
    func main() {
        r := mux.NewRouter()
        r.HandleFunc("/debug/pprof/", pprof.Index) // 追加
        r.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline) // 追加
        r.HandleFunc("/debug/pprof/profile", pprof.Profile) // 追加
        r.HandleFunc("/debug/pprof/symbol", pprof.Symbol) // 追加
        r.HandleFunc("/debug/pprof/heap", pprof.Handler("heap").ServeHTTP) // 追加
        r.HandleFunc("/", hello())
        lin, err := net.Listen("tcp", ":8080")
        if err != nil {
            panic(err)
        }
        defer lin.Close()
        s := new(http.Server)
        s.Handler = r
        s.Serve(lin)
    
    기타 상황은 아래의 내용을 참조하십시오.
    https://github.com/muroon/pprof_sample

    최후


    모니터링 도구에 비해


    뉴릴리스, 데이터독의 APM이나 다른 오픈트래스계의 모니터링 도구 등과 비교하면 다음과 같은 내용이라고 할 수 있다.전문적인 압축 파일과 모니터링 방면에서 원래 할 수 있는 일은 다르다.

  • 장점
  • 간단한 설정 조사를 통해function을 모두 수행

  • 상술 이렇게 빠져들 때도 있지만 이렇게 설정해도 간단해
  • Open Trace에서 func 클래스의 성능을 측정할 때
    부모 스파, 자 스파, 그리고 그 자손의 스파를 각각function으로 설정해야 한다
  • 변경점 차이점 비교 용이

  • pprof 명령의 base 옵션를 사용하여 디스플레이 프로필
  • 을 비교할 수도 있습니다.

  • 결점
  • DB 등 외부 리소스에 대한 성능 조사 불가능
  • 외부 API와 함께 성능 조사를 수행할 수 없음
  • 좋은 웹페이지 즐겨찾기