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

GCにおけるパフォーマンス改善

muroon
June 02, 2023

 GCにおけるパフォーマンス改善

muroon

June 02, 2023
Tweet

More Decks by muroon

Other Decks in Technology

Transcript

  1. 1.18と1.19におけるGC関連の変更 • 1.18における追加機能 ◦ GCの実行頻度決定にスタック スキャンなどの非ヒープソースが含まれ、 オーバーヘッドの予測制 度がより向上 • 1.19での追加機能

    ◦ Soft Memory Limitが導入 ▪ Goのヒープとランタイムによって管理されるすべてのメモリにおいてソフトメモリ制限をサポー ト ▪ 下記に代表されるの外部メモリリソースは対象外 1. バイナリ自体のマッピング 2. 他の言語で管理されるメモリ 3. OSによって保持されるメモリ ▪ runtime/debug.SetMemoryLimitまたはGOMEMLIMIT環境変数を介して管理可能 ▪ GOGC=off時でも当設定は有効
  2. 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コストは、サイクルごとの固定コストと、生存ヒープのサイズに比例し てスケールするマージナルコストとしてモデル化される。
  3. 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はメモリ使用量が物理メモリ容 量に近づくと頻繁に実行される
  4. 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が導入