Edited at

pprofのweb viewでパフォーマンス測定


概要

pprofでサーバーのパフォーマンス検証する時、

web viewで簡単にボトルネックを特定できます。


pprofとは

go toolに入っているプロファイラーツール

関数単位でボトルネックになっている処理を特定できます

https://golang.org/pkg/net/http/pprof/

UI上で処理の流れがこんな感じに見れます

pprof.png


使用ツール


  1. Go

go version

go version go1.13 darwin/amd64


  1. graphviz

dotファイルとかをいい感じに可視化してくれるツール

今回は吐き出されたプロファイルを見やすくしてくれる

brew install graphviz


  1. コードに変更を入れる


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番煎じかとは思いますが、なぜかハマってしまったのでまとめておきました。