karszawa / sign-of-horns

ISUCON 7 Qual Repository :metal:
0 stars 1 forks source link

net/http/pprofの導入 #12

Open totetotetotem opened 6 years ago

totetotetotem commented 6 years ago

なにをやるか

goのbuilt in profiler であるnet/http/pprofを導入する

なぜやるか

New Relicはアクセスパスベースでボトルネックを測定する pprofはより細かい、関数単位で時間が計測でき、ボトルネックを特定することができる

どうやるか

http://klabgames.tech.blog.jp.klab.com/archives/pprof1-cpuprofile.html 通常はimport内にpprofを追加すればよい。(ただし、コード上では使用しないので_ "net/http/pprof"とする)

import (
_ "net/http/pprof"
)

多分デフォルトなら80番で

$ go tool pprof http://127.0.0.1/debug/pprof/profile

ってできる気がしてきた

frameworkにgorillaを用いている場合には、importのアンダーバーを消去し、

func AttachProfiler(router *mux.Router) {
    router.HandleFunc("/debug/pprof/", pprof.Index)
    router.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline)
    router.HandleFunc("/debug/pprof/profile", pprof.Profile)
    router.HandleFunc("/debug/pprof/symbol", pprof.Symbol)

    // Manually add support for paths linked to by index page at /debug/pprof/
    router.Handle("/debug/pprof/goroutine", pprof.Handler("goroutine"))
    router.Handle("/debug/pprof/heap", pprof.Handler("heap"))
    router.Handle("/debug/pprof/threadcreate", pprof.Handler("threadcreate"))
    router.Handle("/debug/pprof/block", pprof.Handler("block"))
}

を追加した上で、mainで

AttachProfiler(r)

を追加する。rはmux.NewRouter()の返り値。

この状態でビルドし、

$ go tool pprof http://127.0.0.1:35664/debug/pprof/profile

を実行した上で、ベンチを回す。 すると~/pprof以下にprofileファイルが生成されるので

$ go tool pprof app /home/isucon/pprof/pprof.127.0.0.1:35664.samples.cpu.001.pb.gz

とすることで、pprofを開くことができる。

どうやら

$ go tool pprof app

だけでもpprofを開けるらしい[要検証]

そのあとはpprofのインタラクティブシェルに入るので、

(pprof) top
(pprof) peek
(pprof) list main.

とかを使用して生きていく。