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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
muroon
June 02, 2023
Technology
920
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
300
go-athenaの大量データ取得を速くした方法
muroon
1
400
Goの静的解析を使用してAPI Doc Linterをつくる
muroon
0
78
Cloude Spannerの主キーの設計
muroon
0
74
Other Decks in Technology
See All in Technology
AIネイティブプロダクトで顧客価値を最大化するプロダクトエンジニアとFDEの協働
righttouch
PRO
0
230
Screen Lens - 今見てる画面を翻訳する
komagata
0
250
Slack上でインフラをトラブルシュートする! Agentic Platform Engineeringの第一歩
teru0x1
3
1.1k
Code4Lib JAPANカンファレンス2026 開会挨拶 / Code4Lib JAPAN Conference 2026: Opening Remarks
ykiyota
0
340
2026-09-10 【Snowflake World Tour Tokyo 2026】dbt Core と Snowflake で実現する多層的なデータガバナンス / Multi-Layered Data Governance Powered by dbt Core and Snowflake
civitaspo
0
330
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
3
470
アリアドネの糸と、20年ごとの建て替え ── 長尾真『電子図書館』を、伊勢で読み直す / Rereading Makoto Nagao’s "Electronic Library" in Ise
ykiyota
0
160
Snowflakeで実現する全社横断の顧客の声(VOC)分析・活用基盤@Snowflake World Tour Tokyo 2026
yuto16
0
180
クロスボーダーM&AのValue Upを支えるプロダクト開発。日米チームのハブになったプロダクトエンジニアの実践 / Product Engineering Conference 2026
genda
0
120
深夜のクラウド懺悔室 1:29:300 or 1:0:0
kazzpapa3
1
230
2026/09/10 Spring Bootから Jakarta EE/MicroProfileへの移行
megascus
0
320
日経電子版を支えていく Kasane Design System/fec_fukuoka
nikkei_engineer_recruiting
0
880
Featured
See All Featured
What's in a price? How to price your products and services
michaelherold
247
13k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
290
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
440
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
A Soul's Torment
seathinner
7
3.6k
ラッコキーワード サービス紹介資料
rakko
1
4.8M
WCS-LA-2024
lcolladotor
0
820
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
490
Statistics for Hackers
jakevdp
799
230k
Ruling the World: When Life Gets Gamed
codingconduct
0
330
The Curious Case for Waylosing
cassininazir
1
500
Color Theory Basics | Prateek | Gurzu
gurzu
0
460
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