Skip to content

perf(server): fork a precompiled worker during development - #240

Open
2333sky wants to merge 1 commit into
Garhorne0813:mainfrom
2333sky:up/worker-start-budget
Open

2333sky wants to merge 1 commit into
Garhorne0813:mainfrom
2333sky:up/worker-start-budget

Conversation

@2333sky

@2333sky 2333sky commented Nov 4, 2026

Copy link
Copy Markdown
Collaborator

问题

开发模式下(没有 apps/server/dist),每次建会话都会 fork 一个 node --import tsx …/worker/main.ts,把「Node 启动 + tsx 转译整个 worker 依赖图」算进 POST /api/sessions 的响应时间。

实测:直接 import 整个 worker 图 5.5–7.1 s(5 次:6492 / 6527 / 5163 / 6001 / 6230 ms),3 并发 8.1–8.7 s;对照 node --import tsx -e "process.exit(0)" 只要 0.36–0.39 s。所以这 6 秒几乎全是转译,不是业务逻辑。

改动

  • 新增 apps/server/src/runtime/agent/worker/dev-build.ts:用 esbuild 把 apps/server/src/** 镜像到 apps/server/.dev-dist/**,保持目录深度,所以 import.meta.url 相对路径不用改
  • workerEntry() 三级回退:编译版 worker/main.js → dev 镜像 → tsx 源码;PI_SCIENCE_DEV_WORKER=0 可关掉
  • dev 脚本改成「先预编译一次再 watch」;.dev-dist/ 进 .gitignore
  • 新增 startupMs 与 Agent worker ready in Xms 日志,以后能直接量

效果

create 耗时
改前 12.7 / 11.3 / 13.3 s
改后 8.2 / 7.7 / 7.2 s(−36%)

剩下的 ~7.5 s 是 worker 自身的 loadSkills + loadPromptTemplates + MCP 工具发现,另单处理。

验证

  • 新增 5 条单测通过;.dev-dist 镜像 2.5 MB 生成成功
  • pnpm --filter @pi-science/server exec tsc exit 0
  • rebase 到 12b73fcd 后复跑 dev-build.test.ts 5 passed,server tsc exit 0

需要维护者判断的两点

  1. 它改了 dev 脚本。合并后 pnpm dev 会先跑一次 esbuild 预编译(首次约 1–2 s),再 tsx watch。不想改 dev 流程的话,这个 PR 可以只保留 workerEntry() 的三级回退与 dev-build.ts,dev 脚本我自己回退掉——告诉我一声就行。
  2. .dev-dist/ 是新的构建产物目录,已经进 .gitignore,不产生提交。

已知局限

  • src/runtime/agent 批测试有 8 条超时失败,归因是当时 load 6.4 且 NODE_ENV=test 走老路径;只对照了一个文件,没做完整隔离复跑。
  • 这是开发模式优化:生产构建本来就有 dist,不走这条路径。

rebase 时保留的上游内容

冲突处两边的改动都保留:上游的 build:native / build(含 build-workspace-discovery-native.mjs)与 approvalLeases 字段原样留下,dev 里也保留了上游新增的 native 构建步骤,本 PR 只在它后面追加预编译。.gitignore 同理,/work/live-tests/ 与 .dev-dist/ 都在。

pnpm dev ran the control plane through tsx, so every agent worker fork transpiled the worker dependency graph in the child (5-7s per session on this machine). Mirror apps/server/src to apps/server/.dev-dist next to the sources and fork it with plain Node; the mirror keeps each file's directory depth so import.meta.url trust paths resolve the same way. A freshness check rebuilds on source changes and PI_SCIENCE_DEV_WORKER=0 restores the tsx path. Log the measured fork-to-ready time once per worker.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant