観測
main の cache budget audit が ca2d5e7d (push) で failure。run 33047056553。
budget-exhausted: cache usage is 11.55 GiB of a 10.00 GiB limit (116%), at or above the 85%
threshold. 11.55 GiB is 1.55 GiB above the limit; a sufficiently large save can trigger
least-recently-used eviction, including a default-branch cache that a main-targeting pull
request depends on.
内訳(実測、上位):
| サイズ |
key |
最終アクセス |
| 2.72 GiB |
v0-rust-semantic-mutation-Linux-x64-718c915e-9efe1eb7 |
06:29 |
| 2.72 GiB |
v0-rust-semantic-mutation-Linux-x64-0b9fd15e-9efe1eb7 |
06:46 |
| 1.50 GiB |
v0-rust-rust-workspace-Linux-x64-718c915e-9efe1eb7 |
06:46 |
| 1.50 GiB |
v0-rust-rust-workspace-Linux-x64-0b9fd15e-9efe1eb7 |
06:46 |
| 1.35 GiB |
v0-rust-wasm-Linux-x64-718c915e-9efe1eb7 |
06:46 |
| 1.16 GiB |
v0-rust-rust-native-z3-Darwin-arm64-cf75cde1-9efe1eb7 |
06:46 |
718c915e 世代と 0b9fd15e 世代が並存しており、大きい3キー
(semantic-mutation, rust-workspace, wasm)がそれぞれ二重に乗ると
それだけで 85% 閾値 (8.5 GiB) に達する。
削除による対処を試し、裏目に出た(記録)
旧世代 718c915e の3件(2.72 + 1.50 + 1.35 GiB)を削除して 11.55 GiB → 5.99 GiB (60%) にした。
その後 audit を再実行した結果は failure、finding が 2 件に増えた:
budget-exhausted: cache usage is 8.84 GiB of a 10.00 GiB limit (88%), ...
main-cache-absent: no `refs/heads/main` cache for shared key `wasm` on platform `Linux`.
2つの事実が分かった。
- 使用量はすぐ埋め戻る。 削除の直後にローカルで測ると 5.99 GiB だが、audit の再実行時点では
8.84 GiB だった。走行中の CI が保存を続けるため、この観測量は分単位で動く。
単発の計測で「解消した」と判断できない。
- 削除は
main-cache-absent を新たに生む。 現行世代 0b9fd15e には wasm エントリが無く、
wasm の refs/heads/main キャッシュは削除した 718c915e の1件だけだった。実測で確認:
削除後に wasm を含むキャッシュは Linux-wasm-bindgen-cli-0.2.126(8 MB、別キー)のみ。
結果として main-targeting PR の wasm ジョブがコールドになる。
つまり削除は運用的な緩和にならない。削除する場合は最低限「そのキーが refs/heads/main の
唯一のエントリではないこと」を事前に確認する必要があり、それを確認すると削除できるキーはほとんど残らない。
求める対応(構造的削減)
以下のいずれか、または組み合わせ:
- 世代の並存を短くする。 キーに含まれる2つのハッシュ(
718c915e / 0b9fd15e 側)が何に
由来するかを明示し、restore-keys で旧世代から復元できるなら旧世代の保存を止める。
- 保存対象を絞る。
semantic-mutation (2.72 GiB) と rust-workspace (1.50 GiB) が
同じ target/ の大部分を二重に持っていないか確認する。共有できるなら1つにする。
- 共有キーの main エントリを保証する。
main-cache-absent が出るキー集合について、
main で必ず1エントリが保存される経路(どのワークフローがそのキーを save するか)を
設計文書に書き、監査がその不在を検出したときの復旧手順も書く。
docs/DESIGN-ci.md の "Actions cache budget" 節 (docs/DESIGN-ci.md:514) に、
監査が赤になったときの正しい対応を書く。今回は「削除」を選んで finding を増やした。
その反例を節に残す。
補足
この audit は post-merge の main で走り、PR では cache budget audit wiring として別に緑になる。
つまり PR では検出されず main で初めて落ちるクラスであり、native Z3 レーンと同じ性質を持つ。
観測
mainのcache budget auditがca2d5e7d(push) で failure。run33047056553。内訳(実測、上位):
v0-rust-semantic-mutation-Linux-x64-718c915e-9efe1eb7v0-rust-semantic-mutation-Linux-x64-0b9fd15e-9efe1eb7v0-rust-rust-workspace-Linux-x64-718c915e-9efe1eb7v0-rust-rust-workspace-Linux-x64-0b9fd15e-9efe1eb7v0-rust-wasm-Linux-x64-718c915e-9efe1eb7v0-rust-rust-native-z3-Darwin-arm64-cf75cde1-9efe1eb7718c915e世代と0b9fd15e世代が並存しており、大きい3キー(
semantic-mutation,rust-workspace,wasm)がそれぞれ二重に乗るとそれだけで 85% 閾値 (8.5 GiB) に達する。
削除による対処を試し、裏目に出た(記録)
旧世代
718c915eの3件(2.72 + 1.50 + 1.35 GiB)を削除して 11.55 GiB → 5.99 GiB (60%) にした。その後 audit を再実行した結果は failure、finding が 2 件に増えた:
2つの事実が分かった。
8.84 GiB だった。走行中の CI が保存を続けるため、この観測量は分単位で動く。
単発の計測で「解消した」と判断できない。
main-cache-absentを新たに生む。 現行世代0b9fd15eにはwasmエントリが無く、wasmのrefs/heads/mainキャッシュは削除した718c915eの1件だけだった。実測で確認:削除後に
wasmを含むキャッシュはLinux-wasm-bindgen-cli-0.2.126(8 MB、別キー)のみ。結果として main-targeting PR の wasm ジョブがコールドになる。
つまり削除は運用的な緩和にならない。削除する場合は最低限「そのキーが
refs/heads/mainの唯一のエントリではないこと」を事前に確認する必要があり、それを確認すると削除できるキーはほとんど残らない。
求める対応(構造的削減)
以下のいずれか、または組み合わせ:
718c915e/0b9fd15e側)が何に由来するかを明示し、
restore-keysで旧世代から復元できるなら旧世代の保存を止める。semantic-mutation(2.72 GiB) とrust-workspace(1.50 GiB) が同じ
target/の大部分を二重に持っていないか確認する。共有できるなら1つにする。main-cache-absentが出るキー集合について、main で必ず1エントリが保存される経路(どのワークフローがそのキーを save するか)を
設計文書に書き、監査がその不在を検出したときの復旧手順も書く。
docs/DESIGN-ci.mdの "Actions cache budget" 節 (docs/DESIGN-ci.md:514) に、監査が赤になったときの正しい対応を書く。今回は「削除」を選んで finding を増やした。
その反例を節に残す。
補足
この audit は post-merge の main で走り、PR では
cache budget audit wiringとして別に緑になる。つまり PR では検出されず main で初めて落ちるクラスであり、
native Z3レーンと同じ性質を持つ。