外观
Thread Count(进程线程数)
阶段交付 · 2026-10-11(E4):内部164固定五个全新正常UI轮各240/240有效、120/120完整时段、240/240正常观察包络、最大间隔0.5秒,0来源违规/偏离/严重/不可评估;四已交付指标及15工程保护通过。整体5/54,下一网络发送。仅已测设备A/自有目标App A范围,异常筛查非独立精度校准,不保证所有App未来100%。完整证据。
当前共享采集源(2026-10-07 G84):产品 SysmontapRawAdapter._make_stream 先用同一个 pymobiledevice3 原生 DeviceInfo 查询时钟与支持列,再用原生 Sysmontap 构造器建立完整14消费者固定依赖闭包(11进程列、3系统列);默认 intervalMs=500、ur=500 ms、sampleInterval=500000000 ns,保留CPU元数据与原生时钟。必需列缺失、非法类型或重复时明确失败,不以减少指标、补值或旧值续点降级。此为采集配置修复,不改变本页数值公式、scope、单位、质量/候选标签与独立误差门;完整54项与正式五轮仍待验,源码/安装验证不等于本指标数值校准。方案与验证。
作用域属性:[进程级 · 目标专属](Process Scope )
1. 定义与业务价值
Thread Count 是目标进程当前的线程数快照,可包含主线程、libdispatch/GCD 工作线程与应用自行创建的线程。它不表示这些线程此刻都处于 runnable/active 状态,也不能把“GCD 队列”本身当作线程。线程数持续单调上升可以作为线程生命周期异常的候选信号,但不是线程泄漏的直接证明。
2. metricID / scope / unit / source
| 字段 | 值 |
|---|---|
| metricID | ios.process.thread.count |
| scope | process |
| unit | count |
| source | dvt.sysmontap |
| sourceKey | threadCount |
取自当前 Registry (MacApp/Sources/PerfowlCore/PerformanceModels.swift)。
3. iOS 系统原理
线程是内核调度实体之一,并会带来栈、调度状态等资源开销;具体栈保留/提交大小会随线程类型、运行时和系统版本变化,因此本页不使用固定 MB 数作为通用事实。Perfowl 这里只读取 sysmontap 暴露的进程线程数快照。
4. 系统服务 / 通信通道 / 采集命令与实现
通道:com.apple.instruments.server.services.sysmontap(DTX )。采集实现:MacApp/Sidecar/perfowl_collector_core/adapters.py::SysmontapRawAdapter 调用 pymobiledevice3 原生 Sysmontap(provider, process_attributes, system_attributes, interval_ms=intervalMs)(默认 500ms),按目标 PID 过滤后读取 threadCount 字段——这是 pymobiledevice3 的原生返回值,Perfowl 没有自行计算或估算。
5. 原始字段与字段语义
Processes[*].threadCount:sysmontap 上报的目标进程条目中的线程数快照字段。
6. 精确公式
Thread Count 是瞬时 gauge ,不做差分或聚合:
text
ThreadCount = row.threadCount(原值为正有限整数且绑定可信时;否则 null,不取整)来源:MacApp/Sidecar/perfowl_collector_core/metric_engine.py::_process_metrics,先经_thread_count检查正整数/精确序列化范围,再保留原值映射;原公式raw-gauge.v1不变。
7. Clock / Window / Freshness
Gauge 类型:每个采样窗口(约 500ms)产出一个快照值,不跨窗口累积,没有滑动平均。
8. Baseline / Reset / Discontinuity
无前值依赖,每次采样独立读取,无 counter reset 语义(这是 gauge,不是 counter)。
9. Quality:valid / candidate / missing
质量与原值和身份绑定:原字段为正有限整数且identity_status == "verified"、正整数目标绑定有效才为candidate;未知身份为identity-unverified/null;非法值或字段缺失为missing/null。发布端独立新鲜性/原native窗口检查失败同样不输出候选值,不补0。
10. 合法 0 的条件
不存在合法的 0 值——任何存活进程至少有 1 个主线程。读到 0 应视为异常快照。
11. 当前证据、校准与平台覆盖
线程数已完成专项E4固定五轮阶段验收(164、设备A、自有目标App A、默认40项/500ms)。每轮240新鲜原值/120完整时段/240正常包络;原Raw→发表、自然task_threads参考与完整封存均复核。calibrated=false、independentAccuracyPassed=false:没有逐点读取时刻的独立精度校准声明。阶段记录。
12. 如何分析:能得到什么结论,不能得到什么结论
能得到:目标进程线程数量的快照与趋势,可用于发现持续增长并做同版本回归对比。
不能得到:不能仅凭线程数证明“线程泄漏”,也不能判断具体是哪个组件创建了线程,需要结合线程列表、调用栈、代码审查或 Instruments。iOS 没有可由本项目证据支持的统一线程数硬阈值;应按同设备、同系统、同场景建立团队基线。
13. 常见误区
- 把某个具体线程数(如 100)当作 iOS 官方硬性上限;
- 把线程数上升直接等同于“泄漏”,而不检查线程生命周期与场景是否本来就会扩大并发规模。
14. Legacy / 历史实现
无历史候选版本记录;实现自初始版本起即为直读 gauge。
15. 版本历史与来源批次
本页由 site/knowledge/metrics/system-condition-metrics.md 拆分而来。
| 版本 | 日期 | 修订要点 |
|---|---|---|
| v1(本页) | 2026-09-18 | 从 system-condition-metrics.md 拆出,成为 Thread Count 独立 Canonical ;补充 _counter_rate/gauge 读取路径的精确代码引用。 |
采集源版本更新 · 2026-10-07
G84将SDK全列factory改为固定共享11+3列、输出与采样节拍一致;原生服务/DTX通道不变,支持列仍由SDK查询,传输及指标转换为Perfowl适配层,SDK来源和自研计算分开。初missing 、counter warmup/reset、VM近似质量等原边界保留,不外推其他设备/场景持续100%。来源批次。
发布质量更新 · 2026-10-11(阶段交付前历史快照)
当前源码将线程数限定为目标进程原字段的正有限整数(允许恰为整数的数字类型,精确序列化范围≤2^53−1)。0、负哨兵、分数、布尔、非有限值和缺失均为missing/null,不取整、不补0;身份未核实为identity-unverified/null。这个范围是序列化精确性限制,并非iOS线程数硬上限。
发布使用独立thread-count-source-freshness.v1队列:容量6、原到达时刻寿命为3个采集间隔、每个原源token仅使用一次;相同线程数但新的原source事件仍可发布。PID/代际/来源epoch/reconnect、重复与倒退序列均需核对。具备原native元数据的生产载荷,还核原Start/EndMachAbsTime及sysmontapMachTimeInfo;同源同代同時基的结束tick需严格递增,重复/回退/不完整窗不伪装新值。FIFO中每个点保留自己的原native窗口,不能用最新窗口替换旧队列点;CPU/内存并非线程数代理。
Owner最新验收以来源/公式可信、≥99%连续、五新轮及固定异常筛查为主,独立精度校准非前置。线程数的正常异常包络容差为max(2线程,观察侧值10%),严重界为max(8线程,观察侧值30%);以自有参考的完整原taskThreads窗口观测包络判断,不是同刻精度或普遍零误差保证。
当前线程数正式0/5,尚未阶段交付。 本机唯一164包含整数/新鲜队列及同两连接线程原源修复;一次真实资格229/240可用、229可评估点全部正常,但primary原事件供给不足,未达99%。已复用既有第二连接增加独立原threadCount列(只500ms且实际选择线程时),软件2189回归与新签名唯一安装通过,真实新五轮尚待;原partial和全部失败保留。 全部54项仍按顺序推进,不借旧内存轮验收线程数。修复与未关门条件,固定异常政策。
| 版本 | 日期 | 修订要点与来源 |
|---|---|---|
| 发布v1 / 原公式raw-gauge.v1不变 | 2026-10-11 | 独立线程新鲜队列、整数与身份准入、原native窗口去重;源码E2,五新轮与签名安装待验。 |
连续性修复进展 · 2026-10-11
一次新正常GUI资格没有发现可评估数值的异常偏离,但11个机会没有新的线程原事件,不能以旧值续点或缩分母验收。后续独立精度不是交付前置,异常/来源可信/99%连续/五新轮保持。主11列不变,计划在既有第二sysmontap连接按实际Session线程选择加入原threadCount,使用单独带-thread的Raw类型与原native窗,不借CPU novelty或增第三连接。原公式raw-gauge.v1、process/count与整数/身份/null边界不变;软件/包验证不等真实五轮。
签名164已唯一覆盖(E3),默认联合补流七列/最多两DTX连接,线程双role各自高水位、同绑定时基及最近64已准入结束tick独立去重。原线程数公式/单位不变,原240机会/五新轮不减。2189软件回归通过不替代新的真实源资格;上文G464缺口来自旧163,失败与原数字保留,不外推164已无缺值。当前包及边界。
2026-10-11 · v5专项五轮阶段交付
原公式raw-gauge.v1不变。复用既有两个DTX连接,主/补来源各自native高水位、同绑定时基与最近64结束tick去重,FIFO6、TTL=3×实际interval;缺值保持null,不取整或回填。正式五轮每轮240/120/240、0异常偏离,独立精度未证。正常观察包络按原native窗±1秒全部task_threads参考范围扩展max(2线程,10%),严重扩展max(8线程,30%),不是普适准确性误差声明。来源阶段结果。