Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
GCにおけるパフォーマンス改善
Search
muroon
June 02, 2023
Technology
940
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
310
go-athenaの大量データ取得を速くした方法
muroon
1
410
Goの静的解析を使用してAPI Doc Linterをつくる
muroon
0
81
Cloude Spannerの主キーの設計
muroon
0
96
Other Decks in Technology
See All in Technology
Patterns in AI Driven Software Development
akosma
PRO
0
420
[General] 개발자로 해외 기업에서 일하기
skydoves
1
230
自律的なチームを作るためにTechPMがやらないこと
ny7760
0
410
20261031_IoTLT_vol140_kitazaki_v1.pdf
kitazaki
0
150
なぜ東京にいる私が、新潟の技術コミュニティを運営するのか by 八雲慎之助
yakumo
0
210
なぜAI時代に技術記事を書くのか?どう書くのか? 〜bunの場合〜
kworkdev
PRO
0
2.6k
Maestro MCPとClaude Code Skillsによる自律的なE2Eテスト支援
asmz
0
390
Jev の中身は50行で再現できる。でも本物との差はどこにあるのか
hisuzuya
0
270
(swiftc) NonCopyableとライフタイム修飾子
teamhimeh
0
160
攻撃 3 時間 vs 復旧 10 時間。アクセスキー流出の非対称性を体感するために CTF を作った話
kazzpapa3
1
130
SLOを阻む不安
sraku2159
0
200
reInvent2026stby LT00 "Change your life!"
shinichirokawano
1
510
Featured
See All Featured
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.9k
Abbi's Birthday
coloredviolet
4
11k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.8k
How Software Deployment tools have changed in the past 20 years
geshan
2
35k
How GitHub (no longer) Works
holman
316
150k
AI: The stuff that nobody shows you
jnunemaker
PRO
10
1.2k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
960
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
510
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
59k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
500
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
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