Skip to content

chore(spec): DTS 堆上限 12288 → 8192(实测峰值 6.29 GB)—— ⚠️ 原「修 #4845」的前提已被本 PR 自己证伪 - #4853

Draft
os-zhuang wants to merge 1 commit into
mainfrom
claude/ci-spec-dts-heap-ceiling
Draft

chore(spec): DTS 堆上限 12288 → 8192(实测峰值 6.29 GB)—— ⚠️ 原「修 #4845」的前提已被本 PR 自己证伪#4853
os-zhuang wants to merge 1 commit into
mainfrom
claude/ci-spec-dts-heap-ceiling

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Fixes #4845

一行数字改动 + 一段说明它为什么是这个数的注释。

问题

packages/specbuild 脚本给 DTS 那一趟设了 NODE_OPTIONS="--max-old-space-size=12288",而 Test Core 跑在 runs-on: ubuntu-latest(公开仓 4 vCPU / 16 GB)。

--max-old-space-size允许 V8 涨到多少的上限,不是预留。设成 12 GB 意味着 V8 在逼近 12 GB 之前都不会激进 GC;叠加 tsup/tsc 的堆外内存、pnpm/turbo 进程与系统占用,总量越过 16 GB 物理内存时,内核 OOM-killer 先于 V8 自己的 OOM 处理把进程杀掉 —— 于是没有任何 Node 侧错误输出,日志里只剩:

CJS ⚡️ Build success in 18085ms
CLI Building entry: src/index.ts, …(16 entries)
DTS Build start
 ELIFECYCLE  Command failed.

编译错误会打印诊断,V8 自己的堆耗尽会打印 heap OOM 堆栈 —— 两者都没有,就是被 SIGKILL 了。

这个数字不是防 OOM,而是 OOM 的成因之一。

实测(不是猜)

本机 15 GB / 可用 13 GB,与 CI runner 同量级。在 8192 上限下跑完整 DTS 构建,采样进程树 RSS:

=== DTS 退出码: 0 ===
=== 峰值 RSS: 6.29 GB ===
  • 真实需求 ~6.3 GB;
  • 8 GB 上限相对真实需求留约 27% 余量,同时给 runner 剩约 8 GB 供堆外与系统使用;
  • 原来的 12288 远高于实际需求 —— 正是这个富余让 V8 敢一路涨到越界。

副作用也是好的:万一将来类型图真的长到 8 GB 装不下,失败会变成 V8 的 heap OOM 堆栈(可诊断),而不是现在这种零输出被杀。

命中记录(#4845,一个上午四次)

# 场景 PR 内容性质 结果
1 PR CI #4831 纯删除 OOM → 重跑转绿
2 PR CI #4841 wire 形状迁移 OOM
3 PR CI #4846 patch,零运行时代码改动 OOM
4 merge queue #4831 #1 OOM → 被踢出队列

第 3 例说明命中与改动内容无关(#4846 只改散文与注释,spec 类型图与之前逐字节等价);第 4 例说明它能实际阻止合并 —— 队列每次消化都是一次新抽签,重跑 PR 的 CI 帮不上忙。

之所以之前没暴露:turbo@objectstack/spec#build 有缓存,只有改动 spec 的 PR 才真正跑这一趟。v17 窗口内 spec PR 密集,于是频率陡增。

范围

  • packages/spec/package.json —— build 脚本里 DTS 那一趟的 122888192,别的一字未动;
  • packages/spec/tsup.config.ts —— 在既有的 // Generate DTS separately to avoid memory issues 下补一段说明「这是上限不是预留、设高于物理内存反而是成因」,免得下次有人看到 8192 觉得「不够大」又调回去;
  • 空 frontmatter changeset —— 发布面零变化(纯构建时标志,不影响任何产物内容),按门禁说明这是「本 PR 不发布任何东西」的正式声明。

content/docs/releases/ 未触碰。

后续

若 8192 仍不够(会以可诊断的 V8 heap OOM 形式出现,而非静默被杀),#4845 正文里还有两个方向:换更大的 runner、或按入口分批出 DTS。

🤖 Generated with Claude Code

https://claude.ai/code/session_0176qgxgCXTJCUv4YFLtusP9


Generated by Claude Code

`--max-old-space-size` 是允许 V8 涨到多少的上限,不是预留。设成 12288 时 V8
在逼近 12 GB 前都不积极 GC;而 `Test Core` 跑在 16 GB 的 ubuntu-latest 上,
叠加堆外内存与其它进程后越过物理内存,内核 OOM-killer 先于 V8 的 OOM 处理
把进程杀掉,因此没有任何 Node 侧输出 —— 日志里只有 `DTS Build start` 紧接
` ELIFECYCLE  Command failed.`。

实测(15 GB 机器,与 CI runner 同量级):8192 上限下 DTS 构建成功完成,
峰值 RSS 6.29 GB。8 GB 上限留约 27% 余量,并给 runner 剩约 8 GB 堆外与系统。

一个上午四次命中,横跨纯删除 / wire 形状迁移 / 纯文案 patch 三类无关改动,
第四次发生在合并队列里并把 PR 踢出 —— 命中取决于是否真跑 DTS(turbo 缓存
失效时),与改动内容无关。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0176qgxgCXTJCUv4YFLtusP9
@vercel

vercel Bot commented Aug 3, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 3, 2026 10:14am

Request Review

@os-zhuang
os-zhuang marked this pull request as ready for review August 3, 2026 10:14
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation dependencies Pull requests that update a dependency file tooling labels Aug 3, 2026
@os-zhuang
os-zhuang enabled auto-merge August 3, 2026 10:14
@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/spec.

106 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/spec)
  • content/docs/api/environment-routing.mdx (via @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/spec)
  • content/docs/automation/approvals.mdx (via @objectstack/spec)
  • content/docs/automation/connectors.mdx (via @objectstack/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via packages/spec)
  • content/docs/concepts/north-star.mdx (via @objectstack/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/cli.mdx (via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via packages/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/spec)
  • content/docs/permissions/authorization.mdx (via @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/rls.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx (via @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v16.mdx (via @objectstack/spec)
  • content/docs/releases/v17.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/spec)
  • content/docs/ui/translations.mdx (via @objectstack/spec)
  • content/docs/ui/views.mdx (via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

@os-zhuang
os-zhuang disabled auto-merge August 3, 2026 10:25
@os-zhuang os-zhuang changed the title fix(ci): spec 的 DTS 堆上限 12288 → 8192 —— 上限高于物理内存反而促成 OOM (#4845) chore(spec): DTS 堆上限 12288 → 8192(实测峰值 6.29 GB)—— ⚠️ 原「修 #4845」的前提已被本 PR 自己证伪 Aug 3, 2026
@os-zhuang
os-zhuang marked this pull request as draft August 3, 2026 10:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file documentation Improvements or additions to documentation size/s tooling

Projects

None yet

2 participants