跳转至

守护进程流保留复现

安装依赖后,从工作树根目录运行:

ORCA_BACKGROUND_LAUNCH=1 node docs/audits/daemon-stream-retention/reproduce.mjs

该脚本使用 esbuild 打包当前的 DaemonStreamDataBatcher,然后使用真实的回环 TCP 套接字。它会暂停读取器,最多输入 8 MiB,遵循生产者暂停回调,恢复读取器,并在 finally 中关闭所有套接字。它不会启动 PTY、代理或应用窗口。输出包括 bundle 哈希、排队负载大小、RSS 和排空结果。

可见的 64 KiB 和 1 KiB 生产者应在积压预算内暂停,并在两个队列排空后恢复。隐藏的 1 KiB 生产者应继续运行,同时现有的保留尾部策略限制其保留的输出。RSS 包含分配器/GC 计时;队列测量是直接证据。

after.json 记录了 Node v26.6.0 下的一次历史修复运行:可见的大块生产者在 2,686,976 个字符后暂停,套接字字节为 131,300,保留字符为 2,031,616;可见的小写入生产者暂停时套接字字节为 3,401,200。隐藏的生产者处理了全部 8 MiB,套接字字节为 131,300,保留字符为 667,648。所有用例均恢复并将两个队列排空到零。

修复前保留的测量数据

before-1mib-chunks.json 和 before-64kib-chunks.json 是在添加生产者背压之前捕获的,使用真实暂停的读取器和 96 MiB 输入。后者包含原始编译 bundle 哈希和隐藏会话比较。

输入 套接字缓冲字节 保留字符
32 MiB 131,321 32,636,928
64 MiB 32,809,583 33,554,432
96 MiB 66,406,511 33,554,432

最后 32 MiB 又保留了 33,596,928 个排队负载字节。保留队列在 32 MiB 处达到平台期,而套接字队列以每产生 1 个 ASCII 字节增长 1.00127 字节的速度增长。恢复读取器后,两个队列在 74 ms 内排空。使用 64 KiB 块时,采样 RSS 达到 1.38 GB;这包括字符串合并/切片和 GC 效应。

原始测量在 macOS 上使用 Node v26.6.0;当前复现记录其运行时,并应在受支持的 Node 24 工具链上运行。历史构建命令为:

ORCA_BACKGROUND_LAUNCH=1 node docs/audits/daemon-stream-retention/reproduce.mjs

这证明了一条当前停滞消费者保留路径。它并未将问题 #19831 的整个系统内存总量归因于该路径;该报告缺少按进程测量的数据。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 orca48/orca