Merge pull request #2284 from pikasTech/docs/1710-memory-closeout
docs: 收口 Decision Center 泄露与 GC 验收
This commit is contained in:
@@ -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 <node> 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 <node> 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。
|
||||
|
||||
@@ -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。
|
||||
|
||||
@@ -19,10 +19,10 @@
|
||||
#### R1.2.1 [completed]
|
||||
|
||||
为 UniDesk #1710 增加 `devops-infra` Kubernetes 历史对象留存:手动 `gc remote <node> 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 <node> 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
|
||||
|
||||
Reference in New Issue
Block a user