| 问题 | 定谳 | 证据 |
|---|---|---|
| 常驻该不该允许? | 设计已在·执行翻车 | kais-ear hybrid_server 本有 idle TTL 900s reaper;但其 spawn 的 vllm EngineCore 在 server 优雅退出后逃过收割成孤儿,7.1G 独占 GPU2 8.6h,期间 UGQ dispatch_evict 全败 |
| 利用率长零=非法占用? | 否·判据是所有权 | 8188 缓存驻留 21G 利用率也是 0 但合法(可 /free)。合法=有租约或归属活服务;无租约+归属链断(init 收养)=非法可收割。利用率只做告警信号 |
| 长零自动清缓存? | 分两层 | ComfyUI 缓存层五期 evict-before-dispatch 已治;进程驻留层本次补上= gpu-reaper |
构造真孤儿:双 fork 守护化 + 中间代退出 → 孙进程被 user systemd 收养(ppid=2278),持 GPU 1178MiB,cmdline 无任何服务签名 —— 与 vllm 孤儿拓扑完全同构。
python3 /tmp/canary_hold.py · GPU 1178MiB · ppid=2278(init 收养)reap_candidate=1,登记进 candidates.json(宽限 1800s 计时开始,first_seen 落盘)once → 宽限满 → 二次核验 start_time 一致 → SIGTERM delivered=Truereaped 1244547 宽限10s满 归属链断 · 收割前快照落盘state/reaped-1790574044-1244547.json
{ "pid": 1244547, "name": "python3", "mem_mib": 1178,
"cmdline": "python3 /tmp/canary_hold.py", "start_time": 125949751,
"ppid": 2278, "rss_kib": 590968, "cwd": "/data/workspace/gpu-reaper" }
✓ 其余 7 个 GPU 进程(3×ComfyUI 主从、breeze-tts、music3、chrome-gpu、hermes venv)全部判 warn_unleased 零误杀
| 防线 | 语义 | 验证 |
|---|---|---|
| 白名单最优先 | lora_lab/batch/benchmark + 显式 pids 永不碰 | 67 单测 |
| 服务签名=所有权 | cmdline 命中 comfyui/vllm/hybrid_server/breeze-tts/music3-env/chrome/hermes-agent… → 只 warn 不杀 | 真机 7 进程实测 |
| 宽限+撤销 | 默认 1800s;期间取得租约/归属修复 → 自动撤销记 repealed | 单测 + 生产 daemon 已登记金丝雀后 once 撤销路径 |
| pid 复用防御 | kill 前 re-read /proc/stat field22 比对,不一致放弃 | 单测 |
| 缺源降级 | KAP 挂→孤儿照收;/proc 挂→全局禁杀只 warn | 单测 |
| 只杀自身 pid | 绝不 kill 进程组 | 代码审 |
| 重启不丢计时 | candidates.json 原子写+恢复(operator 增补:daemon 重启宽限归零缺陷修复) | 真机金丝雀登记实测 + 2 单测 |
systemctl --user status gpu-reaper → active (running), 60s/cycle, grace=1800s journalctl --user -u gpu-reaper -f → cycle: reap_candidate=N warn_unleased=N 账本: /data/workspace/gpu-reaper/state/ledger.jsonl (JSONL 逐事件) 卸载: systemctl --user disable --now gpu-reaper
仓库: /data/workspace/gpu-reaper · 设计稿 docs/GPU_RESIDENCY_GOVERNANCE.md · 工单 docs/WORKORDER.md · 交付报告 docs/DELIVERY_REPORT.md
service_signatures(config/gpu-reaper.yaml),否则 30min 宽限后会被收割——这是特性不是缺陷(孤儿语义),但部署新服务时要有意识