Skip to content

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

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

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

第 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

vercelBot commented Aug 3, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectstackIgnoredIgnoredAug 3, 2026 10:14am

Request Review

@os-zhuang
os-zhuang marked this pull request as ready for review August 3, 2026 10:14
@github-actionsgithub-actionsBot 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

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.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependenciesPull requests that update a dependency filedocumentationImprovements or additions to documentationsize/stooling

Projects

None yet

2 participants

@os-zhuang@claude