#101 等待搬回引擎——WASI 沙箱裡沒有「不花 CPU 地等」這種東西 #103

Merged
Leo merged 1 commits from fix/wait-not-in-wasm-101 into main 2026-08-12 07:26:01 +00:00
Owner

leo:「燒 CPU 影響錢,需要做。

:wait 零件在 youlin stage 上,不管 ms 填多少都撐到 ~35 秒被 CPU 上限砍掉(503/1102):

ms=3000 → 38.9s / ms=20000 → 34.0s / ms=30000 → 34.9s / 寫死 3000 → 34.8s

四個值同一種死法、與 ms 無關 ⇒ 病不是「等待很貴」,是等待從來沒成功過

修法:wait 移進 BUILTIN_COMPONENTS,由引擎 await 一個 timer——只花 wall-clock、不記 CPU。既有 workflow 的 wait 節點定義不必改。

🔴 誠實標明:原本註解把「Workers 時鐘在同步執行期間凍結、所以自旋永不結束」寫成結論。寫測試去證反而被打臉——workerd 裡自旋 2553 圈後 Date.now() 就前進了。那條假斷言已刪除,不是改鬆;完整機制降級成推測。修法不依賴它:純 WASI 沙箱本來就沒有睡覺這個手段。

實測

tests/wait-builtin.test.ts  → 12 passed (12)
全套                        → 386 passed / 14 failed(14 = 動工前既有紅燈數,未新增)

還沒驗的:真的部署上去跑一次那條 input >> wait 工作流。⇒ 現在是 ◐ 半通。
合併部署後,出貨線最後兩站(17/19 卡在 wait_node)才可能通,arcrun-rag#47 也才解得掉。

leo:「**燒 CPU 影響錢,需要做。**」 **病**:wait 零件在 youlin stage 上,不管 `ms` 填多少都撐到 ~35 秒被 CPU 上限砍掉(503/1102): ``` ms=3000 → 38.9s / ms=20000 → 34.0s / ms=30000 → 34.9s / 寫死 3000 → 34.8s ``` 四個值同一種死法、與 ms 無關 ⇒ 病不是「等待很貴」,是**等待從來沒成功過**。 **修法**:wait 移進 `BUILTIN_COMPONENTS`,由引擎 await 一個 timer——只花 wall-clock、不記 CPU。既有 workflow 的 wait 節點定義不必改。 🔴 **誠實標明**:原本註解把「Workers 時鐘在同步執行期間凍結、所以自旋永不結束」寫成結論。寫測試去證**反而被打臉**——workerd 裡自旋 2553 圈後 `Date.now()` 就前進了。那條假斷言**已刪除,不是改鬆**;完整機制降級成推測。修法不依賴它:純 WASI 沙箱本來就沒有睡覺這個手段。 **實測**: ``` tests/wait-builtin.test.ts → 12 passed (12) 全套 → 386 passed / 14 failed(14 = 動工前既有紅燈數,未新增) ``` **還沒驗的**:真的部署上去跑一次那條 input >> wait 工作流。⇒ 現在是 ◐ 半通。 合併部署後,出貨線最後兩站(17/19 卡在 wait_node)才可能通,`arcrun-rag#47` 也才解得掉。
Leo added 1 commit 2026-08-12 07:15:28 +00:00
leo 在 youlin stage 實測(只有 input >> wait 兩個節點):
  ms=3000 → 38.9s 後 503(1102) / ms=20000 → 34.0s / ms=30000 → 34.9s / 寫死 3000 → 34.8s
四個值同一種死法、與 ms 無關 ⇒ 病不是「等待很貴」,是「等待從來沒成功過」。

修法:wait 移進 BUILTIN_COMPONENTS,由引擎 await 一個 timer。
只花 wall-clock、不記 CPU ⇒ 等 30 秒與等 3 秒同價(皆 ≈0)。
I/O 契約沿用 component.contract.yaml,既有 workflow 的 wait 節點定義不必改。

🔴 誠實標明:原本註解斷言「Workers 時鐘在同步執行期間凍結,所以自旋永不結束」。
寫測試去證,反而被打臉——workerd 裡自旋 2553 圈後 Date.now() 就前進了。
那條假斷言已刪除(不是改鬆),完整機制降級為推測。修法不依賴它:
純 WASI 沙箱本來就沒有睡覺這個手段,會等的只有宿主。

實測:
  npx vitest run tests/wait-builtin.test.ts  → 12 passed (12)
  npx vitest run(全套)                      → 386 passed / 14 failed
                                              (14 = 動工前的既有紅燈數,未新增)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Leo merged commit 1791ffa497 into main 2026-08-12 07:26:01 +00:00
Sign in to join this conversation.