跑在 全年無休 macOS Mac mini 上的 OpenClaw 閘道,有時會「凍結」卻不崩潰:Slack 的輸入狀態停住、儀表板仍顯示「RPC 探測:正常」,但助理回覆超過 90 秒 仍不抵達。營運常把這類事件誤標為模型大停電,根因卻可能是讀取逾時:等待永遠不會完成的位元組——或是在 Wi-Fi 瞬斷後,半開 TLS 工作階段停在中途。本篇 runbook 要把讀取停滯與 HTTP 429 風暴分開,建立可重現的 curl -m 基準,並把頻道背壓對回閘道日誌。若回應其實有到、只是需要退避,請搭配 供應商 429 與重試策略;若懷疑連線埠、綁定或憑證,請讀 閘道 doctor 診斷。閘道前若還有反向代理,請同步閱讀 閘道代理與通道硬化,讓閒置逾時端到端對齊。最後,調整讀取逾時常與本機並發與重試互動——請參考 權杖預算、工具與節流,避免「救讀取」卻引發重試風暴。
讀完你會拿到決策矩陣、數值化逾時起點、macOS 日誌提示,以及面向平台工程師的常見問題整理。
實務上,建議把「使用者可見卡住」與「內部佇列延遲」拆成兩條時間序列;前者多半對應讀取層或網路層,後者則可能是 CPU 飽和或磁碟 I/O 與日誌寫入互搶。當兩條曲線只在前者暴衝時,優先檢查上游 chunk 間隔與閘道 idle timer,而不是急著調模型路由。
你正在除錯錯誤失敗型態的徵兆
若儀表板仍顯示 RPC 健康、使用者卻在等,十之八九卡在應用層讀取,而不是行程死亡。另一個線索是串流 JSON:token 只出現約 300 毫秒 後就沉默——上游在中途暫停 chunk。
財務友善的計數器建議至少四組:每小時讀取逾時次數、平均卡住時長、被放棄的對話數,以及重新打開且標記「AI 卡住」的工單數。沒有這四條序列,你無法證明調整逾時真的改善體驗。
事件當下請先凍結功能開發:留存遮罩後的 tcpdump 摘要與 TLS 工作階段 ID,再把最近一次逾時變更回滾。
「破窗」暫時拉高逾時務必綁工單編號;否則團隊會在發布週末默默把天花板推高,然後對帳單在週日暴衝感到困惑。
維護一份每個環境一列的試算表,列出連線、首字節、閒置與牆鐘上限,讓稽核在橋接電話五分鐘內就能 diff staging 與 production。
若組織採購了 APM,請確認 span 是否把「連線成功」與「首 token」分開標記;兩者時間差暴衝但錯誤率不變時,多半是讀取 idle 而非模型品質劣化。
矩陣:讀取逾時、429 與 DNS
| 徵兆 | 可能分類 | 第一個探測 |
|---|---|---|
| HTTP 429 與 Retry-After | 限速 | 依供應商退避指南處理 |
| 超過連線時間仍無狀態列 | 讀取停滯 | 以遞增上限的 curl -m 對上游 URL |
| 立即 NXDOMAIN | DNS | 從閘道主機執行 dig +trace |
當症狀落在表格邊界時,先用最小重現請求驗證「是否任何 HTTP 狀態都沒回來」;若偶爾回 200 但 body 永遠不完整,請把問題記為「讀取層半終止」而非單純逾時計時器太短。
能通過稽核的逾時起點
客戶端初始建議:連線逾時 5 秒、對話模型的首字節讀取逾時 45 秒、串流 chunk 閒置逾時 12 秒、單次使用者回合牆鐘 180 秒 後改回結構化交棒連結。
讀取逾時後的重試次數建議上限 2 次/使用者訊息,除非供應商狀態頁宣告事件。
供應商公布維護窗時,請在窗開始前 15 分鐘 先把並發降約 20%——可避免重疊重試放大停滯。
逾時表請版控在 Git;值班不應在事件當下猜測「哪組常數才是線上那一套」。
跨區部署時,請把「同一張表」拆成資料中心欄位:某些供應商對亞洲 anycast 的首字節分佈與美西不同,硬套單一數字會讓一邊使用者永遠吃緊。
curl 重現配方
# 以遞增上限找出上游停在哪一段
curl -sS -o /dev/null -w '%{http_code} %{time_connect} %{time_starttransfer}\n' \
-H "Authorization: Bearer $TOKEN" \
-m 10 https://api.example.com/v1/models
curl ... -m 30 ...
curl ... -m 60 ...
請在閘道主機與 jump 主機各跑一輪;若 start-transfer 時間分歧,問題偏向網路路徑而非 OpenClaw 本身。
加上 -w '%{remote_ip}' 確認 DNS 是否釘在你預期的 anycast POP,以便在供應商降級時比對。
串流端點請加 --no-buffer,並用 pv tee 輸出,讓營運能分辨「伺服器停止吐 chunk」與「本機終端機背壓導致管線停住」。這個區分常省下數小時的「什麼都沒印」客服回報排查。
企業代理若剝掉 chunked encoding,curl 可能緩衝到 EOF 才吐字——請鏡像閘道實際 HTTP 程式庫設定(HTTP/1.1 對 HTTP/2),讓重現與線上位元組級一致。
若 curl 成功但閘道失敗,請比對 MTU、TCP 視窗縮放與 mTLS 中介憑證鏈;這類問題在 2026 仍會偽裝成「神秘卡住」。
macOS、launchd 與磁碟壓力
launchd 預設相當耐打,但冗長除錯日誌在根卷可用空間低於約 12% 時,寫入可能被阻塞——表面像模型卡住,實際是行程在等 write()。
事件期間可觀察 diskutil apfs listVolumeGroups:與閘道日誌同卷組的本機 Time Machine 目的地,可能在未觸發明顯 CPU 告警時就先偷走 IOPS。
TLS 工作階段恢復有時會掩蓋間歇讀取凍結;二分供應商問題時,請偶爾輪替診斷客戶端強制全新交握。
若硬體採購緩慢,可租用雲端 Mac mini 演練事件:MacHTML Apple Silicon 主機常見價位約 $16.9/天,含 SSH/VNC 以利即時擷取。
讀取逾時調整請與本機 fork 上限一併檢視——詳見 節流與並發上限,避免重試把閘道打滿。
若閘道與本機向量快取共用磁碟,請在壓力測試時同步灌入「索引重建」背景工作;否則實驗室數字會樂觀於正式環境。
卡住期間的頻道體驗
Slack 與 Teams 使用者能忍受等待,前提是文案解釋原因。建議在逾時 8 秒 仍無首 token 時發模板訊息,45 秒 再發一次,120 秒 給最終交棒連結。
避免把原始堆疊追蹤直接 echo 進頻道——其中可能含內部主機名。
多語團隊共用單一閘道時,請依工作區語系標頭本地化停滯提示。
產品分析應拆分「無首 token」與「串流中途停住」:前者多指向連線或驗證;後者幾乎對應讀取閒置計時器或上游 chunk 暫停。漏斗標錯會讓工程師追 OAuth,而不是 diff 逾時表。
若對外有狀態頁,建議加一個合成探測徽章:當 start-transfer 超過基線 2 倍 就先翻黃——通常早於使用者可見錯誤率上升,公關較容易取得先手。
內部戰情室請約定「對外措辭模板」與「技術根因欄位」分開維護,避免支援在壓力下複製尚待驗證的假設到客戶信件。
遙測與 SLO
匯出合成探測的 time_starttransfer 直方圖,與閘道即時指標比較——若分歧超過約 25%,多半是本地政策漂移而非供應商單邊問題。
合成探測請使用專用 User-Agent 字串,讓防火牆團隊能白名單化而不必大開抓取窗。若探測成功、正式流量失敗,請比對探測子網與正式 VPC peer 的 MTU 與 TCP 視窗縮放;尺寸錯誤的 MSS 在 2026 仍會造成「神秘卡住」。
資安審查可能質疑較長讀取視窗是否增加攻擊者佔用連線的停留時間;任何逾時上調都應搭配每租戶最大併發串流數下調,讓風險有界。
當讀取逾時率在 10 分鐘 內超過七日基線約 4 倍 時告警——先叫網路,再碰模型路由。
結構化稽核日誌請保留 90 天,並以關聯 ID 把使用者訊息綁到供應商請求 ID。
每季手動檢視約 35 筆最長等待;自動分桶仍常把區域性降級誤標成本地臭蟲。
Grafana 註解請標記觸及逾時常數的 Git 合併,讓尖峰能對回刻意變更。
供應商狀態頁若寫「延遲升高」但無硬故障,可暫時縮短串流閒置逾時,讓使用者看到明確重試文案而非無限轉圈——並在 4 小時 內依工單連結的回滾清單還原先前數值。
若你同時維護多個上游供應商,建議為每家維護獨立的「逾時變更變更紀錄」與「財務影響試算」,避免在橋接電話把 A 供應商的窗硬套到 B 供應商的計費模型。
常見問題
讀取逾時與 429 相同嗎?
否——429 會帶狀態列;讀取停滯缺乏終止回應。
是否應先拉高逾時?
僅在有工單、上限與回滾計時器時。
為何要在實體 Mac mini 上演練?
macOS 的 TLS、launchd 與磁碟行為與 Linux CI 不同。
Apple Silicon Mac mini 仍是 OpenClaw 逾時工作最忠實的演練平台:長時間擷取時熱行為可預測、原生鑰匙圈整合,以及與正式閘道相符的網路堆疊。MacHTML 提供含 SSH/VNC 的雲端 Mac mini 租用,讓平台團隊能驗證讀取逾時政策、doctor 探測與節流互動,而無需新一輪資本支出——演練時開機蒐證,綠燈後再關機即可。
在雲端 Mac mini 上演練 OpenClaw 逾時診斷
租用 Apple Silicon 容量,在真實 macOS 上重現讀取停滯、調整天花板,並驗證 doctor 與節流互動。先看定價,再依說明接入遠端桌面。