Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
GoのGC (garbage collector)について理解する
uji
April 22, 2022
Technology
8
3.1k
GoのGC (garbage collector)について理解する
uji
April 22, 2022
Tweet
Share
More Decks by uji
See All by uji
5分で完全理解するGoのiota
uji
3
2k
シンプルなモック生成ツール matryer/moq 使ってみた
uji
0
41
goroutine で panic すると親プロセスをまきこんで落ちる
uji
0
320
Goにおけるポインタの使いどころ
uji
0
170
Google Chromeで始めるVim
uji
0
110
Other Decks in Technology
See All in Technology
LINEのData Platform室が実践する大規模分散環境のCapacity Planning
line_developers
PRO
0
270
msal.jsのあれこれ
takas0522
0
1.5k
Embedded SRE at Mercari
tcnksm
0
810
jaws-ug-asa-datasync-20220510
hiashisan
0
470
街じゅうを"駅前化"する電動マイクロモビリティのシェアサービス「LUUP」のIoTとSRE
0gm
1
520
Power BIのモバイルと都 +1 / Tokyo
ishiayaya
0
140
エンタープライズにおけるSRE立ち上げとNew Relic選定に至った背景とは / SRE Startup and New Relic in the Enterprise
tomoyakitaura
2
140
Nutanix_Meetup_20220511
keigotomomatsu
0
150
Babylon.js v5 新機能の紹介
limes2018
1
1.1k
Devに力を授けたいSREのあゆみ / SRE that wants to empower developers
tocyuki
3
470
Oracle Database Technology Night #55 Oracle Autonomous Database 再入門
oracle4engineer
PRO
1
120
220510 プロセスマイニングを学ぶ PLAY与田さん
comucal
PRO
0
720
Featured
See All Featured
Code Reviewing Like a Champion
maltzj
506
37k
The Straight Up "How To Draw Better" Workshop
denniskardys
225
120k
Web Components: a chance to create the future
zenorocha
303
40k
Git: the NoSQL Database
bkeepers
PRO
415
59k
GitHub's CSS Performance
jonrohan
1020
410k
Designing for Performance
lara
596
63k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
12
890
Faster Mobile Websites
deanohume
294
28k
Producing Creativity
orderedlist
PRO
333
37k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
226
15k
Building Better People: How to give real-time feedback that sticks.
wjessup
343
17k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
315
19k
Transcript
スライドトップと してご利用ください マネーフォワード事業本部 山田 太郎 © Money Forward, Inc.
GoのGC について理解する Understanding Go's GC Money Forward, Inc. uji © Money Forward, Inc.
@uji_rb • Software engineer @Money Forward, Inc.(Osaka) • A
three-year-old Gopher. • Kyoto.go © Money Forward, Inc. uji
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.
© 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.
© Money Forward, Inc. GCとは? What is the GC?
© Money Forward, Inc. What is the GC? Garbage
Collector or Garbage Collection
© Money Forward, Inc. メモリ上のごみを見つけて回収し プログラムが再利用できるようにしてくれる Finds and collects
garbage in memory and enables to reuse from programs. What is the GC?
煩わしい手動メモリ管理からの解放される You can get rid of manual memory management.
より本質的なプログラミングに集中できる You can focus on more essential programming. © Money Forward, Inc. With GC
使われなくなったメモリ領域を 手動で解放しなければならない We must release unused memory space
manually. メモリリークや脆弱性などが発生しないように プログラムを書く必要がある It could lead to memory leaks and vulnerabilities. © Money Forward, Inc. The world without GC
→ No GC動作中にアプリの完全停止が発生 During GC operation, Complete stoppage
of the application occurs. © Money Forward, Inc. GCがあると良い事ばかり? Is it all good to have a GC?
→ 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?
© Money Forward, Inc. 2分毎にパフォーマンスが悪化 Performance deteriorates every 2 minutes
Case study (Discord) https://discord.com/blog/why-discord-is-switching-from-go-to-rust
© 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
サービスが常に低レイテンシを求める場合STW の影響を考慮する必要がある If the service always requires low latency,
we need to consider the impact of STW. © Money Forward, Inc. Stop The World
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
© Money Forward, Inc. GoのGCの特長 Features of Go's GC.
GCにおいて、 スループットとレイテンシはトレードオフ In GC, the Throughput and latency are
a trade-off. Goはレイテンシに重きをおいている Go is latency oriented. © Money Forward, Inc.
スループットは ハードウェアの進化によって向上していく 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?
• チューニングパラメータは”GOGC”のみ Tuning parameter is "GOGC" only. • 非同期処理はGoユーザーと同様にGoroutineを利用
Asynchronous processing uses Goroutine just like Go users. • アルゴリズムがシンプル Algorithm is simple. © Money Forward, Inc. 簡潔性を重視 Emphasize simplicity.
None
© Money Forward, Inc. We are hiring! Money Forwardは Goを書きたいエンジニアを
募集しています! (Go以外も書けます!) 求人一覧 (HRMOS)
“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
Mark Sweep アプリケーションで使われている メモリオブジェクトをMark Mark memory objects used in the
application ↓ MarkされていないオブジェクトをSweep Sweep unmarked objects © Money Forward, Inc.
© Money Forward, Inc.
© Money Forward, Inc. Target
Mark phase © Money Forward, Inc.
Sweep phase © Money Forward, Inc.
Sweep phase © Money Forward, Inc.
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.
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
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
Sweep termination phase © Money Forward, Inc. Application STW 前回のGCループを止めて
消し残りを消しきる Erase the remainder of the previous loop. ↓ オブジェクトを全て白にする Mark all objects white.
Mark phase © Money Forward, Inc. Application
Mark phase © Money Forward, Inc. Application Queuing
Mark terminate phase © Money Forward, Inc. Application STW
Sweep phase © Money Forward, Inc. Application
オブジェクトの参照が切り替わったときに 色の塗り忘れが発生する場合がある When object references are switched Color forgetting
occurs. © Money Forward, Inc. 同時実行の問題 Concurrency problems.
© Money Forward, Inc. Example Allocation Forgetting to mark
© Money Forward, Inc. Example Changing point. Forgetting to mark
スループットの低下があるが アプリケーションを同時に動かせる 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
1. Sweep termination 2. Mark 3. Mark termination 4. Sweep
© Money Forward, Inc. Reduced STW timing STW STW
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.
なぜこのようなシンプルなアルゴリズムで低レイテンシを実現で きているのか? 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
© Money Forward, Inc. GoのGCの進化の軌跡 The evolutionary path of Go's
GC.
~ Go 1.2 Mark Sweep Go 1.3 Concurrent Sweep Go
1.5 CMS, Write Barrier © Money Forward, Inc. ~ Go 1.5
© Money Forward, Inc. Go 1.5 Go GC: Prioritizing Low
Latency and Simplicity
© Money Forward, Inc. Go 1.6 Go GC: Prioritizing Low
Latency and Simplicity ヒープサイズが大きい場合で も低レイテンシを維持 Low latency can be maintained even with large heap sizes.
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
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"
© Money Forward, Inc. SLOs The Go Blog "Getting to
Go: The Journey of Go's Garbage Collector"
改善の余地はまだまだある 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
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.
今回のセッションをきっかけに GoやGC、ランタイムについて 興味を持ってもらえると嬉しいです I hope this session will spark your
interest in Go, GC, and runtime. ご清聴ありがとうございました Thank you for your attention. © Money Forward, Inc.
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.