Slide 1

Slide 1 text

スライドトップと
 してご利用ください
 マネーフォワード事業本部 
 山田 太郎
 © Money Forward, Inc. GoのGC
 について理解する
 Understanding Go's GC
 Money Forward, Inc.
 uji
 © Money Forward, Inc.

Slide 2

Slide 2 text

@uji_rb
 ● Software engineer
 @Money Forward, Inc.(Osaka)
 
 ● A three-year-old Gopher.
 
 ● Kyoto.go
 © Money Forward, Inc. uji


Slide 3

Slide 3 text

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.

Slide 4

Slide 4 text

© 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.


Slide 5

Slide 5 text

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


Slide 6

Slide 6 text

© Money Forward, Inc. What is the GC?
 
 Garbage Collector
 
 or
 
 Garbage Collection
 
 


Slide 7

Slide 7 text

© Money Forward, Inc. メモリ上のごみを見つけて回収し
 プログラムが再利用できるようにしてくれる
 
 Finds and collects garbage in memory and enables to reuse from programs.
 What is the GC?


Slide 8

Slide 8 text

煩わしい手動メモリ管理からの解放される
 You can get rid of manual memory management.
 
 より本質的なプログラミングに集中できる
 You can focus on 
 more essential programming.
 © Money Forward, Inc. With GC


Slide 9

Slide 9 text


 使われなくなったメモリ領域を
 手動で解放しなければならない
 We must release 
 unused memory space manually.
 
 メモリリークや脆弱性などが発生しないように
 プログラムを書く必要がある
 It could lead to memory leaks and vulnerabilities.
 © Money Forward, Inc. The world without GC


Slide 10

Slide 10 text


 → No
 
 GC動作中にアプリの完全停止が発生
 During GC operation, Complete stoppage of the application occurs.
 © Money Forward, Inc. GCがあると良い事ばかり?
 Is it all good to have a GC?


Slide 11

Slide 11 text


 → 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?


Slide 12

Slide 12 text

© Money Forward, Inc. 2分毎にパフォーマンスが悪化
 Performance deteriorates every 2 minutes
 Case study (Discord)
 https://discord.com/blog/why-discord-is-switching-from-go-to-rust


Slide 13

Slide 13 text

© 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


Slide 14

Slide 14 text

サービスが常に低レイテンシを求める場合STW の影響を考慮する必要がある
 
 If the service always requires low latency, we need to consider the impact of STW.
 © Money Forward, Inc. Stop The World


Slide 15

Slide 15 text

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


Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

GCにおいて、
 スループットとレイテンシはトレードオフ
 In GC, 
 the Throughput and latency are a trade-off.
 
 
 Goはレイテンシに重きをおいている
 Go is latency oriented.
 © Money Forward, Inc.

Slide 18

Slide 18 text

スループットは
 ハードウェアの進化によって向上していく
 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?


Slide 19

Slide 19 text

● チューニングパラメータは”GOGC”のみ
 Tuning parameter is "GOGC" only.
 
 ● 非同期処理はGoユーザーと同様にGoroutineを利用
 Asynchronous processing uses Goroutine just like Go users.
 
 ● アルゴリズムがシンプル
 Algorithm is simple.
 © Money Forward, Inc. 簡潔性を重視
 Emphasize simplicity.


Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

© Money Forward, Inc. We are hiring!
 Money Forwardは
 Goを書きたいエンジニアを
 募集しています!
 (Go以外も書けます!)
 
 求人一覧 (HRMOS)


Slide 22

Slide 22 text

“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


Slide 23

Slide 23 text

Mark Sweep
 アプリケーションで使われている
 メモリオブジェクトをMark
 Mark memory objects used in the application
 
 ↓ 
 
 MarkされていないオブジェクトをSweep
 Sweep unmarked objects
 © Money Forward, Inc.

Slide 24

Slide 24 text

© Money Forward, Inc.

Slide 25

Slide 25 text

© Money Forward, Inc. Target


Slide 26

Slide 26 text

Mark phase
 © Money Forward, Inc.

Slide 27

Slide 27 text

Sweep phase
 © Money Forward, Inc.

Slide 28

Slide 28 text

Sweep phase
 © Money Forward, Inc.

Slide 29

Slide 29 text

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.

Slide 30

Slide 30 text

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 


Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

Sweep termination phase
 © Money Forward, Inc. Application STW 前回のGCループを止めて
 消し残りを消しきる
 Erase the remainder
 of the previous loop.
 ↓
 オブジェクトを全て白にする
 Mark all objects white.


Slide 33

Slide 33 text

Mark phase
 © Money Forward, Inc. Application

Slide 34

Slide 34 text

Mark phase
 © Money Forward, Inc. Application Queuing

Slide 35

Slide 35 text

Mark terminate phase
 © Money Forward, Inc. Application STW

Slide 36

Slide 36 text

Sweep phase
 © Money Forward, Inc. Application

Slide 37

Slide 37 text

オブジェクトの参照が切り替わったときに
 色の塗り忘れが発生する場合がある
 
 When object references are switched Color forgetting occurs.
 © Money Forward, Inc. 同時実行の問題
 Concurrency problems.


Slide 38

Slide 38 text

© Money Forward, Inc. Example
 Allocation Forgetting to mark

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

スループットの低下があるが
 アプリケーションを同時に動かせる
 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


Slide 41

Slide 41 text

1. Sweep termination
 2. Mark
 3. Mark termination
 4. Sweep
 © Money Forward, Inc. Reduced STW timing
 STW STW

Slide 42

Slide 42 text

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.

Slide 43

Slide 43 text

なぜこのようなシンプルなアルゴリズムで低レイテンシを実現で きているのか?
 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

Slide 44

Slide 44 text

© Money Forward, Inc. GoのGCの進化の軌跡 The evolutionary path of Go's GC.

Slide 45

Slide 45 text

~ Go 1.2 Mark Sweep Go 1.3 Concurrent Sweep Go 1.5 CMS, Write Barrier © Money Forward, Inc. ~ Go 1.5


Slide 46

Slide 46 text

© Money Forward, Inc. Go 1.5
 Go GC: Prioritizing Low Latency and Simplicity


Slide 47

Slide 47 text

© Money Forward, Inc. Go 1.6
 Go GC: Prioritizing Low Latency and Simplicity
 ヒープサイズが大きい場合で も低レイテンシを維持
 
 Low latency can be maintained even with large heap sizes.


Slide 48

Slide 48 text

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


Slide 49

Slide 49 text

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"


Slide 50

Slide 50 text

© Money Forward, Inc. SLOs
 The Go Blog "Getting to Go: The Journey of Go's Garbage Collector"


Slide 51

Slide 51 text

改善の余地はまだまだある
 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


Slide 52

Slide 52 text

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.

Slide 53

Slide 53 text

今回のセッションをきっかけに
 GoやGC、ランタイムについて
 興味を持ってもらえると嬉しいです
 I hope this session will spark your interest in 
 Go, GC, and runtime.
 
 
 ご清聴ありがとうございました
 Thank you for your attention.
 © Money Forward, Inc.

Slide 54

Slide 54 text

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.