pprof 정보
TL;DR
pprof에 대해서 다시 한 번 정리해 봤습니다.
관련 포장이 많은데 처음 학자가 도입하려면 적절할 것 같아서 적어놨어요.
이 글은 Go의 웹 애플리케이션을 pprof로 분류하는 상황을 설명한다.
pprof 소개
첨부 파일과 같이 Go의 구성 도구는 브라우저에 CPU 부하, 처리 시간, 메모리 사용량 등을 표시합니다.
Graph 디스플레이
Flame Graph 디스플레이
Flame Graph 디스플레이도 있습니다.
TOP 디스플레이
부하의function,method 정보를 열거할 수도 있습니다.
pprof의 구조
pprof의Graph의 견해
노드 색상:
노드 글꼴 크기:
가장자리 두께:
가장자리 색상:
가장자리 유형
pprof의 Repository와 패키지
repository
package
cmd/pprof
runtime/pprof
http/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입니다.
즉 http.DefaultServeMux Listen http를 사용하면 동작을 초기화하기만 하면 pprof를 사용할 수 있습니다.
하지만 gorilla/mux는 http입니다.DefaultServeMux가 아닌 자신의 httpHandler를 사용한다면 프로필을 작성할 수 없습니다.
그런 경우에는 다음과 같은 대응이 필요하다.
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)
기타 상황은 아래의 내용을 참조하십시오.최후
모니터링 도구에 비해
뉴릴리스, 데이터독의 APM이나 다른 오픈트래스계의 모니터링 도구 등과 비교하면 다음과 같은 내용이라고 할 수 있다.전문적인 압축 파일과 모니터링 방면에서 원래 할 수 있는 일은 다르다.
장점
상술 이렇게 빠져들 때도 있지만 이렇게 설정해도 간단해
부모 스파, 자 스파, 그리고 그 자손의 스파를 각각function으로 설정해야 한다
pprof 명령의 base 옵션를 사용하여 디스플레이 프로필
결점
Reference
이 문제에 관하여(pprof 정보), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/muroon/articles/adf577f563c806텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)