守护进程流保留复现¶
安装依赖后,从工作树根目录运行:
该脚本使用 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 工具链上运行。历史构建命令为:
这证明了一条当前停滞消费者保留路径。它并未将问题 #19831 的整个系统内存总量归因于该路径;该报告缺少按进程测量的数据。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 orca48/orca