Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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.

    View Slide

  2. @uji_rb

    ● Software engineer

    @Money Forward, Inc.(Osaka)


    ● A three-year-old Gopher.


    ● Kyoto.go

    © Money Forward, Inc.
    uji


    View Slide

  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.

    View Slide

  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.


    View Slide

  5. © Money Forward, Inc.
    GCとは?

    What is the GC?


    View Slide

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


    Garbage Collector


    or


    Garbage Collection



    View Slide

  7. © Money Forward, Inc.
    メモリ上のごみを見つけて回収し

    プログラムが再利用できるようにしてくれる


    Finds and collects garbage in memory and
    enables to reuse from programs.

    What is the GC?


    View Slide

  8. 煩わしい手動メモリ管理からの解放される

    You can get rid of manual memory management.


    より本質的なプログラミングに集中できる

    You can focus on 

    more essential programming.

    © Money Forward, Inc.
    With GC


    View Slide


  9. 使われなくなったメモリ領域を

    手動で解放しなければならない

    We must release 

    unused memory space manually.


    メモリリークや脆弱性などが発生しないように

    プログラムを書く必要がある

    It could lead to memory leaks and vulnerabilities.

    © Money Forward, Inc.
    The world without GC


    View Slide


  10. → No


    GC動作中にアプリの完全停止が発生

    During GC operation, Complete stoppage of the
    application occurs.

    © Money Forward, Inc.
    GCがあると良い事ばかり?

    Is it all good to have a GC?


    View Slide


  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?


    View Slide

  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


    View Slide

  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


    View Slide

  14. サービスが常に低レイテンシを求める場合STW
    の影響を考慮する必要がある


    If the service always requires low latency, we
    need to consider the impact of STW.

    © Money Forward, Inc.
    Stop The World


    View Slide

  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


    View Slide

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

    View Slide

  17. GCにおいて、

    スループットとレイテンシはトレードオフ

    In GC, 

    the Throughput and latency are a trade-off.



    Goはレイテンシに重きをおいている

    Go is latency oriented.

    © Money Forward, Inc.

    View Slide

  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?


    View Slide

  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.


    View Slide

  20. View Slide

  21. © Money Forward, Inc.
    We are hiring!

    Money Forwardは

    Goを書きたいエンジニアを

    募集しています!

    (Go以外も書けます!)


    求人一覧 (HRMOS)


    View Slide

  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


    View Slide

  23. Mark Sweep

    アプリケーションで使われている

    メモリオブジェクトをMark

    Mark memory objects used in the application


    ↓ 


    MarkされていないオブジェクトをSweep

    Sweep unmarked objects

    © Money Forward, Inc.

    View Slide

  24. © Money Forward, Inc.

    View Slide

  25. © Money Forward, Inc.
    Target


    View Slide

  26. Mark phase

    © Money Forward, Inc.

    View Slide

  27. Sweep phase

    © Money Forward, Inc.

    View Slide

  28. Sweep phase

    © Money Forward, Inc.

    View Slide

  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.

    View Slide

  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 


    View Slide

  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

    View Slide

  32. Sweep termination phase

    © Money Forward, Inc.
    Application
    STW
    前回のGCループを止めて

    消し残りを消しきる

    Erase the remainder

    of the previous loop.

    ↓

    オブジェクトを全て白にする

    Mark all objects white.


    View Slide

  33. Mark phase

    © Money Forward, Inc.
    Application

    View Slide

  34. Mark phase

    © Money Forward, Inc.
    Application
    Queuing

    View Slide

  35. Mark terminate phase

    © Money Forward, Inc.
    Application
    STW

    View Slide

  36. Sweep phase

    © Money Forward, Inc.
    Application

    View Slide

  37. オブジェクトの参照が切り替わったときに

    色の塗り忘れが発生する場合がある


    When object references are switched Color
    forgetting occurs.

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

    Concurrency problems.


    View Slide

  38. © Money Forward, Inc.
    Example

    Allocation Forgetting to mark

    View Slide

  39. © Money Forward, Inc.
    Example

    Changing point. Forgetting to mark

    View Slide

  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


    View Slide

  41. 1. Sweep termination

    2. Mark

    3. Mark termination

    4. Sweep

    © Money Forward, Inc.
    Reduced STW timing

    STW
    STW

    View Slide

  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.

    View Slide

  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

    View Slide

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

    View Slide

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


    View Slide

  46. © Money Forward, Inc.
    Go 1.5

    Go GC: Prioritizing Low Latency and Simplicity


    View Slide

  47. © Money Forward, Inc.
    Go 1.6

    Go GC: Prioritizing Low Latency and Simplicity

    ヒープサイズが大きい場合で
    も低レイテンシを維持


    Low latency can be maintained
    even with large heap sizes.


    View Slide

  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


    View Slide

  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"


    View Slide

  50. © Money Forward, Inc.
    SLOs

    The Go Blog "Getting to Go: The Journey of Go's Garbage Collector"


    View Slide

  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


    View Slide

  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.

    View Slide

  53. 今回のセッションをきっかけに

    GoやGC、ランタイムについて

    興味を持ってもらえると嬉しいです

    I hope this session will spark your interest in 

    Go, GC, and runtime.



    ご清聴ありがとうございました

    Thank you for your attention.

    © Money Forward, Inc.

    View Slide

  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.

    View Slide