GCチューニングしてAPI Gatewayのパフォーマンス改善

3.6K Views

May 20, 22

スライド概要

シェア

埋め込む »CMSなどでJSが使えない場合

各ページのテキスト
1.

GCチューニングしてAPI Gatewayのパフォーマンス改善 DMM.go #4 DMM.com 登石拓磨 2022/05/18 1 / 27

2.

自己紹介 2021 年新卒入社 プラットフォーム事業本部(以下 PF) 第三開発部 基盤開発 API Gateway の運用・改善をして います Takuma Toishi 登石 拓磨 2 / 27

3.

話すこと API Gatewayの概要 今回問題になったこと 調査・改善内容 話さないこと GCの詳しいアルゴリズム 3 / 27

4.

API Gateway 4 / 27

5.

API Gatewayの役割 PFのAPIを公開する 今のところメインは社内の他事業部向け ルーティングや認証認可のコントロールなど 5 / 27

6.

API Gatewayについて KrakenDというOSS(Go製)をベースに作っている Google Kubernetes Engine(GKE)上で稼働 リクエスト数 req/s mean 3500 max 6000 6 / 27

7.

詳しい話 宣伝 チームメンバーが書いた記事 → DMMの API-Gatewayを構築した話 (第一話) 7 / 27

8.

本題 何が問題だったのか 8 / 27

9.

レイテンシの悪化 Gatewayのレイテンシが悪化していた Gatewayを通してAPIを公開しようとしていたチームから相談 → APIを提供している人たちが困る 9 / 27

10.

改善前の状況 Gatewayのレイテンシがp99.9で1400msくらいになっていた p99は200msとかでまともだった 全体的(平均的に)に遅いわけではない 10 / 27

11.

特定のリクエストが遅いのか そういうわけでもない ヘルスチェック用の(単純な)エンドポイントでさえ遅い場合がある 例えば以下のようなことは考慮しなくて良さそう リクエストのサイズが大きいときに悪化している 特定のリクエストだけが通るような処理が悪さをしている 11 / 27

12.

プロファイル GCPのCloud Profilerを使って調査 GCがCPU時間の40%以上を占めていた → GCが走った時に遅くなっている? 12 / 27

13.

Prometheus 他にももうちょっと数値が見たい Prometheus ソフトウェア監視用のシステム Go用のクライアントライブラリがある OpenMetrics仕様に準拠している DatadogにOpenMetricsインテグレーションがある 他にGC関連のメトリクスで特徴的なものがないか 改善効果を確かめるのに役立った 13 / 27

14.

next_gc_bytes 次にGCが実行されるメモリ 14 / 27

15.

gc_duration_seconds.count GCの実行回数の累計 15 / 27

16.

heap_inuse_bytes 利用中のヒープのバイト数 16 / 27

17.

改善フェーズ 17 / 27

18.

GOGC Go の GC において調整できる唯一のパラメータ GC が走るヒープサイズを GC 後のヒープサイズに対する割合で指定 GOGC=100(default) GC 後のヒープサイズから 100%増えたら GC が走る GC 後のヒープが 100MB→ ヒープが 200MB になったら GC 参考 GC について: https://pkg.go.dev/runtime Go はいつ GC するのか?: https://zenn.dev/koron/articles/b96cccfa82c0c1 18 / 27

19.

GCの頻度を下げる GCの走るヒープサイズが大きくなれば頻度は下がる 変更前はGOGC=100 (デフォルトのまま) ヒープが2倍でGC GOGC=300にした ヒープが4倍でGC この変更で ヒープの量は(GOGC=100の)2倍になるはず GCの頻度は1/2になるはず レイテンシ→小さくなってほしい 19 / 27

20.

メモリ requests/limits 共に増やした GOGCを増やす→プロセスが使うメモリの最大値が増加する 20 / 27

21.

結果 21 / 27

22.

レイテンシ レイテンシ p99.9(ms) before after mean 1530 420 max 1850 652 22 / 27

23.

プロファイル CPU時間: 41.6% → 19.2%に 改善前 改善後 23 / 27

24.

メモリ使用量 増えた 想定通り 2 倍程度の増分 ヒープ使用量 24 / 27

25.

GCの頻度 before: 5.6 回/min after: 1.9 回/min 25 / 27

26.

気を付けたこと GOGC の調整でメモリ使いすぎないように 変更前/後で何がどう変化したか観測できるように準備した(だいじ!) 26 / 27

27.

まとめ レイテンシの悪化によって API 提供が阻害されていた GOGC の値を調整して、GC の頻度を減らした レイテンシの悪化が改善した 今後の課題 メモリの最適化をしたい alloc/req が小さくなれば GC の頻度は減るはず 費用と相談しつつ… 27 / 27