From a0996a208daa492c371047263f210b7c4a76a295 Mon Sep 17 00:00:00 2001 From: Codex Date: Thu, 16 Jul 2026 07:51:07 +0200 Subject: [PATCH] =?UTF-8?q?docs:=20=E6=94=B6=E5=8F=A3=20Decision=20Center?= =?UTF-8?q?=20=E6=B3=84=E9=9C=B2=E4=B8=8E=20GC=20=E9=AA=8C=E6=94=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../R1.2.2_Task_Report.md | 22 +++++++--------- .../R1.2.3_Task_Report.md | 26 +++++++++---------- .../MDTODO/web-observe-runtime-reliability.md | 4 +-- 3 files changed, 24 insertions(+), 28 deletions(-) diff --git a/docs/MDTODO/details/web-observe-runtime-reliability/R1.2.2_Task_Report.md b/docs/MDTODO/details/web-observe-runtime-reliability/R1.2.2_Task_Report.md index 82042ccb..9435989c 100644 --- a/docs/MDTODO/details/web-observe-runtime-reliability/R1.2.2_Task_Report.md +++ b/docs/MDTODO/details/web-observe-runtime-reliability/R1.2.2_Task_Report.md @@ -1,20 +1,18 @@ # R1.2.2 任务报告 -## 根因 +## 根因与修复 -NC01 约 1 万个 zombie 中,Decision Center Pod 的长期 Bun 父进程拥有 99% 以上;每次存储健康刷新执行多条 Git 子进程,并通过 Bun 的 Node 兼容 `spawnSync` 路径遗留未回收的直接子进程。健康刷新同时承担远程 fetch、checkout 和 pull,扩大了故障频率与外部依赖面。 +NC01 约 1 万个 zombie 中,Decision Center 长期 Bun 父进程拥有 99% 以上;周期健康刷新通过 Bun 的 Node 兼容 `spawnSync` 执行多条 Git 命令并遗留未回收子进程。修复改用 Bun 原生子进程路径,把远程 Git 同步移到启动/写入阶段,健康刷新只解析本地 `.git/HEAD`、ref 与 `packed-refs`。 -## 实现 +`gc remote memory-distribution` 已泛化为一次披露物理内存、PSS、进程 swap、Docker/Pod owner、zombie 分类、cgroup 和 Kubernetes 对象压力。NC01 的 cgroup 文件页回收与 Kubernetes 历史对象 retention 均由 `config/unidesk-cli.yaml` 管理,不终止 workload、不重启 k3s、不把 swap 计入可用内存。 -- Decision Center 改用 Bun 原生 `spawnSync`;200 次 Git smoke 的 zombie 子进程数为 0。 -- 远程 Git 同步只在启动和写入路径执行;周期健康刷新只解析本地 `.git/HEAD`、ref 与 `packed-refs`。 -- `gc remote memory-distribution` 默认一次披露进程 swap、Docker/Pod owner、zombie 泄露分类、cgroup 和 Kubernetes 对象压力,并保持在 10 KiB 输出预算内。 -- NC01 YAML 增加两个 `swappiness=0` 的精确 cgroup 文件页回收候选;不终止 workload、不重启 k3s、不把 swap 计入可用物理内存。 +## 自动交付验收 -## 运行证据 +Decision Center 通过正常 source PR、Gitea snapshot、PaC、BuildKit、GitOps 与 Argo 自动链滚动到 source `17dbd5aec5da13d050eed48bf27db5dd04c35bdb`,新 Pod 零重启且健康接口 ready。新 Pod 启动超过 300 秒后,Decision Center zombie owner 未再出现;全机进程从 11,598 降到约 780,zombie 从 10,817 降到 4-7,剩余少量归属 Todo Note 与 HWLAB Web,不属于本任务 owner。 -修复前 Decision Center 父进程 zombie 从 9993 持续增长至 10113。受控 cgroup GC job `nc01-memory-pressure-1784175371-858647` 两阶段均成功,cgroup 分别下降约 1.20 GiB 与 453 MiB,但并发工作负载快速重新占用,`MemAvailable` 净增约 62 MiB 后回落,证明反复 reclaim 不能替代源头修复和对象留存。 +## GC 结果 -## 待验收 - -合并后等待正常自动 CI/CD 发布,确认 Decision Center Pod 滚动、既有 zombie 清除且跨一个 YAML 健康周期不再增长;同时复核 `MemAvailable`、k3s/PSS、swap 和 Kubernetes 对象数量。 +- 将 NC01 Tekton 根 PipelineRun 留存窗口从 24h 调整为 12h,仍保护 active、每组最新 3 个、未知分组和无效时间对象;自动 timer 每 15 分钟最多回收 100 个。 +- 手动 retention job `nc01-kubernetes-retention-1784180778-1363045` 成功删除 292 个根 PipelineRun;devops-infra Pods 由 433 降到 150、TaskRuns 438 降到 149、Secrets 443 降到 154。 +- 两次精确 cgroup `swappiness=0` reclaim 均成功,但主机收益会被活跃负载快速再占用,不能作为长期 4 GiB 保证。 +- 稳定窗口内 `MemAvailable` 从泄露修复前约 2.4 GiB 提升到约 3.5 GiB;曾短时达到约 3.74 GiB,但未持续超过 4 GiB。后续 WebProbe 仍必须按真实 `/proc/meminfo` 门禁跳过,不得计入 swap 或继续盲目 reclaim。 diff --git a/docs/MDTODO/details/web-observe-runtime-reliability/R1.2.3_Task_Report.md b/docs/MDTODO/details/web-observe-runtime-reliability/R1.2.3_Task_Report.md index 98a7ba68..1cf19082 100644 --- a/docs/MDTODO/details/web-observe-runtime-reliability/R1.2.3_Task_Report.md +++ b/docs/MDTODO/details/web-observe-runtime-reliability/R1.2.3_Task_Report.md @@ -2,22 +2,20 @@ ## 根因 -Decision Center 的源代码泄露修复已经合并,但 `config/unidesk-host-k8s.yaml#delivery` 只声明 `services.todoNote`。自动 PaC 因此把 Decision Center 源码变化判定为 `runtime-inputs-unchanged`,没有构建镜像、写入 GitOps manifest 或触发滚动,导致运行面继续使用旧进程并持续积累 zombie。 +Decision Center 泄露源码修复已合并,但 `config/unidesk-host-k8s.yaml#delivery` 原本只声明 Todo Note,自动 PaC 因此把 Decision Center 变化判为无运行输入变化,没有构建镜像或触发滚动。 ## 实现 -- 把 UniDesk Host 交付配置改为 YAML-first 多服务清单;Todo Note 与 Decision Center 各自声明 source paths、镜像仓库、manifest 和 release state,共享输入独立声明。 -- 发布准备、BuildKit 构建和 GitOps 发布按服务生成独立状态与元数据;单次 source PR 合并仍是唯一触发,多个服务在一个 GitOps commit 中原子发布。 -- 通用服务 renderer 支持没有 Todo Note 提醒配置的服务,并保持数据库、GitHub storage、Secret 和 digest pinning 契约。 -- Pipeline hard timeout 调整为 3600 秒,满足不得低于一小时的运行约束。 +- 将 UniDesk Host 交付改为 YAML-first 多服务清单;Todo Note 与 Decision Center 分别声明 source paths、镜像、manifest 和 release state。 +- prepare、BuildKit 与 GitOps publisher 按服务输出独立状态,并在同一 GitOps commit 原子发布。 +- 通用服务 renderer 支持无 Todo Note reminder 的 Decision Center,并投影 YAML 的 `storage.healthRefreshSeconds` 为毫秒环境变量。 +- Pipeline hard timeout 调整为 3600 秒。 +- `unidesk-cicd` 明确首次部署或故障时可走受控单步调试,但最终必须回写 Git/YAML 并由完整自动链验收。 -## 静态验证 +## 验证 -- `bun scripts/cli.ts check --syntax-only`:11/11 通过。 -- `sh -n scripts/native/cicd/build-unidesk-host-image.sh` 与 `git diff --check` 通过。 -- Todo Note 和 Decision Center 均可独立渲染 Service/Deployment;Decision Center 不包含 Todo Note 提醒变量。 -- Bun 单文件 publisher smoke 通过,未使用 Vitest。 - -## 待验收 - -通过正常 PR 合并事件观察 PaC、GitOps 与 Argo 自动收敛;确认 Decision Center 运行 commit 更新、旧 zombie 随 Pod 滚动清除,并跨 300 秒健康周期不再增长。随后重新获取全局内存分布,根据实际 PSS、swap、cgroup 与对象压力执行一次受控 GC,目标是物理 `MemAvailable > 4 GiB`,swap 不计入。 +- PR #2277 建立多服务交付;PR #2282 修复首次滚动暴露的健康刷新 env 遗漏;二者均由正常 merge 事件交付,未人工触发 PaC、Tekton 或 Argo。 +- 最终 PipelineRun `unidesk-host-c48kb` 成功构建 Todo Note 与 Decision Center,GitOps commit `0038510edd8f656ceca730d193d38d3bd5cd4e74`,Argo `Synced/Healthy`。 +- Decision Center 运行 digest 为 `sha256:dd9031ea35cf7f7ce01e5593376fa3e342614d62e27d6e43d30a0820c5e24db5`,健康接口 deploy commit 为 `17dbd5aec5da13d050eed48bf27db5dd04c35bdb`。 +- 跨 300 秒后 Decision Center zombie owner 未再出现,旧 Pod 已退出。 +- 静态验证包括 syntax 11/11、shell 语法、双服务渲染、Bun 单文件 publisher smoke 与 `git diff --check`;未使用 Vitest。 diff --git a/docs/MDTODO/web-observe-runtime-reliability.md b/docs/MDTODO/web-observe-runtime-reliability.md index 2927b3e8..2d1c3441 100644 --- a/docs/MDTODO/web-observe-runtime-reliability.md +++ b/docs/MDTODO/web-observe-runtime-reliability.md @@ -19,10 +19,10 @@ #### R1.2.1 [completed] 为 UniDesk #1710 增加 `devops-infra` Kubernetes 历史对象留存:手动 `gc remote retention plan|run|status` 与 YAML 定时滚动回收必须复用同一 fail-closed 筛选器;只处理终态 PipelineRun,通过 ownerRef 后台级联,保留活跃、过新、未知分组和每组最新对象;完成 dry-run、受控执行、timer 安装和 `MemAvailable` 实证后收口,完成任务后将详细报告写入[任务报告](./details/web-observe-runtime-reliability/R1.2.1_Task_Report.md)。 -#### R1.2.2 [in_progress] +#### R1.2.2 [completed] 完成 [UniDesk #1710](https://github.com/pikasTech/unidesk/issues/1710) 的 Decision Center 子进程泄露与 GC 诊断收敛:修复周期性 Git 子进程未回收并把远程同步移出健康轮询;增强 `gc remote memory-distribution`,一次披露物理内存、PSS、swap、僵尸 Pod 归属、Kubernetes 对象压力和处置分类;经自动交付后验证僵尸不再增长并记录内存变化,完成任务后将详细报告写入[任务报告](./details/web-observe-runtime-reliability/R1.2.2_Task_Report.md)。 -#### R1.2.3 [in_progress] +#### R1.2.3 [completed] 补齐 [UniDesk #1710](https://github.com/pikasTech/unidesk/issues/1710) 的 Decision Center YAML-first 自动交付:把 `config/unidesk-host-k8s.yaml#delivery` 从 todoNote 单服务模型泛化为显式多服务清单,使各服务独立声明 source paths、镜像、manifest 和 release state;复用同一 PaC 事件完成受影响服务的并行/顺序构建与 GitOps 发布,不修改共享 controller、不人工补链,最终滚动 Decision Center 并跨 300 秒验证 zombie 不再增长,完成任务后将详细报告写入[任务报告](./details/web-observe-runtime-reliability/R1.2.3_Task_Report.md)。 ### R1.3