$30 off During Our Annual Pro Sale. View Details »

GoのGC (garbage collector)について理解する

uji
April 22, 2022

GoのGC (garbage collector)について理解する

uji

April 22, 2022
Tweet

More Decks by uji

Other Decks in Technology

Transcript

  1. スライドトップと
 してご利用ください
 マネーフォワード事業本部 
 山田 太郎
 © Money Forward, Inc.

    GoのGC
 について理解する
 Understanding Go's GC
 Money Forward, Inc.
 uji
 © Money Forward, Inc.
  2. @uji_rb
 • Software engineer
 @Money Forward, Inc.(Osaka)
 
 • A

    three-year-old Gopher.
 
 • Kyoto.go
 © Money Forward, Inc. uji

  3. Today’s goal
 • GCの目的を理解してもらう
 Help them understand the purpose of

    GC.
 
 • GoのGCの仕組み、設計思想をざっくり理解してもらう
 Get a rough understanding of Go's GC structure and design philosophy.
 
 • Goのランタイムに興味を持ってもらう
 Get people interested in Go's runtime.
 © Money Forward, Inc.
  4. © Money Forward, Inc. Agenda
 • GCとは?
 What is the

    GC?
 
 • GoのGCの特長
 Features of Go's GC.
 
 • GoのGCの進化の軌跡
 The evolutionary path of Go's GC.

  5. © Money Forward, Inc. GCとは?
 What is the GC?


  6. © Money Forward, Inc. What is the GC?
 
 Garbage

    Collector
 
 or
 
 Garbage Collection
 
 

  7. © Money Forward, Inc. メモリ上のごみを見つけて回収し
 プログラムが再利用できるようにしてくれる
 
 Finds and collects

    garbage in memory and enables to reuse from programs.
 What is the GC?

  8. 煩わしい手動メモリ管理からの解放される
 You can get rid of manual memory management.
 


    より本質的なプログラミングに集中できる
 You can focus on 
 more essential programming.
 © Money Forward, Inc. With GC

  9. 
 使われなくなったメモリ領域を
 手動で解放しなければならない
 We must release 
 unused memory space

    manually.
 
 メモリリークや脆弱性などが発生しないように
 プログラムを書く必要がある
 It could lead to memory leaks and vulnerabilities.
 © Money Forward, Inc. The world without GC

  10. 
 → No
 
 GC動作中にアプリの完全停止が発生
 During GC operation, Complete stoppage

    of the application occurs.
 © Money Forward, Inc. GCがあると良い事ばかり?
 Is it all good to have a GC?

  11. 
 → No
 
 GC動作中にアプリの完全停止が発生
 During GC operation, Complete stoppage

    of the application occurs.
 
 
 Stop The World (STW)
 © Money Forward, Inc. GCがあると良い事ばかり?
 Is it all good to have a GC?

  12. © Money Forward, Inc. 2分毎にパフォーマンスが悪化
 Performance deteriorates every 2 minutes


    Case study (Discord)
 https://discord.com/blog/why-discord-is-switching-from-go-to-rust

  13. © Money Forward, Inc. 2分毎にパフォーマンスが悪化
 Performance deteriorates every 2 minutes


    Case study (Discord)
 https://discord.com/blog/why-discord-is-switching-from-go-to-rust
 Go 1.9.2
 
 バージョンが古い
 Outdated version

  14. サービスが常に低レイテンシを求める場合STW の影響を考慮する必要がある
 
 If the service always requires low latency,

    we need to consider the impact of STW.
 © Money Forward, Inc. Stop The World

  15. Goはプロダクト開発をより生産的に
 するために生まれた言語
 Go was designed and developed to make product

    development more productive.
 
 本質的なプログラミングに集中させる思想がGoの 哲学と一致した
 The idea of focusing on essential programming coincided with Go's philosophy.
 © Money Forward, Inc. Why did Go choose GC?
 https://talks.golang.org/2012/splash.article

  16. © Money Forward, Inc. GoのGCの特長 Features of Go's GC.

  17. GCにおいて、
 スループットとレイテンシはトレードオフ
 In GC, 
 the Throughput and latency are

    a trade-off.
 
 
 Goはレイテンシに重きをおいている
 Go is latency oriented.
 © Money Forward, Inc.
  18. スループットは
 ハードウェアの進化によって向上していく
 Throughput increases with hardware evolution.
 
 ハードウェアで解決しづらいレイテンシを重視
 Focus

    on latency, which is difficult to solve with hardware
 © Money Forward, Inc. The Go Blog "Go GC: Prioritizing low latency and simplicity"
 Why does Go focus on latency?

  19. • チューニングパラメータは”GOGC”のみ
 Tuning parameter is "GOGC" only.
 
 • 非同期処理はGoユーザーと同様にGoroutineを利用


    Asynchronous processing uses Goroutine just like Go users.
 
 • アルゴリズムがシンプル
 Algorithm is simple.
 © Money Forward, Inc. 簡潔性を重視
 Emphasize simplicity.

  20. None
  21. © Money Forward, Inc. We are hiring!
 Money Forwardは
 Goを書きたいエンジニアを


    募集しています!
 (Go以外も書けます!)
 
 求人一覧 (HRMOS)

  22. “Concurrent Mark Sweep” (CMS)
 
 最古のGCアルゴリズム 
 “Mark Sweep” を改良したもの


    
 It is an improved version of the oldest
 GC algorithm "Mark Sweep".
 
 © Money Forward, Inc. Go's GC algorithm

  23. Mark Sweep
 アプリケーションで使われている
 メモリオブジェクトをMark
 Mark memory objects used in the

    application
 
 ↓ 
 
 MarkされていないオブジェクトをSweep
 Sweep unmarked objects
 © Money Forward, Inc.
  24. © Money Forward, Inc.

  25. © Money Forward, Inc. Target


  26. Mark phase
 © Money Forward, Inc.

  27. Sweep phase
 © Money Forward, Inc.

  28. Sweep phase
 © Money Forward, Inc.

  29. Mark Sweepの問題
 Mark Sweep's problems.
 GCが動き続けている間
 ずっとアプリケーションが止まり
 レイテンシが高くなる
 
 While

    the GC keeps moving.
 The application stops all the time and latency is high.
 © Money Forward, Inc.
  30. Mark Sweep とアプリケーションを
 同時に動作させる
 
 Run Mark Sweep and application

    in the same time.
 © Money Forward, Inc. Concurrent Mark Sweep (CMS)
 White
 未探索 unsearched
 Gray
 探索中 sarching
 Black
 探索済み sharched
 Use tri-color marking 

  31. 1. Sweep termination
 2. Mark
 3. Mark termination
 4. Sweep


    © Money Forward, Inc. Phases
 https://github.com/golang/go/blob/master/src/runtime/mgc.go
  32. Sweep termination phase
 © Money Forward, Inc. Application STW 前回のGCループを止めて


    消し残りを消しきる
 Erase the remainder
 of the previous loop.
 ↓
 オブジェクトを全て白にする
 Mark all objects white.

  33. Mark phase
 © Money Forward, Inc. Application

  34. Mark phase
 © Money Forward, Inc. Application Queuing

  35. Mark terminate phase
 © Money Forward, Inc. Application STW

  36. Sweep phase
 © Money Forward, Inc. Application

  37. オブジェクトの参照が切り替わったときに
 色の塗り忘れが発生する場合がある
 
 When object references are switched Color forgetting

    occurs.
 © Money Forward, Inc. 同時実行の問題
 Concurrency problems.

  38. © Money Forward, Inc. Example
 Allocation Forgetting to mark

  39. © Money Forward, Inc. Example
 Changing point. Forgetting to mark

  40. スループットの低下があるが
 アプリケーションを同時に動かせる
 Throughput is reduced, but applications
 can run concurrency.


    © Money Forward, Inc. 新しく確保されたオブジェクトは黒に 
 Mark the newly allocated object black. 
 親からの参照が切り替わったオブジェクトは灰色に Mark objects that have switched references from their parents gray.
 Write Barrier

  41. 1. Sweep termination
 2. Mark
 3. Mark termination
 4. Sweep


    © Money Forward, Inc. Reduced STW timing
 STW STW
  42. GoのGCはCMS + Write Barrierで
 低レイテンシを実現している
 Go's GC with CMS +

    Write Barrier Low latency is achieved.
 
 
 コンパクションや世代別GCなどは
 採用されていない
 No compaction or generational GC is employed.
 © Money Forward, Inc.
  43. なぜこのようなシンプルなアルゴリズムで低レイテンシを実現で きているのか?
 Why is it possible to achieve low latency

    with such a simple algorithm?
 
 • 値型の存在や高性能なエスケープ解析により、スタックが効率よく使 われるのでGCの負担が少ない
 The presence of value types and high-performance escape analysis make efficient use of the stack and reduce the burden on the GC.
 
 • TCMallocベースのメモリアロケーターが断片化を起こりづらい
 TCMalloc-based memory allocator is less prone to fragmentation.
 © Money Forward, Inc. ・Why golang garbage-collector not implement Generational and Compact gc? ・ Go Does Not Need a Java Style GC
  44. © Money Forward, Inc. GoのGCの進化の軌跡 The evolutionary path of Go's

    GC.
  45. ~ Go 1.2 Mark Sweep Go 1.3 Concurrent Sweep Go

    1.5 CMS, Write Barrier © Money Forward, Inc. ~ Go 1.5

  46. © Money Forward, Inc. Go 1.5
 Go GC: Prioritizing Low

    Latency and Simplicity

  47. © Money Forward, Inc. Go 1.6
 Go GC: Prioritizing Low

    Latency and Simplicity
 ヒープサイズが大きい場合で も低レイテンシを維持
 
 Low latency can be maintained even with large heap sizes.

  48. Go 1.8
 スタック再スキャンによるSTWを改善
 Eliminate STW due to stack rescanning.(proposal)
 Go

    1.10 アロケーションのレイテンシと全体的なオーバヘッド削減
 Reduce allocation latency and overall overhead.
 Go 1.12 Go1.8から対応していたスタック再スキャンによるSTW解消
 STW resolution by stack rescanning, supported since Go 1.8
 Go 1.13
 Scavengingをよりスマートに
 Smarter Scavenging.(issue)
 Go 1.14 goroutineがプリエンプティブになりGCの遅延削減
 Goroutine becomes preemptive and reduces GC delay
 Go 1.15
 GC動作中にReadMemStatsがブロックされる問題解消
 Fixed ReadMemStats blocking during GC operation.
 © Money Forward, Inc. Release History

  49. GC Pacerが改善された
 GC Pacer has been improved.
 
 GCの頻度を決める際、
 ヒープ以外(スタック等)も見るようになった


    When deciding how often to GC,
 added to look at other than heap (stack, etc.).
 
 GCの処理時間が減るかも
 Might reduce GC processing time.
 © Money Forward, Inc. Go 1.18 (released 2022/03)
 proposal "GC Pacer Redesign"

  50. © Money Forward, Inc. SLOs
 The Go Blog "Getting to

    Go: The Journey of Go's Garbage Collector"

  51. 改善の余地はまだまだある
 There is still room for improvement.
 
 どこまで進化するのかとても楽しみ
 I'm

    very excited to see how far it will evolve.
 © Money Forward, Inc. Future of Go's GC

  52. Summary
 • GCはプログラミングの難易度を下げ、
 プロダクト開発の本質に集中させてくれる
 GC makes programming easy and helps

    us focus on the essence of product development.
 
 • GoのGCは低レイテンシを重視しており、
 それをシンプルなアルゴリズムで実現している
 Go's GC emphasizes low latency and it is achieved with a simple 
 algorithm.
 
 • GoのGCはこれからも進化する
 Go's GC will continue to evolve.
 © Money Forward, Inc.
  53. 今回のセッションをきっかけに
 GoやGC、ランタイムについて
 興味を持ってもらえると嬉しいです
 I hope this session will spark your

    interest in 
 Go, GC, and runtime.
 
 
 ご清聴ありがとうございました
 Thank you for your attention.
 © Money Forward, Inc.
  54. Bibliography
 • ガベージコレクションのアルゴリズムと実装 中村 成洋, 相川 光, 竹内 郁雄(監修) https://tatsu-zine.com/books/gcbook


    • The Go Blog
 ◦ Getting to Go: The Journey of Go's Garbage Collector https://go.dev/blog/ismmkeynote
 ◦ Go GC: Prioritizing low latency and simplicity https://go.dev/blog/go15gc
 ◦ Go's New Brand https://go.dev/blog/go-brand
 • Go GC: Latency Problem Solved https://talks.golang.org/2015/go-gc.pdf
 • go gc algorithm 101https://speakerdeck.com/taxio/go-gc-algorithm-101
 • Go言語のGCについてhttps://engineering.linecorp.com/ja/blog/go-gc
 • GolangのGCを追う https://deeeet.com/writing/2016/05/08/gogc-2016
 • GoはいつGCするのか? https://zenn.dev/koron/articles/b96cccfa82c0c1
 • Dumpster diving the Go garbage collector https://blog.px.dev/go-garbage-collector/
 • Go言語のリアルタイムGC 理論と実践 https://postd.cc/golangs-real-time-gc-in-theory-and-practice
 
 Illustrations
 ©tottie / Renée French https://github.com/tottie000/GopherIllustrations 
 © Money Forward, Inc.