Skip to content

Windows: watch 守护进程不随调用方退出、无有效单实例锁、句柄/内存持续泄漏(15+ 并发实例实测) #2

Description

@rui08984-dot

环境

  • SessionRelay 0.5.1(npm 全局),Windows 11 (22631),Node v24
  • 重度使用场景:ZCode 会话源库 229MB / 1457 个文件;多项目(3 个 .sessionrelay)
  • 连续 90 秒 CPU/GPU 采样探针 + 进程级句柄/内存追踪实测

三个问题(均实机复现)

1. watch --foreground 不绑定调用方生命周期 → 孤儿进程累积

父进程(shell / 工具调用 / 子代理)退出后 node 不退出,成为孤儿永久驻留。实测一天内积累 15-18 个并发实例(约 13 个孤儿);每次 --install-service、演练、测试、甚至多个子代理并行审计时都会新增。启动时间呈成批特征(一次 4 个对应一组并行任务)。

2. 无有效单实例锁

.sessionrelay/lock 文件存在时仍可启动新实例(18 个并发共存)。另外 watch --status 按当前目录的项目锁判断——跨项目查询会误报"未运行",而实际守护在跑。

3. 句柄与内存持续泄漏

单实例运行 7.9h:

  • CPU 累计 3761s(持续占用 6-39% 单核,30 次采样无一空闲)
  • 句柄 1409 → 4400(2 分钟内暴涨,泄漏加速)
  • 内存锯齿:每 10 秒在 812MB ↔ 1904MB 之间摆动(周期性批量申请/释放约 1GB 内存 + 4300 句柄)

机制

每 7 秒轮询 ZCode 源库(229MB)并以 jieba 全量重建中文索引 → 周期性大批量分配/释放,构成锯齿。

影响

  • --install-service 直接 spawn 守护(不走 cmd),装完 status 正常 → 用户重启前完全无感,资源被持续吞噬
  • 多实例并存 = 重复捕获/重复索引风险
  • 15 实例合计浪费 ≈1.4h CPU + 2.1GB 内存

建议修复方向

  1. 启动时检测已有实例(命名互斥体/排他锁),发现即退出或接管
  2. 排查句柄泄漏(未释放的 watcher / fs 句柄)
  3. 增量索引代替全量重建(或至少跳过未变更会话)
  4. --foreground 提供绑定父进程存活的选项

复查脚本

探针与复查脚本(CPU/GPU 采样、实例清单)已在本仓库使用方的 reviews/ 留档,可提供。

附

感谢这个项目——上述问题不影响我们对它的正面评价(中文检索/零外呼/HOP 设计),资源卫生修好后就是理想的状态底座。

相关:#1(watch-task.cmd 未转义 node 路径,同属 Windows 自启链问题)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions