背景:
Java は GC 中断時間 A に直面していますボトルネックが長すぎると、テラバイト単位のメモリを効果的に利用できなくなります。 Go GC は最適化されているため、テラバイト レベルのメモリ環境で十分に短い GC 中断時間を達成できるかどうか疑問に思わずにはいられません。
質問:
答え:
ポイント:
詳細:
Go ヒープには 512 GB の制限があり、実際にテストされた最大ヒープ サイズは 240 GB です。
Go 1.5 GC は、GC 作業を削減するのではなく、GC 中断時間を削減するように設計されています。 GC がスタックとグローバル変数のポインターをスキャンしている間、コードは中断されます。
GopherCon 2015 での講演のグラフによると、以下に示すように、1.5 GC は最大 18GB ヒープの GC ベンチマークで停止時間が短くなります。
[グラフ: GC 停止時間とヒープの関係サイズ、バージョン 1.5 での改善を示しています]
実際のアプリケーションでは、元の GC 中断時間の一部が300 ミリ秒だったプロセス レポートは 4 ミリ秒と 20 ミリ秒に低下し、別のアプリケーションでは 95 パーセンタイルの GC 時間が 279 ミリ秒から 10 ミリ秒に報告されました。
Go 1.6 はさらに最適化されており、一部の作業がバックグラウンドで行われます。その結果、次の図に示すように、ヒープ サイズが 200 GB を超えた場合でも、テストの最大割り込み時間は 20 ミリ秒のままです。
[グラフ: 1.6 GC 時間はヒープ サイズに応じて変化し、およそ 20 ミリ秒に達します。 180GB]
バージョン 1.6 では、ヒープ サイズは約 8GB で、アプリケーションは 1 分あたり約 150M を割り当てます。 20 ミリ秒が 3 ~ 4 ミリ秒に短縮されました。
Twitch は Go を使用してチャット サービスを実行しており、バージョン 1.7 では多数のコルーチンを同時に実行する際の一時停止時間が 1ms に短縮されたと報告しています。
1.8 スタック スキャンを stop-the-world フェーズから移動し、ヒープが大きい場合でもほとんどの割り込み時間を 1ms 未満に保ちます。初期のテスト結果は良好な状態を示しています。場合によっては、コルーチンの割り込みを困難にし、他のすべてのスレッドの割り込み時間を事実上延長するコード パターンがアプリケーションに依然として存在することがありますが、全体としては、GC のバックグラウンド作業の方が GC 割り込み時間よりも重要であるのが通常です。
一般的な観察:
言い換えると、アプリケーションが大量のメモリにアクセスする場合でも、ポインタの数が少ない場合 (例: [] バイト バッファが比較的少なく、割り当て率が低いため (たとえば、メモリ オーバーフローが最も起こりやすいシナリオでメモリを再利用するために sync.Pool が適用されるため)、GC 問題は存在しない可能性があります。
したがって、数百 GB のヒープを備えた大型コンピューターを検討していて、本質的に GC には適していない場合は、次のオプションを検討することをお勧めします:
以上がGo 1.5 のガベージ コレクターはテラバイト規模のメモリ管理に対応していますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。