dsh-local-host-guard:DSH 宿主内哨兵

前言

DeepSeek Harness(DSH)的宿主进程负责加载插件、调度会话与 I/O。日常开发里常见两类「无声故障」:窗口还在、界面没报错,但事件循环已被某次同步子进程调用挂死;或堆内存逼近约 4192 MB 上限后进程以 FATAL ERROR 退出(退出码 134),且崩前大量活对象即使用全量 GC 也几乎收不回来。单靠猜调用栈或重启,很难在事后指认「卡在哪一次调用」或「该先减哪块内存压力」。

下面介绍社区插件 dsh-local-host-guard(维护者 maozhuoshushu,分类:工作流)。它在宿主进程内做同步调用打点、主线程卡死取证,以及写闸 / 冷回填闸 / 闲置会话下放与队列哨兵等限流与观测;零依赖(仅 Node 内建模块),界面与日志以中文为主,默认只报告、不自动杀进程或强改业务行为。

这是什么

dsh-local-host-guard 是挂在 DSH 宿主里的随行观测与三层内存相关「闸」:卡死时产出带命令行摘要的卡死报告;内存吃紧时可按配置扫描并(在显式开启动作后)把满足条件的闲置会话从 SessionStore 摘出以降活对象。插件由宿主加载,不修改 DSH 内核 asar;作者说明曾尝试 NODE_OPTIONS 预加载等方式,在打包版 Electron 主进程里不可行,故采用 DSH 插件形态。

核心功能

同步调用与卡死取证

插件包装 spawnSync / execFileSync / execSync:每次调用前后写「进入 / 返回」流水;调用方未设 timeout 时补默认限时(一般 120 秒,taskkill 类 10 秒);超过慢调用阈值(默认 3 秒)记慢调用日志。独立 worker 监视主线程心跳,停摆超过阈值(默认 8 秒)落盘 卡死报告,含检测时间、停摆时长、当前未返回的同步调用、近期流水、内存与 CPU,并附带 node 进程报告;主线程恢复后同一报告补记恢复时间与总停摆毫秒。

能力边界(README 如实说明):打点覆盖所有经包装的同步子进程等待;限时对「调用时才取 child_process」的 CommonJS 及插件加载后模块有效,管不到已在 ESM 加载期绑定的命名导入,但这类调用仍会进流水,卡死时仍能指认最后一次「进了没回」的调用。不抓内核态堆栈,只取证、不自动杀进程。

内存三闸与队列哨兵

除卡死链路外,插件还包含 写闸、冷回填闸、闲置会话下放 与 队列哨兵,用于抑制「单步动作放大成大量 I/O / 回填 / 队列堆积」类问题;下放逻辑在 lib/下放.mjs,通过 sessions.flush、磁盘强校验、sessions.detachEntered(entry) 等步骤把闲置且已完整落盘的会话从内存表摘出(不删磁盘数据,不写会话文件;三大会话默认在保护名单)。默认 下放动作 为「只报告」时不执行 detach,仅观测候选与跳过原因(无 host-guard.json 时 README 安装节写明内置默认为 启用下放=true 且 下放动作="只报告";完整键默认值见 README 配置表)。

本机状态与 HTTP 路由

数据目录默认可配置,未配置时退回 %USERPROFILE%\.dsh\host-guard,典型产物包括:日志.log、当前同步调用.log(打点流水,滚动上限约 256 KB)、卡死报告\卡死-<时间戳>.json、node-reports\node-report-<时间戳>.json(目录名用 ASCII,因 Windows 上 node 自带 report 难写入中文路径)、状态.json、最近卡死报告.txt。

只读状态(本机回环):http://127.0.0.1:19387/__dsh/host-guard/status。另提供 probe(只读语义探针)、offload(手动扫描一轮)、arm(重读配置并重新装载各闸,等效改配置后不必重启宿主)等路由;对外请求请优先用 ASCII 路径(如 /status、/arm),README 记载带中文 pathname 曾出现注册成功但 404 的情况。

