web-technical-blog

web開発に関する技術メモ

Go勉強会メモ(#ca_go)

[概要]

サイバーエージェントのメディアサービスを担当している
Goエンジニアによる勉強会

[その他]

シリーズもので何回もやっていく予定との事
FRESH!にて生放送(以下を参考)
freshlive.tv
developers.cyberagent.co.jp

[タイムテーブル]

『sync.Poolで爆上げメモリ効率』
『知っておきたいinterfaceとreflect』
『今更だけどGob』
golang profilingの基礎』

================================================
『sync.Poolで爆上げメモリ効率』パフォーマンスチューニングについて

  • sync.PoolはGo1.3から標準パッケージに入った
  • パフォーマンスチューニングでメモリアロケーションを減らすのは超大事
  • sync.Poolでできることはメモリを上手いこと使いまわせる
  • メモリを捨てずに再利用することで新しくメモリを確保しなくて済む
  • sync.Poolを使用した場合と使用しない場合でのベンチマークを実施した結果はsync.Poolを使用した場合の方がメモリのアロケーションが少ない(メモリの無駄使いをしていない)

■実用的な使い方について(知見)

  • 用途に応じて適切な初期化する
  • Resetメソッドは使っておいた方が良い
  • 何でもとりあえずPollという話ではない
  • 高頻度で使いまわすでかいオブジェクトで使用するのがよいみたい

================================================
『知っておきたいinterfaceとreflect』←自分はあまり理解できる内容ではなかった...
■What is a Go interface(Go interfaceとは何か)

  • Goの中には色々なタイプがある大きく分けて2つある(concretetypeとabstracttypes)
  • interface{}

■Why usin an interface?(なぜinterfaceを使うのか)

  • GenericAlgorithm
  • HidingImplementationDetail
  • InterceptionPoint

■Go interface in Ownd!(Owndというサービスでどのあたりで使用しているのか)

  • MarshalHtml
  • type assertions
  • interfaceはメソッドの集合体ではなく、小さく使う(Rob Pike in his Go Proverbs)

■Where is the reflect?(refletcについて)

  • type assertions(*partially)
  • "Reflection is never clear"(ww)

================================================
『今更だけどGob』
Golang

  • サーバーサイド全般がGolang
  • API、データ連携、ログ集計、データ収集..etc
  • Recommendation以外はほとんどGolang
  • 大きなファイルを読んでDBに入れるバッチも

golevedb
bigcache

■Gobって?

  • gob形式のバイナリ変換
  • RPCのようなNW経由でのデータのやちとり(Golang同士でないと駄目)
  • ファイルへのデータ保存
  • データ定義不要,self-describing、効率的
  • 構造変更が可能

■encoding/jsonは?

  • []byteへのEncoder、Decoderがある
  • 両者でTypeが一致しなくても良い
  • gobと使い方は変わらない?

 GobEncode/JsonEncodeとGobDecode/JsonDecodeでベンチ比較
 ※Gobの方がメモリ、アロケーションを見ても効率的

■protobufは?

■注意点

  • interface使う時は注意(事前にgob.Registerする必要がある)

■まとめ

  • Golang専用のシリアライザー
  • 定義不要で効率的に利用可能
  • interface使う時は注意(事前にgob.Registerする必要がある)

================================================
golang profilingの基礎』
■Profiling of golang

  • GolangのProfilingを行うパッケージ
  • CPU、Memory、goroutineなどの情報を収集
  • protocol buffer形式でプロファイルを保存
  • `go tool pprof`によりプロファイルを分析

■CPU Profiler

  • 関数の実行時間をプロファイリング
  • CPU Profiler以外のProfilerはLookupで呼び出し
  • heap(Heap Profiler)

モリーのプロファイリング

  • goroutine(Goroutine Profiler)

 実行中のgoroutineのプロファイリング

  • block(Blocking Profiler)

 同期処理でwaitingしているgoroutineをプロファイリング
 ※runtime.SetBlockProfileRateを1以上に設定することで有効化

  • mutex(Mutex Profiler) go1.8から追加

 同期処理をブロックするmutexのみをプロファイリング
 ※runtime.SetMutexProfileFractionを1以上に設定することで有効化

■Relational Packages

  • runtime/pprof
  • net/http/pprof
  • HTTP Server用のプロファイラ
  • github.com/pkg/profile

 `runtime/ppfor`をより簡単に利用できるようなwrapper

■Check Point

  • runtime.mallocgc

 メモリアロケーションが多く発生している

  • runtime.chanrecv,sync.Mutex

 ロック処理により多くの待ちが発生している

  • syscall Read/Write

 ioの読み書きが大量に発生している

 ヒープサイズの小ささにより、GCの発生が頻繁に発生している

■Go Debug Options

  • Memory Allocator Trace

 GODEBUG=allocfreetrace=1

  • Garbage Collector Trace

 GODEBUG=gctrace=1

  • Scheduler Trace

 GODEBUG=schedtrace=1000 ./