前言¶
DSH 會話日誌隨着對話輪次的增加會不斷膨脹,最終導致加載緩慢甚至 OOM。根本原因是流式片段(如 assistant/chunk、text-chunks 等)被寫入但從未被讀取。這些只寫不讀的數據會不斷堆積,導致單個會話文件迅速增長到 GB 級別,並在加載時消耗大量內存。
dsh-session-vacuum 插件在 DSH 啓動時運行,直接在磁盤上刪除這些死片段,確保下次加載會話時文件體積更小。
是什麼¶
這是一個 DSH 插件,用於在啓動時清理 DSH 會話日誌中的死流式片段。它由 mili1360 維護,屬於 memory-optimization 類別。其核心目的是防止長會話加載時文件膨脹至 GB 級別,從而解決因日誌過大導致的加載變慢和內存溢出問題。
核心能力¶
- 刪除磁盤上的片段行:直接清理日誌文件中無用的流式片段數據,而非僅隱藏。
- 原子替換與備份:使用
.orig作爲唯一備份文件,通過原子性重命名操作替換原日誌文件,確保寫入過程的安全性。 - 寫入前自檢:在寫入清理後的日誌前,會先驗證數據結構是否滿足 DSH 的加載契約(如連續的
seq、無懸空引用等),驗證失敗則保留原文件。 - 默認 Live 模式:全新安裝後默認開啓,會自動修剪空閒日誌,無需配置即可生效。
- 時間窗口保護:默認尊重
liveWindowMs配置(默認爲 2 分鐘),不觸碰正在寫入的會話日誌,避免干擾實時交互。
安裝與配置¶
插件通過 dsh 塊集成。安裝前請確保 Node.js 版本不低於 22.15.0。
在 dsh.config.yml 或對應的插件配置中啓用該插件:
dsh:
bundle:
patch: ./cordis.patch.yml
配置項說明:
- enabled: false:關閉插件。
- dryRun: true:預演模式,記錄將要執行的操作但不實際寫入文件,用於觀察清理效果。
典型用法¶
- 觀察清理效果:先設置
dryRun: true,查看將要刪除的行數和文件大小變化,確認無誤後再關閉預演模式。 - 關閉插件:如果需要完全禁用,設置
enabled: false。 - 恢復 OOM:對於已經因大日誌導致 OOM 的會話,使用此插件清理後重新加載,可顯著降低內存佔用。
注意事項¶
- 設計上具有破壞性:插件會永久刪除磁盤上的片段行,
.orig是唯一的備份文件且不會被自動刪除。 - 不觸碰活躍會話:插件不會修改最近 2 分鐘內有寫入的會話日誌。
- 不縮小已加載會話:該插件只處理磁盤上的文件。如果會話已經被 DSH 進程加載到內存中,它不會減小當前進程的內存佔用;它只能減小“下一次”加載時的開銷。
結語¶
dsh-session-vacuum 是解決 DSH 長會話膨脹問題的有效工具。通過在啓動時清理磁盤上的死數據,它能讓會話文件從 GB 級別縮減至 MB 級別,恢復加載速度並避免 OOM。使用時請務必注意其破壞性設計,並充分利用 dryRun 模式進行驗證。