当消息通过清除或归并操作删除时,哈希轮中的每条消息 TTL 条目会泄漏,导致 CPU 和内存增长无限。
观察行为
如果带有 " Nats-TTL " 头条的信息在TTL起火前被删除(通过主体清洗或卷起),则在TTL散列轮中的条目就永远不会被删除。 当TTL到期时,过期的Msgs ' 发现信息已经消失,将条目留在原地,因此每道通行证上都会再次收集到信息。 这些条目持续在tw.db'中,并在重新启动后幸存下来。 溪流清洗不会清除它们;只有删除溪流才会清除.
由于每条烂入口都已经过去,过期计时器在250ms的地上再装起武器,每道通路走通了整个轮子,每道复制品上都有. 效果是CPU和内存无约束地增长,日志中没有任何内容.
就我们而言(2.14.6,R3文件流由带有 " Nats-Schedule-TTL:30s " + " Nats-Schedule-Rollup: sub " ,~0.5起火灾/s)的信息表驱动,在4周内为持有11个信息流的113万个 stale admit,每个经纪人闲置地焚烧了200-270米CPU. 在100米的限制下 这完全节制了经纪人 打破了客户靴子。
过期的Msgs'的主题标记分支已经处理了此案(如果 sm == {fs.ttls. 删除(.) ; 平分行没有 。 `emStore'也有同样的漏洞。
预期行为
TTL条目,其信息已经消失,应在下个过期通行证上从散列轮上丢出,如同`过期的Msgs'的主题标记分支那样。 只有真正的去除失败(写出错误,关闭的商店)才应当保留条目进行重试.
这样一来,车轮仍然被活的TTL消息数量所束缚,"thw.db"没有增长,过期时间器只在实际到期时才回放出出,一个已经携带了被打碎的条目的服务器在升级后的第一个通过时会痊愈,而不去掉流.
QQ 服务器和客户端版本
服务器:nats-server v2.14.6(官方"nats:2.14.6-alpine"图像,3个节点集群). 代码路径在"main"上没有变化,截至3c80d8f (2026-09-11),在v2.14.7-RC.1和v2.15.0-RC.1中.
客户端:nats.go v1.52.0(仅与发布调度SET相关;漏出完全为服务器侧).
- 主机环境
Kubernetes v1.36.0 on Talos Linux v1.13.5 (内核6.18,容器2.2.5), 3个节点, amd64, 8 vCPU / 16 GB (赫茨纳云). NATS与官方的Helm图2.14.6一起部署,每个节点一个服务器,JetStream文件商店,每个服务器一个10个Gi块量.
集装箱资源 " 要求:========================================================================================================================================================================================================================================================= 并非针对特定环境的:泄漏在存储码中,在单个 " fileStore " / " memStore " 的单元测试中复制,没有涉及集群。
- 复制步骤
单位级(决定因素,不需要分组),与“主要”相对:
- 创建一个 " 文件存储 " ,其中 " AllowMsgTTL: true " ( " Allow Rollup: true " 不要求存储级重写)。
- “StoreMsg”(“test.a”、“0”、“0”、“1”)10次(1立特)。 `fs.ttls.Count ()'为10.
- `fs.PurgeEx ("test.a", 0, 0)' - 删除所有 10 . . . . . . .
内容来源: nats-io/nats-server