概要
pprofでサーバーのパフォーマンス検証する時、
web viewで簡単にボトルネックを特定できます。
pprofとは
go toolに入っているプロファイラーツール
関数単位でボトルネックになっている処理を特定できます
https://golang.org/pkg/net/http/pprof/
UI上で処理の流れがこんな感じに見れます
使用ツール
- Go
go version
go version go1.13 darwin/amd64
dotファイルとかをいい感じに可視化してくれるツール
今回は吐き出されたプロファイルを見やすくしてくれる
brew install graphviz
- コードに変更を入れる
main.go
import (
"context"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"time"
_ "net/http/pprof" // これをインポートすることでプロファイル取得用のルーティングがインジェクションされる
func main() {
// 別スレッドで計測
go func() {
l.Println(http.ListenAndServe(":6060", nil))
}()
dockerを使っている時はportを開けるのを忘れないように
docker-compose.yml
- ./secret:/secret
ports:
- "3001:3001"
+ - "6060:6060" #dockerのネットワークとホストをつなぐ
environment:
- ENV=develop
- DB_HOST=tcp(db:3306)
あとはgo.modなど
実行
計測したいリクエストを投げる
計測
go tool pprof -http=: localhost:6060
↑は処理時間のプロファイリング
他にもCPU, goroutineのプロファイルなどが可能
go tool pprof -http=: localhost:6060 http://localhost:6060/debug/pprof/profile?seconds=30
referenceに他の計測指標も載っています。
まとめ
こんな感じでprofileが簡単な修正でできます。
特に大規模サービスになった時ボトルネックの特定に役立ちそうです。
n番煎じかとは思いますが、なぜかハマってしまったのでまとめておきました。