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
羽毛球分组比赛记分
小程序二维码

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

小夜