Slide 1

Slide 1 text

実用的なGOCACHEPROG実装をするために golang.tokyo #40 @mazrean

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

目次 4 The Power of PowerPoint - thepopp.com 1 GoCICaとは 2 実装の工夫 3 効果 4 まとめ

Slide 5

Slide 5 text

目次 5 The Power of PowerPoint - thepopp.com 1 GoCICaとは 2 実装の工夫 3 効果 4 まとめ

Slide 6

Slide 6 text

go buildしたことある 🙋

Slide 7

Slide 7 text

GOCACHEPROG知っている🙋

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

GOCACHEPROGによるCI速度改善 プロポーザルの提案理由はCI速度改善 ■ キャッシュのdownload/uploadに時間かかる ■ download/uploadはIOネック ● コンパイルはCPUネック → 裏でdownload/uploadしたら速くなる? 9

Slide 10

Slide 10 text

GoCICa GitHub Actions用のGOCACHEPROG実装 ■ GitHub Actionsのキャッシュ機構を利用 ■ 最も実用的なGOCACHEPROG実装 ● GitHubのpublicリポジトリを自分の確認した体感 ● そもそもGOCACHEPROG実装自体が少ない 10

Slide 11

Slide 11 text

目次 11 The Power of PowerPoint - thepopp.com 1 GoCICaとは 2 実装の工夫 3 効果 4 まとめ

Slide 12

Slide 12 text

愚直な実装 12 DL/UL時間大幅増 → キャッシュなしより遅い

Slide 13

Slide 13 text

問題1: ネットワーク帯域を使いきれない 同時にリクエストはGOMAXPROCS個まで → 帯域を使いきれない! 13

Slide 14

Slide 14 text

問題2: Presigned URLのオーバーヘッド増加 ■ ダウンロード時にPresigned URL発行 ■ 発行回数が従来より大幅増 → オーバーヘッド増加 14

Slide 15

Slide 15 text

実装の工夫 工夫によりこれらを回避 1. 先読みdownload 2. 単一バイナリ化 15

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

実装の工夫: 単一バイナリ化 Azure Blob StorageはRangeヘッダーに対応 → キャッシュを単一バイナリ にまとめる ■ 独自バイナリフォーマットを作成 ● ヘッダーにprotobufでrangeなどを格納 ● 以降、バイナリを順に詰め込んでいる ■ Azure Blob Storage独自命令を活用 ● CommitBlockList: uploadしたBlockを後から結合 ● StageBlockFromURL: URLの中身を直でupload 17

Slide 18

Slide 18 text

実装の工夫: その他 ■ DataDog/zstdによるzstd圧縮 ● CGOによるzstd実装のGoバインディング ● Goの圧縮実装でスループット/圧縮率のバランスが最適 ■ 独自計測ツール作成 ● パフォーマンスチューニングで計測は必須 ● GitHub ActionsはCPU使用率などが取れない… ● GoCICa側でprocfsをcsvに吐き出し解決 18

Slide 19

Slide 19 text

目次 19 The Power of PowerPoint - thepopp.com 1 GoCICaとは 2 実装の工夫 3 効果 4 まとめ

Slide 20

Slide 20 text

導入方法 1行の追加のみでactionにより自動で設定完了 ■ GoCICaのインストール ■ GOCACHEPROG環境変数の設定 20

Slide 21

Slide 21 text

効果 キャッシュあり時、build時間2s程度減 ■ 初回はupload時間分遅くなる 21 GoCICa actins/cache キャッシュなし 3min16s 3min2s キャッシュ有り 41s 43s

Slide 22

Slide 22 text

今後の展望 ■ GitHub Codespacesなどでの活用検討 ● 従来キャッシュが使えない ● 使えるようになることで大幅に速くなる ■ S3対応 ● GitHub Enterprize Serverなどで嬉しい 22

Slide 23

Slide 23 text

目次 23 The Power of PowerPoint - thepopp.com 1 GoCICaとは 2 実装の工夫 3 効果 4 まとめ

Slide 24

Slide 24 text

まとめ ■ GOCACHEPROGで ビルドキャッシュをカスタムできる ■ CI高速化に利用できる ● 実装は大変だが… ■ GoCICaでGitHub Actionsのbuildを高速に 24

Slide 25

Slide 25 text

GoCICa 使ってみてください! ■ starよろしくお願いします 25 https://github.com/gocica-go/gocica

Slide 26

Slide 26 text

宣伝: Go Conference ワークショップやります! ■ 簡単なGOCACHEPROG実装を行う ■ 実用的な実装のためのノウハウを理解する 26 https://gocon.jp/2025/workshops/1000109/