Slide 1

Slide 1 text

作って理解するGOCACHEPROG Go Conference 2025 @mazrean

Slide 2

Slide 2 text

mazrean ■ Goでツール等を作っている ● DIツールKessoku ● GOCACHEPROG実装GoCICa ■ SRE @DeNA @mazrean22 マズリーン 2

Slide 3

Slide 3 text

mazrean ■ Goでツール等を作っている ● DIツールKessoku ● GOCACHEPROG実装GoCICa ■ SRE @DeNA @mazrean22 マズリーン 3 今日はこの話

Slide 4

Slide 4 text

go buildしたことある 🙋

Slide 5

Slide 5 text

GOCACHEPROG知っている🙋

Slide 6

Slide 6 text

ビルドキャッシュ Goのコンパイル時にはキャッシュが存在する ■ ディスク上に保存 ■ 1ビルドで数千個キャッシュが作成・利用 6

Slide 7

Slide 7 text

GOCACHEPROG ビルドキャッシュをカスタムできる環境変数(1.24~) ■ go build時、指定パスの実行ファイル起動 ■ キャッシュread/writeのリクエストがくる ● 通信はjson+base64の独自形式 7 GOCACHEPROG=./my-cache-prog

Slide 8

Slide 8 text

GOCACHEPROGによるキャッシュ共有 マシン間でのキャッシュ共有 が可能 ■ 外部ストレージ にキャッシュ保存 ■ ディスク上になければ外部ストレージ参照 8

Slide 9

Slide 9 text

GOCACHEPROGによるキャッシュ共有 マシン間でのキャッシュ共有 が可能 ■ 外部ストレージ にキャッシュ保存 ■ ディスク上になければ外部ストレージ参照 9 これを作る

Slide 10

Slide 10 text

実装物詳細 ■ キャッシュ保存部分 を実装していく ● リクエスト処理部分は実装済み ■ S3互換ストレージ を使用 ● 運営側で準備済み 10 ここを作る

Slide 11

Slide 11 text

全体の流れ 1. ディスクの利用 2. S3互換ストレージの利用 3. 高速化方法の検討 11

Slide 12

Slide 12 text

Step 1: ディスクの利用 ■ ディスクへのキャッシュ保存・取得を実装 ■ 最低限のGOCACHEPROG実装が動作 12 Step 1

Slide 13

Slide 13 text

Step 2: S3互換ストレージの利用 ■ S3へのキャッシュ保存・取得を実装 ■ マシン間のキャッシュ共有が可能になる 13 Step 2

Slide 14

Slide 14 text

Step 3: 高速化方法の検討 ここまでの実装は実行速度が非常に遅い → 計測結果をもとに高速化の方法を議論 14 Step 3

Slide 15

Slide 15 text

15 自己紹介 (名前・所属・Go歴・好きな標準package) アイスブレイク(5分)

Slide 16

Slide 16 text

目次 1. ディスクの利用 2. S3互換ストレージの利用 3. 高速化方法の検討 16 Step 1

Slide 17

Slide 17 text

ActionとOutput goコマンドでのキャッシュ管理の概念 ■ Action: コンパイルの段階 ● 各パッケージのコンパイルなど ● Actionごとにキャッシュ ■ Output: Actionの成果物 ● パッケージのコンパイル結果など ● キャッシュの実体データとなる 17

Slide 18

Slide 18 text

Get・Putの入出力 ■ Get(取得): ActionをもとにOutputを取得 ● 入力: ActionID ● 出力: Outputの保存ファイル ■ Put(保存): Actionに対応するOutputを保存 ● 入力: ActionID、Output ● 出力: Outputの保存ファイルなど 18

Slide 19

Slide 19 text

データの保存方法 2種類のデータを保存 ■ メタデータ: Actionに関する情報 ● ActionIDでファイル名決定( {{ActionID}}-a.json ) ● 中身はActionに紐づくOutputのIDなど ● 今回はjsonで保存 ■ キャッシュデータ: Outputの本体データ ● OutputIDでファイル名決定( {{OutputID}}-d ) ● 中身はキャッシュデータ本体 19

Slide 20

Slide 20 text

Getの処理の流れ 20

Slide 21

Slide 21 text

実装箇所 cacheprog.go の2関数を実装 21

Slide 22

Slide 22 text

