diff --git a/docs/research/conpty-2022-handle-growth.md b/docs/research/conpty-2022-handle-growth.md new file mode 100644 index 00000000..5d7e8355 --- /dev/null +++ b/docs/research/conpty-2022-handle-growth.md @@ -0,0 +1,51 @@ +# Server 2022 的 ConPTY 句柄增长:证据链与判读 + +本文记录 #21 的调查结果。所有数字都来自实际运行产物,未做外推。 + +## 1. 现象 + +`windows-2022-conpty` 基线长期为红。原因不是偶发:该作业要求每条样本 `steady_resources` 为真(即单条样本内 `handles_before == handles_after`),而在 Server 2022 上永不满足。 + +## 2. 逐轮数据 + +| 平台 | 首会话 | 之后每轮 | steady | +|---|---|---|---| +| Server 2022 | 41 → 55 | 55→56、56→57、57→58(+1/轮) | 从未达成 | +| Win11 | 46 → 52 | 52 → 52(5 轮持平) | 首轮后达成 | + +## 3. 阶段拆分 + +| 记录(2022) | before | after_start | after_close | +|---|---|---|---| +| startup | 41 | 62 | 55 | +| repeat 0 | 55 | 63 | 56 | +| repeat 1 | 56 | 64 | 57 | + +两平台会话期间增量相同(+8),差别只在 **close 之后**:2022 每轮少释放 1 个。 + +## 4. 类型与归属 + +按对象类型索引统计后,逐轮稳定增长的是**一个 type index 7** 的句柄;通过参照对象映射得到 `7 = Job`。进一步记录句柄值后: + +| 记录 | session_job | after(本进程 Job 句柄列表) | +|---|---|---| +| startup | 0xb0 | [0xf0] | +| repeat 0 | 0xf8 | [0xf0, 0x118] | +| repeat 1 | 0xa0 | [0xf0, 0x118, 0x134] | + +我们自己的 `job_`(0xb0/0xf8/0xa0)**每轮都被关闭**,残留的是另外的句柄值。Win11 上则完全没有残留。 + +## 5. 判读 + +- 增长不是本项目的 `CloseHandle` 遗漏; +- 它是 Server 2022 上系统 ConPTY/conhost 每会话向调用进程复制一个 Job 句柄且不回收的行为; +- 产品路线使用随包固定 ConPTY(ADR-0007),该 2022 基线属诊断参考,不应作为产品质量闸门。 + +## 6. 待决 + +是否把 `windows-2022-conpty` 的判定改为「记录、不强制零增长」,属于范围决策,需用户确认。 + +## 相关 + +- #21 及其评论中的逐次运行记录(含 run id); +- 探针:`experiments/conpty/probe.cpp`(类型统计与 Job 句柄值均为只读观测)。