安装与启用

在 desktop profile 下安装(命令来自仓库 README):

# 从 npm(包名已预留;发布后可用)
dsh plugin --profile desktop add dsh-local-host-guard

# 或直接从 Git 仓库装
dsh plugin --profile desktop add https://github.com/maozhuoshushu/dsh-local-host-guard

装好后在宿主内挂载。配置写在 %USERPROFILE%\.dsh\host-guard.json;无此文件则使用内置默认值。README 说明默认语义为:启用下放=true 但 下放动作="只报告",即下放相关逻辑以观测为主、不执行 detach。

运行环境:package.json 要求 Node >= 20;许可证 MIT;当前包版本 1.0.0。

若要真正执行下放(而非只报告),需在配置中显式设置,例如:

{
  "启用下放": true,
  "下放动作": "detach",
  "下放闲置分钟": 10,
  "下放事件下限": 500,
  "下放阈值MB": 2600
}

关闭下放可设 "启用下放": false,或改 "下放动作": "只报告",并可通过 GET /__dsh/host-guard/arm 使配置与闸重装生效。更多键(扫描间隔、每分钟上限、强校验 MB、保护名单等)见 README 配置表。

典型用法

CLI(路径需换成你本机插件安装位置)

README 以作者 Windows 路径为例;通用做法是调用包内 lib/cli.mjs:

node <插件目录>\lib\cli.mjs --状态
node <插件目录>\lib\cli.mjs --标记
node <插件目录>\lib\cli.mjs --报告
node <插件目录>\lib\cli.mjs --自测卡死 4000

--状态 查看哨兵是否在岗、打点统计与最近卡死报告;--标记 看流水尾部与最后一次未返回调用;--报告 列出并打印最新卡死报告;--自测卡死 在独立进程里故意阻塞主线程数毫秒,验证哨兵能否落证据。

卡死与 OOM 排查流程

  1. 宿主「活儿全停、无报错」→ 打开数据目录下最新 卡死报告 或 CLI --报告,查看「当前卡住的同步调用」与命令行摘要,对照 当前同步调用.log 流水。
  2. 宿主 OOM 退出前 → 看 status 中下放相关字段与日志;若仅观测,保持默认「只报告」,根据候选与跳过原因决定是否调整会话体量或再开 detach。
  3. 改 host-guard.json 后 → GET http://127.0.0.1:19387/__dsh/host-guard/arm?t=<时间戳>,无需重启宿主即可重装各闸。

适用场景与注意

适合:长期在本地 desktop 宿主上跑 DSH、需要 reproducible 地记录「哪次 sync 子进程挂死事件循环」、或需要在不删数据前提下探索降低 SessionStore 活对象压力的开发者与维护者。

务必知晓:

  • 插件与当前 dsh 宿主进程同权限 运行,会 hook 子进程同步调用、读写审计目录、并在配置允许时调用宿主 Session API。安装前应自行审阅 GitHub 源码 与 MIT 许可证。
  • 下放 detach 后,该会话新事件在 README 中说明可能只留内存、持久化行为会变化;作者注明「客户端再次进入从磁盘读回」尚未在真宿主全链路验证,故第一版默认只报告。
  • 社区目录 SkillHub 插件页 与 GitHub 为独立生态信息源,与 DeepSeek / 幻方无官方从属关系;星标等以页面当时展示为准(线索中星标为 0)。

结尾

dsh-local-host-guard 把宿主两大命门——同步调用卡死与内存顶格——收拢到可落盘的流水、卡死报告与可配置的内存闸/下放策略上;默认保守,只报告不动手,适合作为本地 DSH 工作流里的诊断插件。进一步了解与安装:

  • 目录页:https://www.skillhub.cn/plugins/maozhuoshushu/dsh-local-host-guard
  • 仓库:https://github.com/maozhuoshushu/dsh-local-host-guard
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