dsh web 内存持续泄漏:运行约 50 分钟 OOM 崩溃(附 4 处无界累积点定位) #3876
Replies: 6 comments 2 replies
|
让代理写的我只是直接复制过来声明 |
|
反正就是好影响使用的说(最开始我还以为是自己的问题) |
|
Cross-ref: #1550 (same family, cold-boot side) now has a controlled experiment showing that only physically moving session dirs out of Your four accumulators (FrameQueue buffer, (中文摘要:#1550 已实证仅移出 sessions 目录可恢复启动堆,且 rc.2 源码中 structuredClone seed 未变;你的四个无界累积点与冷启动全量物化同属一个设计缺口,互链存档。) |
|
同类问题 +1,顶一下,希望官方早点修复。 环境:WSL2 (Linux),@deepseek-ai/dsh 0.1.1-rc.2,Node v24.14.1, 复现过程:
排查结果:
和本贴 #1550 的现象一致,辛苦官方优先处理。 |
|
每个 Token 都会形成 assistant/chunk 事件; FrameQueue.buffer 无界; 判断 主要直接原因:子代理没有跨根会话的公平并发限制,单个会话耗尽 Codex 并发。 |
Linux 侧 +1:0.1.2-rc.1 仍复现(附活进程取证与 readRaw 单调用量化)补充一个 Linux 数据点,与 @yzke 的 gdb 结论和 #1550 的冷启动实验完全对上,并给 readRaw 的单调用内存代价一个直接测量值。 环境
崩溃形态重度使用(多会话并行)时段 20 分钟内 5 连崩,journal 全是 活进程取证(inspector + smaps,与本帖结论互相印证)对活进程做 HeapProfiler 采样 +
readRaw 单调用直接量化用最大的会话(45 MB zstd → 128 MB 明文)在隔离进程复刻 readRaw 的阶段开销:
即一次 readRaw ≈ 647 MB 峰值,崩溃栈里的 结构确认:structuredClone 种子在 0.1.2-rc.1 未变
缓解(与 #1550 的实验一致)+ 一个副作用数据点
想请教维护者的
(取证材料:堆快照/采样 profile/复刻脚本均有留存,需要可补充。) |
Uh oh!
There was an error while loading. Please reload this page.
现象
dsh web启动后 V8 堆内存持续增长,运行约 50 分钟触顶 4GB 后崩溃:崩溃前 GC 日志显示堆在约 3024 秒内从 4.0GB 涨到 4067/4090 MB,Mark-Compact 单次耗时 3.1 秒,期间服务卡死无响应。症状是"运行久了越来越卡,最后没响应"。
版本:
0.1.0-rc.5与0.1.1-rc.2均可复现。环境:Windows 11 x64,Node v26.3.0,pnpm 11.7.0。
复现步骤
pnpm dsh webhttp://127.0.0.1:3080,保持页面长连接(SSE/WebSocket)定位
我们排查到 4 个无界累积点(均附代码证据):
1.
FrameQueue.buffer无界队列(最严重)packages/host/apiproxy/src/api-proxy.ts每个 mux/host 订阅者一个队列,每个
session/event帧复制到每个订阅者队列一份。浏览器标签挂起/慢消费时(TCP 未断),帧无限堆积,每帧持有完整事件引用。2.
Session.log事件日志无界packages/core/session/src/index.ts—private log: SessionEvent[] = [],append-only 不裁剪。长时间 agent 会话事件永久驻留。3.
SessionProjectionCache缓存行从不删除packages/session/session-projection-cache/src/index.ts底层
KvTable(packages/storage/storage-domain/src/domain.ts)全量常驻内存 Map,行数随历史 session 数量无界增长。4.
SessionWriteBehind.pending写失败无限保留packages/session/session-persistence/src/write-behind.ts每个事件还
structuredClone一份。建议修复方向
FrameQueue加有界队列 + 背压/丢帧合并策略(或按session/event快照合并)Session.log提供裁剪/淘汰机制session/disposed时删除投影缓存行(或 LRU 上限)write-behind加重试上限/最大保留量附带问题
dsh web无条件挂载client-hmr(packages/bundle/web-app/cordis.patch.yml),每 500ms stat-poll 所有 client bundle。在无dev:webwatch 时也保持轮询,建议提供配置开关或调大默认间隔。期待官方确认和修复,需要更多日志或 heap snapshot 我可以补充。
All reactions