Slide 1

Slide 1 text

What’s GOCACHEPROG ? 02/26/2025 sivchari CyberAgent The Go gopher was designed by Renée French.

Slide 2

Slide 2 text

自己紹介 GOCACHEPROGとは GOCACHEPROGの挙動 GOCACHEPROGを触ってみる GOCACHEPROGユースケース まとめ

Slide 3

Slide 3 text

自己紹介

Slide 4

Slide 4 text

● sivchari ○ X/GitHub @sivchari ● CIU ○ AKE (Astro Kubernetes Engine) ● CyberAgent Go Next Experts ● Go Conference メインオーガナイザー

Slide 5

Slide 5 text

GOCACHEPROGとは

Slide 6

Slide 6 text

● Go1.24からデフォルトからの機能 GOCACHEPROGとは

Slide 7

Slide 7 text

● Go1.21から実はGOEXPERIMENTで導入されていた ○ リリースノートへの記載はなし GOCACHEPROGとは

Slide 8

Slide 8 text

● リリースノート ○ https://tip.golang.org/doc/go1.24#gocacheprog The cmd/go internal binary and test caching mechanism can now be implemented by child processes implementing a JSON protocol between the cmd/go tool and the child process named by the GOCACHEPROG environment variable. This was previously behind a GOEXPERIMENT. For protocol details, see the documentation. cmd/goの内部バイナリ、テストキャッシュの機構は cmd/goツールとGOCACHEPROGで指定された子プ ロセス間のJSON protocolの実装により、子プロセスにより実装できるようになりました。以前は GOEXPERIMENTにより隠されており、詳細はドキュメントを参照してください。 GOCACHEPROGとは

Slide 9

Slide 9 text

● ドキュメント(cacheprog package) ○ https://pkg.go.dev/cmd/go/internal/cacheprog@master ○ デフォルトでは既存のファイルシステムによる内部で持っている キャッシュ機構を利用する ○ cacheprogにGOCACHEPROGで定義する必要のあるAPIが存在 する ■ This API is internal :( GOCACHEPROGとは

Slide 10

Slide 10 text

GOCACHEPROGの挙動

Slide 11

Slide 11 text

GOCACHEPROGの挙動 go/tool GOCACHEPROG build send capabilities put req put resp

Slide 12

Slide 12 text

● send capabilitiesの書き込みから開始される ○ 現在は Put, Get, Close ○ 起動するプロセスが何をできるかを送る(MCPみたい) ■ Putを消すと絶対にキャッシュがヒットしない ○ ユーザー主体での拡張は現状できない GOCACHEPROGの挙動

Slide 13

Slide 13 text

● それぞれのCapabilityには制約がある ○ Put ■ Action IDをキーとしてOutput IDとBodyを保存する必要が ある ■ 終了までローカルのファイルシステムにも書き込み、 DiskPathとして保持する必要がある ○ Get ■ キャッシュがない場合Missをtrueにする ○ Close ■ プログラムを終了させる GOCACHEPROGの挙動

Slide 14

Slide 14 text

GOCACHEPROGを触ってみる

Slide 15

Slide 15 text

● リポジトリはすでにいくつかある ○ https://github.com/search?q=GOCACHEPROG&type=rep ositories ● bradfitzさんのサンプルはgoroutine周りのハンドリングが失敗してい るため修正版を試してみる ○ https://github.com/or-shachar/go-tool-cache GOCACHEPROGを触ってみる

Slide 16

Slide 16 text

● git clone [email protected]:or-shachar/go-tool-cache.git ● go build -C cmd/go-cacher ● GOCACHEPROG="./cmd/go-cacher/go-cacher --verbose" go install std ○ 1回目はキャッシュがないため時間がかかる ○ 2回目はキャッシュが当たっていることがわかる GOCACHEPROGを触ってみる

Slide 17

Slide 17 text

GOCACHEPROGのユースケース

Slide 18

Slide 18 text

● CIの速度改善 ○ taring/untarringをやめる ○ 部分的なcache hit ■ build cacheはpackageごと ● メトリクス ○ ビルドのキャッシュヒット率 ● HTTP Serverによるキャッシュ共有 GOCACHEPROGのユースケース

Slide 19

Slide 19 text

まとめ

Slide 20

Slide 20 text

● GOCACHEPROGによりキャッシュの拡張が可能になった ● サブプロセスに委譲するような機構はプラグ化しやすく他言語、WASI などとの連携もできるようになりそう ● API定義を公開しているのでぜひご利用ください ○ https://github.com/sivchari/gocacheprog-api Summary