Files
Jyotisha/docs/testing/api-disk-cache-retention-ab-20261013.md
T
jesse-uxandGrok (agent loop) 81e2e1cfed 服务器缓存按期限清理,审计快照默认不再落地
排盘缓存、官方快照、负缓存、网关任务和分盘段过期后会删掉。同一张盘的数字写法合成一把缓存键。失败快照只用短期限。自测留存、异步任务、增长合同、安全缓存和隐私标记;一万个文件的清理慢于 2 秒,命中率提升不到 2.5 倍,都按实测写入记录。

Co-Authored-By: Grok (agent loop)
2026-10-14 04:53:30 +08:00

3.6 KiB
Raw Blame History

磁盘缓存留存 A/B(2026-10-14)

对照的是本分支的父提交 66cd60081f37a57680274633fcb3fb942d01bb2f(建分支时的 origin/staging)。任务书里写的 77057a819 已经不是当前测试线头。A 用 git show 把父提交的接口文件载入同一进程,并把它的仓库路径指回本工作树,否则临时副本找不到引擎。B 是本分支。

演练用虚构盘,不写真实出生资料。文件都在系统临时目录,不写工作树里的 scratch/。

主测量挡住了 jhora 和 vedastro 的导入。本机装了 VedAstro SDK,并且能连上官方端口;另有一组不挡 SDK、但仍关闭外网取数,见文末。

命令

.venv\Scripts\python.exe scripts\research\api_chart_cache_byte_diff.py
.venv\Scripts\python.exe scripts\research\api_disk_cache_ab.py
.venv\Scripts\python.exe scripts\research\api_disk_cache_ab.py --with-sdk --sdk-probe

命中率

20 张虚构盘 × 3 种写法 × 快速/完整 × 7 天 × 每种重复 3 次 = 2520 次取键。取键用的是真实缓存键函数,没有把 2520 次都做成完整排盘。

改前 A 改后 B 变化
不同缓存键 840 280 少 560
命中次数 1680 2240 多 560
命中率 0.6667 0.8889 B / A = 1.333

目标是混合写法下 B 至少为 A 的 2.5 倍。按任务书规定的「重复 3 次」算,没有达到:A 自己靠重复就已经有三分之二命中,写法合并只能再抬到约 89%。若不算这 3 次重复、只看三种写法各问一次,A 的命中率是 0,B 是 0.6667。目标数字不改。

七天后的文件

留存演练写的是短记录,用来数文件,不是完整盘面。期限 900 秒,只有当天的键还没过期。

改前 A 改后 B
清理前文件数 840 280
清理前字节 109200 36400
清理后文件数 840(旧代码没有这份清理) 40
当天仍有效的键 120 40

B 清理后的文件数等于当天有效键数,达到「不超过当天活跃键」的目标。

审计文件:B 在默认关闭时写出 0 个。达到目标。

负缓存:种入当天和前一天各一份,清理后剩 1 份(当天)。达到目标。

清理耗时

场景 结果
预置 10000 个已过期排盘缓存后,整次清理 20.174 秒,排盘目录 20170.902 毫秒,删掉 10000,剩下 0
上面七天演练里的排盘目录 370.161 毫秒

目标是 10000 个文件在 2 秒内、且不在请求线程。本次在后台函数里测,不在请求线程;耗时没有进 2 秒。这是 Windows 上逐个读文件再删除的实测,目标不改。默认清理间隔仍是 1800 秒,失败快照短期限仍是 300 秒,不因为这次没进 2 秒就改默认值。

排盘耗时(一次虚构盘,快速排盘,外网关闭)

中位数
未命中 3 次 23.036 毫秒
命中 3 次 5.249 毫秒

响应是否还是同一张盘

数值等价的写法(小时 12 / 12.0 / "12",纬度数字和字符串,时区 5.5 和 "5.5",秒缺省和 0)在快速排盘下去掉 runtime_cache 后逐字节相同。完整排盘只差官方快照缓存上的写入时刻和到期时刻,盘面没有别的差异。父提交和本分支对同一张快速排盘、去掉 runtime_cache 后逐字节相同。因此这些字段可以合并进同一把缓存键。

不挡 SDK 的一组:本机有 VedAstro SDK,官方端口能连通。探针仍关闭外网取数。一次完整排盘 4.167 秒,没有报错。没有拉取真实快照。