Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions docs/research/conpty-2022-handle-growth.md
Original file line number Diff line number Diff line change
@@ -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 句柄值均为只读观测)。