Skip to content

fix(runtime): bound streaming memory pressure - #3801

Merged
Dallas98 merged 4 commits into
developfrom
fix/runtime-memory-pressure
Aug 28, 2026
Merged

Dallas98 merged 4 commits into
developfrom
fix/runtime-memory-pressure

Conversation

@JasonW404

@JasonW404 JasonW404 commented Aug 28, 2026

Copy link
Copy Markdown
Member

修改概述

  • 将进程内 SSE 本地重放同时按事件数和字节数限制;默认字节上限为 8 MiB,配置名为 RUNTIME_STREAM_LOCAL_REPLAY_MAX_BYTES
  • 本地 replay 使用绝对事件游标,旧事件淘汰后仍能保证保留区间内的恢复订阅有序且不重复。
  • 将可合并模型输出由逐块字符串拼接改为片段累积、结束时一次性合并,消除超线性拼接开销。
  • 增加活动运行、频道、生产者、本地重放字节、持久化字节和清理结果等运行时观测字段。
  • 增加不会被 pytest 自动收集的 test/stress 后端压力与复现脚本;运行证据保留在独立验证报告和隔离环境中,不提交到代码仓库。

根因与修复效果

  • 主要根因一:进程内 SSE 历史会近似逐字节保留完整输出。256 MiB 输入在未限制时增加约 256.6 MiB RSS;限制后仅增加约 8.1 MiB,保留量稳定在 8 MiB。
  • 主要根因二:持久化阶段对可合并输出反复执行字符串拼接,同时保留另一份输出表示。32 MiB 场景由 47.757 秒降至 0.035 秒,最终内容字节一致。
  • Python 分配器高水位会使已释放对象对应的 RSS 不立即回落;三轮相同压力下活动对象归零且峰值/静默值不再逐轮增长,符合分配器高水位而非持续泄漏的特征。

验证结果

  • 受影响后端测试:519 passed in 10.89s
  • 最终后端镜像在 Ubuntu 26.04 Multipass 隔离 VM 中构建,容器设置 2 GiB 内存硬限制。
  • 有界本地重放:发布 512 个 64 KiB 事件,仅保留最后 128 个(8 MiB);绝对游标为 384,保留区间重放有序且无重复。
  • 断连与清理:客户端收到首事件后断连,后台仍完成全部 50 个事件;完成后频道、生产者和运行计数均为 0。
  • 持久化合并:32 MiB 片段一次性合并,SHA-256 一致,内部片段字段已移除,耗时约 0.030 秒。
  • 重复压力:三轮、每轮 20 并发 × 64 MiB;每轮本地保留 160 MiB,进程峰值约 630 MiB,静默 RSS 约 484 MiB,三轮无增长并低于 1.2 GiB 验收线。
  • 新增后端验证脚本通过 Ruff 和 py_compile

验证范围说明

  • 本次没有修改 Redis 写入、读取、游标或跨 Pod 路由,因此跨 Pod Redis 恢复不是本次本地 replay 字节上限的发布门槛。
  • 本次没有引入 producer 生命周期修复;成功和客户端断连路径已通过后端集成验证,其余未改动的 stop/timeout/error/shutdown 路径由受影响回归测试覆盖。
  • 性能变化集中在持久化字符串合并算法,等载荷 A/B 已证明处理时间显著改善且输出一致;产品端点 p95 会混入模型和网络波动,不作为该算法修改的必要验收指标。
  • 本次不改变模型调用、Prompt、工具、Token 或遥测逻辑,因此 Langfuse Trace 不是必要测试手段。真实模型 1/5 用户 smoke 已执行通过,但仅作为环境兼容性补充证据。
  • 本次没有 Nexent 前端改动,因此不使用合成 HTML 页面或截图作为后端运行证据。

@JasonW404
JasonW404 requested a review from WMC001 as a code owner August 28, 2026 06:47
Copilot AI lite review requested due to automatic review settings August 28, 2026 06:47

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@codecov

codecov Bot commented Aug 28, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 96.77419% with 2 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
backend/agents/agent_run_manager.py 60.00% 2 Missing ⚠️

📢 Thoughts on this report? Let us know!

@Dallas98
Dallas98 merged commit a844657 into develop Aug 28, 2026
13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants