作って理解するGOCACHEPROG / Go Conference 2025(Workshop)
by
mazrean
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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