薄いブログ

技術の雑多なことを書く場所

go-swaggerを速くした話

orisano.hatenablog.com

orisano.hatenablog.com

github.com

go-swaggerのgenerate serverを速くした話をします.

上の2つの記事であげたPRでgo-swaggerのコード生成を速くしました.

上の2つの記事ではどこが遅いか明らかになった状態からのことを書きましたが, この記事ではどうやって明らかにしたかを書きます.

と言っても非常に簡単でpprofを使っただけです.

runtime/pprof

net/http/pprof

今回はpprofを直接使ったわけではなく,

github.com

という非常に簡単に使えるライブラリ経由で使用しました. 本当にCLIなどの計測の際はこれで十分な気がします.

defer profile.Start().Stop()

上のようなコードをgo-swaggerのmain関数に追加してbuild, 実行しました. go tool pprof -svg [出力されたファイル] とすると以下のような画像が出力されます.

f:id:orisano:20181204032618p:plain

このグラフを見ると全体像から重い場所がわかると思います. こういった形で簡単に計測, 改善場所の発見ができるはずです.

この過程で, Analyzedが重いことと無駄にregexp.MustCompileを呼んでいることが発見できました.

また, これとは違う見方でFlameGraphというものがあります. これもpprofのファイルから作れる

github.com

というものがあるので分析するときの助けになると思います.

これはCLIを簡単に計測するときは github.com/pkg/profile でいいと思いますが,

サーバーアプリケーションやデーモンの場合はユーザがみたいタイミングで外部からpprofできるので net/http/pprof を使ったほうが良いです.

しかし問題は得てして観測していないときに起こったりするので定期的にpprofを取りたいというときは

github.com

という選択肢もありかも知れません.

いずれにせよ本番環境で有効にする場合はインターネットからつながらないように気をつけてください.

まとめ

  • CLIの高速化のときは github.com/pkg/profileを使うと便利
  • サーバーアプリケーションやデーモンの場合は net/http/pprof を使うと便利
  • go tool pprof -svg で全体感を把握できる.
  • go-torch で重い処理を深掘りしていける.
  • 今回の取り組みと工夫で swagger generate serverが11秒から3秒になった.