Replies: 1 comment
|
你的采样归因非常扎实(尤其 10 分钟窗口 0.2MB 新增 → heapUsed +46MB 的约 200 倍放大、Mark-Compact 仅回收 65MB 的活集证据)。我给你补一个家族映射 + 精确到行的源级确认,帮你判断"这是不是 dsh 已知缺陷、修哪里"。 这是已知家族复发,根因在"客户端会话无空闲回收"(#5696)我此前在 #5696("Session lifecycle retention gap",V8 OOM ~8h)已定位同一根因,现已在当前 master 复核,机制未变: 核心机制: // manager.ts:245
async drop(sessionId: SessionId): Promise<void> {
const session = this.sessions.get(sessionId)
this.sessions.delete(sessionId)
if (session !== undefined) await this.startSessionDisposal(session)
}而 这意味着:一个浏览器驱动的长会话,只要 scope 不被移除,它的 你观察到的另外两个放大点,我逐个源级核对了
(注:你说的"projection cache 每个 turn/end 整体 structuredClone"—— 我用 插件可挂载面判定明确无插件面,plugin 是受害者/旁观者 —— 这是 core 客户端会话生命周期 缺口:
所以对这条的正确归档是 core upstream-fix 候选(建议客户端会话保留策略:idle-timeout + 计数上限 + close 事件驱动 drop),与我 #5696 的结论一致。建议你把它和 #5696 合并追踪(同一 session-lifecycle-retention 家族),避免社区重复报。 一句话给作者判读全对,且是已知家族(#5696 复发)。根因 = 客户端 |
Uh oh!
There was an error while loading. Please reload this page.
一句话结论:dsh web 的 harness 进程内存消耗与累计会话事件数成正比、与数据量基本无关,单个长会话批任务连续运行约 8 小时后 V8 堆触及默认上限(约 4 GB)崩溃退出;抽样与源码线索指向逐事件的投影/校验/冻结记账只增不减。
预期:长会话连续运行数天,harness 内存稳定在会话数据量的合理倍数以内。
实际:内存以约 4–5 MB/分钟的速率净增长(活跃回合期间),单批 7.9 小时触顶,
FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory,进程以 exit code 134 退出。环境
DSH Desktop 0.7.2(内嵌 @deepseek-ai/dsh 0.1.2-alpha.1,Node v24.9.0)· Windows 11 · 32 GB 内存 · web profile
关键事实
机制线索(源码阅读 + 10 分钟 HeapProfiler 采样归因,属分析判断而非定论)
dsh-session的Session.log为 append-only 深冻结数组,含全部流式块(该批任务一夜产生 6500+ 条assistant/chunk),进程存活期间从不裁剪;dsh-session-projection的drive()被十余个投影单元(todos / goal / sessionStats / tokenUsage / contextBreakdown / subagent…)逐一折叠,whole-value 语义下每步重建整份状态并过 zod 校验;采样中 drive、zod parse、walkJsonValue深冻结遍历均在分配榜前列;turn/end与节流点对全部单元状态做整体structuredClone;影响
长批次任务必然触顶(默认堆上限下约 8 小时);harness 死后桌面端停留在失败恢复界面直至手动重启,批次工作全部中断。
可选方向
投影状态历史裁剪或增量 checkpoint;空闲会话释放/冷存;流式块合并后再入账。
不在范围
桌面端 GPU/渲染问题;归档会话无恢复入口(见讨论 #40);会话数据量本身(已排除)。
复现 / 观察方法
给 harness 进程加
--inspect=127.0.0.1:<port>,用 CDPRuntime.evaluate读process.memoryUsage()每分钟采样,活跃回合期间可见约 4–5 MB/min 净增长;HeapProfiler.startSampling/stopSampling可复现上述归因。证据索引
harness.log 的 GC 段与崩溃行(可按要求提供完整片段);采样 profile JSON(10 分钟窗口,16 KB 采样间隔,可附)。
All reactions