Skip to content

ci(cache): Actions cache budget が main で恒常的に 85% 閾値を超える(削除による緩和は main-cache-absent を生む) #926

Description

@rizumita

観測

maincache budget auditca2d5e7d (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つの事実が分かった。

  1. 使用量はすぐ埋め戻る。 削除の直後にローカルで測ると 5.99 GiB だが、audit の再実行時点では
    8.84 GiB だった。走行中の CI が保存を続けるため、この観測量は分単位で動く
    単発の計測で「解消した」と判断できない。
  2. 削除は main-cache-absent を新たに生む。 現行世代 0b9fd15e には wasm エントリが無く、
    wasmrefs/heads/main キャッシュは削除した 718c915e の1件だけだった。実測で確認:
    削除後に wasm を含むキャッシュは Linux-wasm-bindgen-cli-0.2.126(8 MB、別キー)のみ。
    結果として main-targeting PR の wasm ジョブがコールドになる。

つまり削除は運用的な緩和にならない。削除する場合は最低限「そのキーが refs/heads/main
唯一のエントリではないこと」を事前に確認する必要があり、それを確認すると削除できるキーはほとんど残らない。

求める対応(構造的削減)

以下のいずれか、または組み合わせ:

  1. 世代の並存を短くする。 キーに含まれる2つのハッシュ(718c915e / 0b9fd15e 側)が何に
    由来するかを明示し、restore-keys で旧世代から復元できるなら旧世代の保存を止める。
  2. 保存対象を絞る。 semantic-mutation (2.72 GiB) と rust-workspace (1.50 GiB) が
    同じ target/ の大部分を二重に持っていないか確認する。共有できるなら1つにする。
  3. 共有キーの main エントリを保証する。 main-cache-absent が出るキー集合について、
    main で必ず1エントリが保存される経路(どのワークフローがそのキーを save するか)を
    設計文書に書き、監査がその不在を検出したときの復旧手順も書く。
  4. 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 レーンと同じ性質を持つ。

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions