Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Goのパフォーマンス改善
Search
koya fukushi
August 04, 2017
1
970
Goのパフォーマンス改善
koya fukushi
August 04, 2017
Tweet
Share
More Decks by koya fukushi
See All by koya fukushi
Golang Escape Analysis
kooooya
1
370
Debugging Go with GDB
kooooya
0
120
Goroutine Patterns
kooooya
1
3.1k
Featured
See All Featured
A Philosophy of Restraint
colly
203
16k
BBQ
matthewcrist
85
9.3k
Building Adaptive Systems
keathley
38
2.3k
How to Ace a Technical Interview
jacobian
276
23k
A Tale of Four Properties
chriscoyier
156
23k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
329
21k
Designing for humans not robots
tammielis
250
25k
Six Lessons from altMBA
skipperchong
27
3.5k
The Power of CSS Pseudo Elements
geoffreycrofte
73
5.3k
Embracing the Ebb and Flow
colly
84
4.5k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Unsuck your backbone
ammeep
668
57k
Transcript
pprofの使い方 Venture Engineer Meetup #01 -Server Side Night- #eureka_meetup Goのパフォーマンス改善
自己紹介 - 福士 倖也 と申します - ヨットやってました - 青森出身 -
Go書いてます(Pairs)
Pairs累計会員数600万人突破!!
プロファイリング? ソフトウェア工学における性能解析または性能分析(英: Performance analysis)とは、動的プログラム解析の一種であり、プログラムの実行 を通して情報を収集することでプログラムの性能を解析することを言う。逆にプログラムを実行せずに行う解析を 静的コード解析と呼ぶ。性能 解析の目的は、実行時間やメモリ使用量を 最適化するためにプログラムのどの部分を改良すべきかを決定することである( ボトルネック、ア ムダールの法則参照)。
引用:https://ja.wikipedia.org/wiki/性能解析
pprofとは? https://github.com/google/pprof プロファイルをProtocol Buffer形式で読み込んで、 レポーティングや可視化を行い、解析しやすくするためのツール
pprofとは? https://golang.org/pkg/runtime/pprof/ https://golang.org/pkg/cmd/pprof/ Goではpprofのラップパッケージ が標準で用意されている
pprofについて 下記のプロファイリングが可能 1. goroutine 2. heap 3. threadcreate 4. block
5. mutex 6. cpu
pprofについて 下記のプロファイリングが可能 1. goroutine 2. heap 3. threadcreate 4. block
5. mutex 6. cpu goroutineのstacktrace
下記のプロファイリングが可能 1. goroutine 2. heap 3. threadcreate 4. block 5.
mutex 6. cpu pprofについて heapのGC・アロケーション
pprofについて 下記のプロファイリングが可能 1. goroutine 2. heap 3. threadcreate 4. block
5. mutex 6. cpu 新規のthreadの生成
pprofについて 下記のプロファイリングが可能 1. goroutine 2. heap 3. threadcreate 4. block
5. mutex 6. cpu wait状態のgoroutine
pprofについて 下記のプロファイリングが可能 1. goroutine 2. heap 3. threadcreate 4. block
5. mutex 6. cpu wait状態のgoroutine(mutexのみ)(go1.8から追加)
pprofについて 下記のプロファイリングが可能 1. goroutine 2. heap 3. threadcreate 4. block
5. mutex 6. cpu 関数の実行時間
下記のプロファイリングが可能 1. goroutine 2. heap 3. threadcreate 4. block 5.
mutex 6. cpu pprofについて この2つについて話します
pprofを使う プロファイルを作る方法は3種類 1. testing 2. runtime/pprof 3. net/http/pprof
プロファイルを作る方法は3種類 1. testing 2. runtime/pprof 3. net/http/pprof pprofを使う
pprofを使う いつものベンチマークにフラグを追加 1. memprofile 2. cpuprofile % go test -bench=.
-memprofile=mem.out -cpuprofile=cpu.out
プロファイルを作る方法は3種類 1. testing 2. runtime/pprof 3. net/http/pprof プロファイルを作る
プロファイルを作る - CPU - StartCPUProfile と StopCPUProfile で囲む
プロファイルを作る - Heap - WriteHeapProfile を直後に
プロファイルを作る方法は3種類 1. testing 2. runtime/pprof 3. net/http/pprof プロファイルを作る
プロファイルを作る net/http/pprof をimport http.ListerAndServe でhttpサーバーを起動
pprofを使う できたプロファイルを - CPU % go tool pprof slice.test cpu.out
- Heap % go tool pprof slice.test --alloc_space mem.out
pprofを使う または - CPU % go tool pprof http://localhost:6060/debug/pprof/profile -
Heap % go tool pprof http://localhost:6060/debug/pprof/heap
pprofを使う - CPUから見ていきます
pprofを使う(CPU) よく使うコマンド - top - list - web
よく使うコマンド - top - list - web pprofを使う(CPU)
pprofを使う(CPU) 上位のサンプルを表示
pprofを使う(CPU) 関数自体の実行時間
pprofを使う(CPU) flat値の全体に対して占める割合
pprofを使う(CPU) 累計値
pprofを使う(CPU) ほかの関数呼び出しも含めた時間
pprofを使う(CPU) cum値の全体に対して占める割合
pprofを使う(CPU) cumで並べることも可能
よく使うコマンド - top - list - web pprofを使う(CPU)
pprofを使う(CPU) ソースコード上で時間を表示
pprofを使う(CPU) flat
pprofを使う(CPU) cum
よく使うコマンド - top - list - web pprofを使う(CPU)
svg形式で可視化 1. 矢印が太いほど 2. 四角が大きいほど 時間がかかっている pprofを使う(CPU)
関数に関連する部分だけに絞れる pprofを使う(CPU)
pprofを使う(Heap) - 次はHeap
よく使うコマンド - top - list - web pprofを使う(Heap)
pprofを使う(Heap)
よく使うコマンド - top - list - web pprofを使う(Heap)
pprofを使う(Heap)
よく使うコマンド - top - list - web pprofを使う(CPU)
pprofを使う(Heap)
pprof 実践 実際にOSSのプロダクトで試してみようと思います
pprof 実践 https://github.com/sirupsen/logrus
pprof 実践 CPUから見ていく % go test -bench=. -memprofile=mem.out -cpuprofile=cpu.out %
go tool pprof logrus.test cpu.out
pprof 実践 (pprof) top20 -cum
pprof 実践 気になる
pprof 実践 (pprof) list TextFormatter\)\.Format
pprof 実践 気になる
pprof 実践 (pprof) list printColored
pprof 実践
pprof 実践 fmt.Fprintfを使わないように直していく
pprof 実践 まず fmt.Fprintf(“%-44s”, ...) と同等の処理を実装
pprof 実践 少し早くなった
pprof 実践 さらに []byteで文字列連結
pprof 実践 - printColored - 2.11s→1.68s
pprof 実践
pprof 実践 https://github.com/golang/go/wiki/CompilerOptimizations#range-over-bytes
pprof 実践 早くなった
pprof 実践 - needsQuoting - 360ms→200ms
pprof 実践 - (*TextFormatter).Format - 7.45s→7.03s
まとめ - 地道 - 正しく 計測することが大切 - ローカルでプロファイル作るなら、ちゃんと偏らないように Benchmark書く -
実行するたびに数字が微妙に増減するので、何度もやってみる - Goの知識が必要 - ボトルネックがわかっても、改善する方法を知らないと、、 - https://github.com/golang/go/wiki/Performance - https://github.com/golang/go/wiki/CompilerOptimizations - https://blog.golang.org/profiling-go-programs - などなど
ご清聴ありがとうございました