前言¶
用 DSH 接中轉或官方模型,常會碰到一個問題:同樣一句請求,有的接口首字節很快、但吐字慢,有的相反。光看對話響應體感覺不出來,手工拿腳本去點贊也麻煩。dsh-speed-monitor 這個插件把這件事放進了 DSH 自己的界面裏:側欄點開,右側面板就按固定間隔對模型發流式請求,把首字節、總耗時、吞吐畫成曲線。
它由 doraasn 維護,分類是「工作流」,思路是「測速不離開 DSH」:模型清單直接讀 DSH 設置,請求打到供應商配置的 baseURL,密鑰走 DSH 自己的憑據文件。下面介紹它的功能、安裝和用法。
定位與維護¶
插件名是 dsh-speed-monitor,當前版本 0.9.8,MIT 許可,package.json 裏聲明對 dsh 引擎的要求是 >=0.2.1-rc.2。倉庫在 https://github.com/doraasn/dsh-speed-monitor,社區目錄頁在 https://www.skillhub.cn/plugins/doraasn/dsh-speed-monitor。目錄頁是獨立站點,與 DeepSeek / 幻方沒有官方從屬關係。
核心功能¶
模型清單來自 DSH。 Client 讀 /api/settings/describe 的 llm-* 命名空間,合併 llm-pi-ai.providers 與 llm-deepseek.models,插件裏不硬編碼模型。離開面板後新加的供應商,重啓後會出現在下拉里。模型顯示名也和 DSH 一致,用供應商 displayName + 模型 name 組合,例如 DeepSeek · DeepSeek-V4.1-Flash。
多模型並列。 每個模型一行,可以增刪,每行的模型和思考擋位各自獨立保存。默認目標寫的是 astra-hub / deepseek-v4.1-flash,異常時回落到清單裏第一個模型。
採樣間隔。 默認每分鐘一輪,可選 1 / 5 / 15 / 30 / 60 分鐘。每輪每個模型先預熱一次再採樣 3 次,取中位數入庫。
單指標曲線。 頂部切換首字節 / 總耗時 / 吞吐,每個模型一條線,圖例點擊可隱藏。懸浮顯示該次採樣的三項數值。時延單位是毫秒(越高越慢),吞吐單位是 tok/s(越高越快)。
斷檔不連線。 相鄰採樣點間隔超過 3 倍中位間隔或 2 分鐘時,曲線會斷開。這是刻意設計,不是數據丟失。
採樣方法¶
數值不是點一次得來的,方法參考 term-llm benchmark 和 llm-speed-test:
| 步驟 | 做法 | 原因 |
|---|---|---|
| 預熱 | 每個模型每輪第一次請求丟棄 | 排除 DNS、TCP 建連、前綴緩存冷啓動 |
| 採樣 | 默認 3 次,可調 1~5 次 | 單次抖動大,取中位數更穩 |
| 聚合 | 取中位數入庫,同時記錄 min / max | 中位數抗離羣點,min/max 看波動 |
| 串行 | 多模型之間間隔 300ms 串行執行 | 併發會搶帶寬,把數值拉高 |
| 失敗 | 記錄 ok/runs 與錯誤信息 |
區分「慢」和「掛了」 |
面板概覽卡顯示的就是中位數:首字節帶 ±(max-min)/2 波動,總耗時帶區間;每條曲線上的一個點 = 一輪採樣(3 個樣本的中位數)。
安裝與啓用¶
README 給的安裝方式是界面操作,沒有命令行命令:
- 側欄 → 插件 → 添加插件,粘貼倉庫地址、
.tgz或本地目錄 - 啓用後重啓 DSH,Host 側改動不熱加載
- 側欄出現「速度監控」入口,點開即見面板
這裏不要憑插件名去拼安裝命令,README 裏沒有 dsh plugin add ... 這類寫法。也不需要手動 git clone。
指標口徑¶
讀曲線之前先確認每個字段的含義:
| 字段 | 含義 |
|---|---|
ttfb_ms |
請求發出 → 收到響應頭 |
decode_ms |
首個內容事件 → 最後一個內容事件 |
total_ms |
請求發出 → 流結束 |
tokens |
completion_tokens |
tps_decode |
解碼吞吐 = tokens ÷ decode |
tps_e2e |
端到端吞吐 = tokens ÷ total |
首字節偏低、但 total 和 tps_decode 都差,是排隊或生成慢;首字節高而 decode 正常,通常是建連或前綴緩存問題。
數據來源與接口¶
插件不新建配置體系,複用了 DSH 的設置和存儲:
| 項 | 說明 |
|---|---|
| 模型清單 | DSH 設置(llm-pi-ai / llm-deepseek 等命名空間) |
| 請求 | POST {baseURL}/chat/completions,stream: true、stream_options.include_usage: true |
| 存儲 | ~/.dsh/storages/speed-monitor.json(配置)、speed-monitor.jsonl(採樣)、speed-monitor.providers.json(模型清單緩存) |
| 密鑰 | 供應商配置裏的 apiKeyEnv,指向 ~/.dsh/.credentials.yaml 的字段 |
密鑰不出主機:按 apiKeyEnv 從 ~/.dsh/.credentials.yaml 讀取,Client 拿不到。
面板前端調的是這幾個 HTTP 接口:
| 方法 | 路徑 | 說明 |
|---|---|---|
GET |
/dsh-speed/api/state |
{ config, providers, items, error } |
POST |
/dsh-speed/api/providers |
寫入模型清單 { providers } |
POST |
/dsh-speed/api/config |
保存 { intervalMinutes, runs, targets } |
POST |
/dsh-speed/api/sample |
立即採樣,可帶 { id } 只採一個目標 |
典型用法¶
裝好重啓後:
- 在 DSH 設置裏配好至少一個
llm-*供應商,apiKeyEnv指向~/.dsh/.credentials.yaml裏有值的字段,baseURL填完整 - 側欄點「速度監控」,面板會從清單裏帶上已有模型
- 先點 立即採樣 跑一輪,確認行內有數值而不是
-- - 確認無誤後把採樣間隔調回默認的 1 分鐘,讓它長期記錄
- 前幾條曲線只作爲早期參考,中位數要等每輪採樣攢夠纔有意義
常見問題¶
| 現象 | 處理 |
|---|---|
| 面板提示「還沒有可用的模型清單」 | DSH 設置裏沒有配置任何 llm-* 供應商 |
某行一直 -- |
該供應商 apiKeyEnv 在 ~/.dsh/.credentials.yaml 裏沒有值,或 baseURL 爲空 |
| 曲線不動 | 採樣間隔被調大;或全部請求失敗(行內會顯示紅色錯誤) |
| 想清零 | 刪除 ~/.dsh/storages/speed-monitor.jsonl |
適用場景與注意¶
適合已經在 DSH 裏接了多個供應商、想留下一條長期的延遲/吞吐記錄的人,也適合在切換中轉地址前後自己對比一次。它測的是網絡到供應商這一段的流式表現,不含模型實際生成的推理質量。
需要注意幾點:插件以當前 DSH 進程權限運行,會在該進程的工作目錄下讀取和寫入 ~/.dsh/storages/ 下的配置文件。安裝前先打開倉庫覈對源碼與 MIT 許可證,確認其中的接口路徑和存儲路徑符合預期,再決定是否啓用。另外測速請求會真實消耗供應商額度,跑之前確認賬戶餘額。
結尾¶
dsh-speed-monitor 的價值在於把測速變成 DSH 界面裏的常駐功能,配置複用 DSH 的模型清單和憑據,不需要另起腳本。目錄頁是 https://www.skillhub.cn/plugins/doraasn/dsh-speed-monitor,源碼在 https://github.com/doraasn/dsh-speed-monitor。