Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
GCにおけるパフォーマンス改善
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
muroon
June 02, 2023
Technology
900
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
GCにおけるパフォーマンス改善
https://gocon.jp/2023/sessions/LT1/
muroon
June 02, 2023
More Decks by muroon
See All by muroon
UZOUにおけるAerospike
muroon
0
290
go-athenaの大量データ取得を速くした方法
muroon
1
390
Goの静的解析を使用してAPI Doc Linterをつくる
muroon
0
76
Cloude Spannerの主キーの設計
muroon
0
58
Other Decks in Technology
See All in Technology
秘密度ラベル初心者が第1歩でつまづかないための「設計・運用」ポイント
seafay
PRO
1
500
UIパーツの設計を「型」から読み解く 〜TSKaigiのセッションから得た学び〜
yud0uhu
0
100
5分でわかる Amazon Connect_20260608
hwangbyeonghun
0
120
GitHub Copilot運用のリアル ~AI Credit時代にどう向き合うか~
takafumisu2uk1
0
470
「軸足」は 固定しなくていい - 熱量と強みで描く、しなやかなキャリアの形
kakehashi
PRO
1
280
Multi-Agent並列開発を 安全に回すための技術 / Technology for Safely Multi-Agent Parallel Development
tooppoo
0
210
Oracle Cloud Infrastructure:2026年6月度サービス・アップデート
oracle4engineer
PRO
1
360
コミュニティの有益性 ~JAWS Days 2026 での体験を通して~ / The Benefits of a Community ~Through My Experience at JAWS Days 2026~
seike460
PRO
0
290
ご挨拶「10周年を迎える共創ラボのこれまでとこれから」
iotcomjpadmin
0
140
AIチャット検索改善の3週間
kworkdev
PRO
2
190
LayerX コーポレートエンジニアリング室におけるサプライチェーンセキュリティへの取り組み / Supply Chain Security at LayerX Corporate Engineering
yuyatakeyama
3
850
[チョークトーク資料]AWS DevOps Agent を使いこなす / AWS Dev Ops Agent Chalk Talk AWS Summit Japan 2026
kinunori
4
800
Featured
See All Featured
Optimizing for Happiness
mojombo
378
71k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
300
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Deep Space Network (abreviated)
tonyrice
0
210
Technical Leadership for Architectural Decision Making
baasie
3
420
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
260
[SF Ruby Conf 2025] Rails X
palkan
2
1.1k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.5k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
450
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
220
Transcript
GCにおけるパフォーマンス改善
自己紹介 Toyohito Murooka 室岡 豊人 株式会社SpeeeにてUZOUという広告配信システムの開発に従事 https://twitter.com/muroon01 https://github.com/muroon
Goの広告配信アプリを1.17 ⇒ 1.19 を上げたときの結果 CPU負荷は変わらず、メモリ使用量を抑えられた 負荷試験の結果
Goの広告配信アプリを1.17 ⇒ 1.19 を上げたときの結果 レイテンシも変化なし 負荷試験の結果
アプリの設定 • GOMEMLIMITは未設定 (runtime/debug.SetMemoryLimitも不使用) • GOGCはデフォルト値 (=100) • 意図的にruntime.GC()も使用していない 特にチューニングすることなくても
レイテンシもCPU負荷も上げることなく、メモリ使用量が減少している
どんなサービス UZOUというメディアに関連する記事や広告を配信するネイティブアド配信プラットフォーム 2016年からサービスを開始しており 7年目のプロダクト
システム構成
アプリについて • 事前にデータ更新しておいてランタ イム処理のリソースアクセスはオン メモリとKVSへのReadのみ • Write処理は非同期で実施
アプリについて Goのバージョンアップ時の使用パッケージのバージョンのアップグレード • 基本的にはlatestのバージョンにアップグレード • ただし、一部のパッケージは別途個別にアップグレードを実施 ◦ メジャーアップグレードによる改修コストが大きく、現行バージョンにおけるEOL に余裕があるもの ◦
リソース側のバージョンを上げないと、Goのクライアントパッケージのバージョ ンがlatestにはアップグレードできないもの
1.18と1.19におけるGC関連の変更 • 1.18における追加機能 ◦ GCの実行頻度決定にスタック スキャンなどの非ヒープソースが含まれ、 オーバーヘッドの予測制 度がより向上 • 1.19での追加機能
◦ Soft Memory Limitが導入 ▪ Goのヒープとランタイムによって管理されるすべてのメモリにおいてソフトメモリ制限をサポー ト ▪ 下記に代表されるの外部メモリリソースは対象外 1. バイナリ自体のマッピング 2. 他の言語で管理されるメモリ 3. OSによって保持されるメモリ ▪ runtime/debug.SetMemoryLimitまたはGOMEMLIMIT環境変数を介して管理可能 ▪ GOGC=off時でも当設定は有効
GOのGCのGuide ドキュメントが公開 https://go.dev/doc/gc-guide
GOのGCのGuide https://go.dev/doc/gc-guide Goのガベージコレクタの役割と仕組 み Goのガベージコレクタは、自動的にメモリを管理し、必要に応じて割り当てとリサイクルを行う Goの値の生存場所 Goの値のメモリは、コンパイラが寿命を決定できない場合、ヒープにエスケープする。ガベージコレクタは、この動的メ モリ割り当てを特定し、クリーンアップする トレースガベージコレクション ガベージコレクションは、自動的にメモリをリサイクルする多くの異なる方法を指すことができる。このドキュメントの文
脈では、ガベージコレクションはトレースガベージコレクションを指し、ポインタを逐次的に追跡することで使用中のオブ ジェクトを特定する GCサイクル GoのGCはマーク-スイープGCであるため、大まかにはマークフェーズとスイープフェーズの 2つのフェーズで動作す る。これらのフェーズは、 GCがオフの状態と交互に回転し、これを GCサイクルと呼ぶ コストの理解 GCは、CPU時間と物理メモリという 2つのリソースを使用する。 GCのメモリコストは、前の GCサイクルで生存していた ヒープメモリ、マークフェーズ前に割り当てられた新しいヒープメモリ、そしてメタデータのスペース(これは前のコストに 比例するが、比較的小さい)から成る。 GCのCPUコストは、サイクルごとの固定コストと、生存ヒープのサイズに比例し てスケールするマージナルコストとしてモデル化される。
GOのGCのGuide https://go.dev/doc/gc-guide GOGC GOGCは、GCのCPUとメモリのトレードオフを決定 。各GCサイクル後のターゲットヒープサイズ、つまり次のサイクル での合計ヒープサイズのターゲット値を決定する。 GCの目標は、合計ヒープサイズがターゲットヒープサイズを超える 前に、コレクションサイクルを終了することである メモリ制限 Go
1.19で、ランタイムメモリをソフトに制限する方法が追加 された。従来から存在した GOGCはトレードオフを設定す るためには優れていたが、 利用可能なメモリが有限であるという事実を考慮 に入れていなかったため。ただしこの制 限はソフトリミットであり、必ずしもメモリ使用量を設定値以下に保証するものではない。 (強固なメモリ制限の結果、 GCに時間がかかりすぎてスラッシングが起きるのを避ける ) レイテンシ GoのGCはCPU時間を使用し、その動作頻度は GOGCパラメータで制御される。 GOGCが高ければCPU使用率は 低く、メモリ使用量は増加する 。逆にGOGCが低ければCPU使用率は高く、メモリ使用量は減少する 仮想メモリについて 物理メモリが不足しディスクが使用されるスワップアウトを極力避けるように、 GoのGCはメモリ使用量が物理メモリ容 量に近づくと頻繁に実行される
GOGC GC使用時のCPUとメモリのトレードオフを決定する環境変数 GOGCの値を高く設定すれば、CPU使用率は低く(結果レイテンシも低く )、メモリ使用量は増加する
GOGC 値が100(デフォルト値)の場合、 GC完了後のheapサイズ①にプラス100%(トータル200%)のheapサイズが使用されたら GCを実行する
メモリ制限 ピークのメモリがどれくらいかを設定できる (1.19から導入される)
メモリ制限 GOGCのみの設定だとヒープスパイクが発生時にピークメモリ使用量が急激に大きくなることを警戒 ただしこの制限はソフトリミットであり、必ずしもメモリ使用量を設定値以下に保証するものではない (強固なメモリ制限の結果、 GCに時間がかかりすぎてスラッシングが起きるのを避ける )
GoのGCの歴史 Go 1.4以前 単純なStop The World (STW) GC Go 1.5・1.6
新たなGCアルゴリズムが導入され、レイテンシが大きく改善された 将来のハードウェアが GCのスループットを改善することを見据えて スループットよりレイテンシを重視 Go 1.18 GCの実行頻度決定に非ヒープソースが含まれ、オーバーヘッドの予測制度がより向上 Go 1.19 Soft Memory Limitが導入
まとめ 従来GoのGCはレイテンシ重視と言われているだが、メモリ使用もなるべく抑えられるこ とを目指している模様 • Soft Memory Limit導入によりチューニングをより細かく設定する機能を提供 • 未チューニングでもGCがより効果的に動作する可能性あり (注意:1.19での弊社アプリでの検証結果による)
参考資料 https://tip.golang.org/doc/go1.18 https://tip.golang.org/doc/go1.19 https://go.dev/doc/gc-guide https://go.dev/blog/go15gc https://speakerdeck.com/uji/gofalsegc-garbage-collector-nituiteli-jie-suru https://deeeet.com/writing/2016/05/08/gogc-2016/ https://speakerdeck.com/taxio/go-gc-algorithm-101