1 of 19

プロファイルの話

akinobu fujii

2 of 19

自己紹介

  • 名前:akinobu fujii
  • 職業:ゲームプログラマー(だったはず)
    • 言語は主にC++、golang少々�
  • その他:
    • umeda.go運営
    • Game Gatling LT運営�
  • SNSなど:
    • Twitter: @f_akinobu
    • Github : akinobufujii

3 of 19

アジェンダ

  • この話の動機
  • よく使ってるプロファイル方法
  • 困っていること
  • まとめ

4 of 19

この話の動機

5 of 19

プロファイル方法があってるのか間違ってるのか知りたい

  • 自分のプロファイル方法を紹介
  • ただ正直不安
    • ドキュメントを見たり調べたりはしてる
    • より良い方法があるかもしれない
    • 現在進行系で困ってることもある�
  • 解決策もあれば知りたい

6 of 19

よく使ってるプロファイル方法

7 of 19

go test(benchmark)

  • testing.Bを使ったベンチマークテスト
  • 一番手軽
  • 下記を調べることができる
    • 実行時間
    • アロケート容量
    • アロケート回数

8 of 19

具体例

  • https://github.com/akinobufujii/go_pprof_test/blob/a706bab7fc8934c993a61d65c9ee8ec2c609fde0/main_test.go#L11-L62
  • これで簡単にベンチマークテストができる
    • $ go test -bench . -count 3 -benchmem
    • 上記のコマンドは�「main_test.goに書いてあるベンチマークテストを3回ずつメモリパフォーマンス込み」�で行う�
  • Tips:
  • io.Copyは内部で呼び出すたびに32KiBのバッファを確保する
  • 何度も呼び出すことがわかっていれば�前もって自前でバッファを確保して�io.CopyBufferを使って実行するとパフォーマンスが良くなる

9 of 19

実行結果

10 of 19

実行結果

io.Copyよりもio.CopyBuffer使ったほうがパフォーマンスいいことが分かる

11 of 19

pprof

  • Go標準で搭載されているプロファイルツール
  • 処理のボトルネックを特定しやすい
  • 色んな方法で取ることができる
    • go test
    • アプリ埋め込み(ファイル書き出し)
    • アプリ埋め込み(http通信)
      • すみません、今回これは紹介しません

12 of 19

pprof go test

  • $ go test -bench . -count 3 -benchmem -cpuprofile pprof/cpu.out
    • これでさっきのベンチマークテストをpprofデータとして出力できる�
  • $ go tool pprof -http=:8080 pprof/cpu.out
    • これで「localhost:8080にベンチマーク結果を表示する」事ができる

13 of 19

pprof アプリ埋め込み(ファイル書き出し)

  • https://github.com/akinobufujii/go_pprof_test/blob/a706bab7fc8934c993a61d65c9ee8ec2c609fde0/main.go#L23-L33
  • こんな感じで埋め込める
    • 上記は「実行時間時のUnixTimeをファイル名にしている」ので�ファイル名がかぶらないようにしている�
  • パース方法は同じ
  • $ go tool pprof -http=:8080 pprof/cpu.out

14 of 19

pprofの画面

15 of 19

困っていること

16 of 19

Windowsでtraceが動かない・・・?

  • https://pkg.go.dev/runtime/trace を使いたい
    • groutineの処理の流れを可視化できるらしい
    • これで並行処理中の流れを追えるなら追いたい
  • ただ、うまく動かない・・・
    • https://github.com/golang/go/issues/34374 によると、�chrome側のWemComponents v0 移行で読めなくなった?
    • ただ修正済み?
  • 色々調べたがわからないので、引き続き調べます・・・

17 of 19

ずっとこんな感じ

18 of 19

まとめ

19 of 19

まとめ

  • Goなら標準で簡単にベンチマークテストできます
  • pprof、見方を学ぶ必要がある
    • ただ、見方がわかればパフォーマンスボトルネック調査の武器になる
  • traceの使い方がまだわからない
    • 教えて偉い人