実装してみよう! リポジトリのstep 1説明を見て実装する 1. PutHandler 実装 2. GetHandler 実装 3. 動作確認 4. 発展1:リクエスト・レスポンスを見る 5. 発展2: リクエストのパースの処理を読む 22

Slide 23

Slide 23 text

23 The Power of PowerPoint - thepopp.com 15:30まで Step 1実装

Slide 24

Slide 24 text

目次 1. ディスクの利用 2. S3互換ストレージの利用 3. 高速化方法の検討 24 Step 2

Slide 25

Slide 25 text

実装してみよう! 変更内容はシンプル(簡単とは言っていない) ■ Put: S3にも2種類のファイルを保存 ■ Get: S3にフォールバック 25

Slide 26

Slide 26 text

Getの処理の流れ 26

Slide 27

Slide 27 text

やること リポジトリのstep 2説明を見て実装する 1. PutHandler 実装 2. GetHandler 実装 3. 動作確認 4. 発展1: 実行時間を比較する 5. 発展2: 速度のボトルネックを調査する 27

Slide 28

Slide 28 text

28 The Power of PowerPoint - thepopp.com 15:55まで Step 2実装

Slide 29

Slide 29 text

目次 1. ディスクの利用 2. S3互換ストレージの利用 3. 高速化方法の検討 29 Step 3

Slide 30

Slide 30 text

Step 2の実装は遅い キャッシュなし の通常ビルドより遅い ■ キャッシュを使う意味がない → 高速化が必須 30 GOCACHEPROGなし(キャッシュなし ) GOCACHEPROGあり(ディスク上キャッシュ有り )

Slide 31

Slide 31 text

推測するな、計測せよ 計測してボトルネックを見つける 1. ハードウェア のリソースは足りているか? 2. ロジック的に詰まる要素はないか? 31

Slide 32

Slide 32 text

ハードウェアのリソースは足りているか? OSごとのプロセス監視ツールで確認 32 CPU メモリ ネットワーク ディスクI/O

Slide 33

Slide 33 text

ロジック的に詰まる要素はないか? ■ go標準の計測ツールで計測 ● pprof の mutex ■ 計測を自分で仕込む ● 今回で言うと request.txt 33

Slide 34

Slide 34 text

やること 1. 個人での調査: 5分 ● ハードウェアリソース足りているか? ● 内部的に詰まっている箇所はないか? 2. ボトルネック議論: 5分 ● 1人1分弱で思ったことを1人ずつ言っていく ● ボトルネックを1つに絞り込む 3. 改善案議論: 5分 ● 2. で見つけたボトルネックの解決策を議論する 34

Slide 35

Slide 35 text

35 The Power of PowerPoint - thepopp.com 16:15まで Step 3作業

Slide 36

Slide 36 text

ボトルネック go buildからのリクエスト数 がボトルネック ■ 同時に$GOMAXPROCS個のみ ● request.txt の動きが不自然 ■ 歴史的経緯でこのようになっている ● GOCACHEPROG以前はCPUが処理のネック ● コア数以上の並列数があっても意味がない 36

Slide 37

Slide 37 text

解決策 ■ $GOMAXPROCSを大きくする ● 簡単 ● 代わりにCPUの効率低下 ■ リクエスト の先読み ● おすすめ ● 実装はかなり大変 37

Slide 38

Slide 38 text

解決策: 先読みdownload Get順序はPush順序を元に予測可能 → バックグラウンド で先にダウンロード 1. キャッシュの有無をロード 2. Push順序の早いものからダウンロード ● hitなら、完了までリクエスト返答待機 ● missなら即時に返答 38

Slide 39

Slide 39 text

さらなる高速化 ネットワーク・S3周りが詰まる ■ ネットワーク使用量削減 ● zstd圧縮 ■ S3の認証削減 ● 単一オブジェクト化 39

Slide 40

Slide 40 text

まとめ ■ GOCACHEPROGの実装は大変 ● 正直、コスパは最悪 ■ でも、面白い ● ツール開発のISUCON 40

Slide 41

Slide 41 text

GoCICa GitHub Actions用のGOCACHEPROG実装 ■ 自分では作りたくない人にはお勧め 41 https://github.com/gocica-go/gocica

Slide 42

Slide 42 text

アンケート ご協力よろしくお願いします! 42 https://forms.gle/sRnqAYCD7LxoqrSW8