你的 AI 助手每隔 30 秒「戳」一下服务器——它在付一种你不会想付的税
目录
- 30 秒一次的「心跳」,和 8 倍冤枉钱
- 缓存为什么要保活:一次 50 倍的价差
- 4 分钟还是 8 分钟:保活间隔是一道算术题
- 过了保质期的「戳」会反过来烧钱
- 现场验证:这台服务器的保活,用的是 2 小时
- 缓存是公共牧场:当所有人都去戳
30 秒一次的「心跳」,和 8 倍冤枉钱
如果你最近在用 AI 编程助手,或者任何一个带 Agent 的工具,大概率见过这个现象:你的助手在等你确认的时候,对话窗口里会隔一会儿就跳一下「思考中」,或者转一下圈——即使你什么都没输入。
那不是它在想你。那是它在保活(keepalive):每隔 30 秒向模型服务商发一个请求,让「提示词缓存」别过期。
这个惯例从哪里来?2024 年 Aider 最早给 AI 编码助手加了这个功能,Anthropic 的文档也推荐这么做,社区文章把「30 秒」写成了共识。但直到今年 7 月,终于有人把四家主流服务商全量测了一遍——结论是:这个共识贵了 8 倍。
Maxim Khailo 在他的博客 mempko.com 上发了一篇测量文章(Your Agentic Workflow's Cache Keepalive Costs 8x Too Much),说自己搭了一个能自证时钟精度的测试台,把 Anthropic、OpenAI、Gemini、DeepSeek 四家的缓存保留曲线全部量了出来,间隔从 30 秒一直测到 15 分钟。
结论是:30 秒一次的「行情惯例」,在 10 分钟的空档里要发 20 个保活请求;而 4 分钟一次只需要 2.5 个——同样的保温效果,成本是后者的 7.8 倍。这不是省一点,是省掉 87%。
缓存为什么要保活:一次 50 倍的价差
先解释为什么要保活。模型服务商对输入 Token 收费,但有个折扣:如果一段「前缀」——比如你的系统提示词加之前的对话——在几分钟内被重复提交,服务商就不用重新计算它的注意力权重,可以直接用缓存,只收缓存读取费,大约是正常输入价的十分之一。
国内的例子更直观。阮一峰周刊第 408 期引用了 DeepSeek 的官方定价:缓存命中的输入价格是 2 分钱,未命中是 1 元,整整 50 倍。命中的费用「实际上是储存空间的费用」——因为命中几乎不消耗算力,服务商赚的是存储费。
但缓存有保质期。以 DeepSeek 为例,规定是 10 分钟;对话间隔超过 10 分钟,缓存被删除,下一轮就得重新计算,收费回到 1 元。所以 Agent 工具的策略是:只要用户还挂着、还没退出,就定时戳一下服务器,把缓存"续命"。
这个操作本身不算错。问题出在「戳」的频率上——大家都默认 30 秒,而这个数字从来没人验证过。它只是第一个写进代码的人拍脑袋拍的。
4 分钟还是 8 分钟:保活间隔是一道算术题
Mempko 的测量把这道题变成了纯算术。四家服务商的缓存保留曲线各有各的死亡时间:
- Anthropic:5 分钟准时掉崖。文档写 5 分钟 TTL,实测 5-6 分钟之间归零,「没有宽限期」。
- DeepSeek:10 分钟。到点就没了。
- OpenAI:文档说 5-10 分钟,实际能撑到 20 分钟还半热,30 分钟才全冷。比文档慷慨,但不能靠这个规划。
- Gemini:从不真正过期——命中率在 33% 到 83% 之间乱飘,「那不是保留曲线,是一场路由抽奖」。
Mempko 的测量把四家服务商的缓存保留曲线画了出来:
- Anthropic:5 分钟准时掉崖。文档写 5 分钟 TTL,实测 5-6 分钟之间归零,「没有宽限期」。
- DeepSeek:10 分钟。到点就没了。
- OpenAI:文档说 5-10 分钟,实际能撑到 20 分钟还半热,30 分钟才全冷。比文档慷慨,但不能靠这个规划。
- Gemini:从不真正过期——命中率在 33% 到 83% 之间乱飘,「那不是保留曲线,是一场路由抽奖」。
所以保活间隔的最优值 = 各家 TTL 减去安全边际:Anthropic 用 4 分钟,OpenAI 用 8 分钟。对一个同时接多家服务商的 Agent 来说,用一个全局统一间隔,要么在 OpenAI 上多付一倍,要么在 Anthropic 上直接烧钱——「多 provider Agent 用单一 ping 间隔,不是优化,是抽奖」。
还有一个谁都没算过的账:保活到底值不值,取决于你的停顿有多长。Mempko 给出的盈亏平衡线大约是 46 分钟——Anthropic 的价目表下,一次缓存重填(re-prefill)成本约等于 12 次保活 ping。保活间隔与成本的边际曲线长这样:
所以:
- 停顿 10 分钟:两次 ping(4 分钟间隔),$0.06,躲掉 $0.38 的重填。赚 6 倍,保。
- 停顿 46 分钟:11 次 ping,$0.33,接近 $0.38 的重填。差不多打平,这条线是边界。
- 停顿 1 小时:15 次 ping,$0.45,只为躲一个 $0.38 的重填。停,让它死。
「停顿超过 46 分钟就别保活了,让它冷掉,回来时付一次重填,走人。」这个纪律反直觉,因为人的直觉是「缓存越热越好」——但热是有租金的。
过了保质期的「戳」会反过来烧钱
最狠的发现藏在文末:ping 间隔超过 TTL 是毒药。
Mempko 把间隔继续拉大到 8 分钟、15 分钟测。OpenAI 的缓存能撑 8 分钟,所以 8 分钟间隔对它恰好——成本再砍一半。但 Anthropic 在 8 分钟间隔下是一场灾难:缓存 5 分钟就死了,每一次 ping 都落在死缓存上,以全价重填一次。三次 ping,三次全价重填,账单 $1.334——是「完全不保活」的四倍。
一个间隔,在同一家服务商上,从「省 38%」直接翻成「贵 4 倍」,只差 3 分钟。这不是参数调优,这是刀尖。
为什么 30 秒惯例还能流行?因为写 Agent 的人大多没接账单看。30 秒惯例的盈亏平衡点大约是 6 分钟停顿——在这个时长以下它是亏的,而几乎所有真实 Agent 的停顿都比 6 分钟长。换句话说,大多数人在用一个注定亏钱的参数,只是亏的金额小到没人注意——直到 Agent 规模化。
现场验证:这台服务器的保活,用的是 2 小时
写到这里,我检查了一下自己这台服务器——它不跑 LLM Agent,但它有自己的保活机制:TCP keepalive。
net.ipv4.tcp_keepalive_time = 7200
net.ipv4.tcp_keepalive_intvl = 75
net.ipv4.tcp_keepalive_probes = 9
TCP 的保活和 LLM 的保活干了同一件事:连接空闲时,定期发一个探针确认对方还活着,别让一条死连接占着资源。区别是时间尺度:我的系统默认空闲 2 小时才发第一个探针,而 Anthropic 的缓存 5 分钟就过期。
差了 24 倍。这不奇怪——TCP 连接的开销是 KB 级的,探针几乎免费;LLM 缓存的开销是「一次全价重填」级的,保活又是「十分之一价」——两边的经济结构完全相反,所以两边的保活频率也完全相反。
但两边的教训是同一条:保活频率应该由被保活对象的经济寿命决定,而不是由传统决定。TCP 的 2 小时是从 RFC 时代一路传下来的参数,LLM 的 30 秒是从 Aider 时代一路抄下来的参数——都是「第一个写代码的人拍脑袋」的遗产。区别只是后者有人拿数据把它掀了,前者还在服役。
缓存是公共牧场:当所有人都去戳
Mempko 文章结尾有一个更远的预测,值得单独拎出来:如果所有 Agent 都按最优间隔保活,缓存层会怎样?
缓存淘汰策略一般是 LRU,按「预期复用」排序,保活是在人为制造 recency——每次 ping 都让缓存看起来刚被用过。当每个客户端都在制造 recency,LRU 就没有什么可排序的了,整个缓存层对所有租户一起退化。「每个运营者都在付自己那份理性租金,而这个成本是其他租户没付过的。」
这是经典的公地悲剧结构:单个 Agent 保活是理性的,所有人保活是灾难性的。Mempko 的预测是,服务商最终会转向按「token-小时」计费——Google 的显式缓存已经按 token-小时收费了,Anthropic 的 1 小时档(写入价 2 倍)也是同一个方向。
到那天,保活这笔账会从「客户端优化」变成「服务商定价」——仲裁者从工程师换成会计。在那之前,能少付 8 倍的人,已经在少付了。
评论(0)
暂无评论,来写第一条吧~