Architecture 02 · Native Mac + Offline-first + Cloud Report
Perfowl 第一版基座:Mac 负责可信采集,Cloud 负责长期记录与报告
底层正式收敛为 pymobiledevice3 主采集、Apple xctrace 按需增强。第一版采用 PerfDog 式工作流:Mac 客户端连接设备、选择 App、实时采集和标注;结束后先形成完整本地 Session,再断点上传;后端记录每次测试并生成可回溯的 Web 报告。
Decision
结论先行
本地优先
采集不依赖公网;上传失败不影响测试完成;Session 可回放、重传和审计。
云端职责
保存每次 Run、建立项目历史、生成报告、区间查询、后续支持比较与团队协作。
ADR-002
架构决策记录
| 决策项 | 第一版决定 | 理由与后果 |
|---|---|---|
| 产品入口 | 原生 macOS 单窗口客户端 | 与 Codesign4QC 技术栈一致,设备、进程、文件、子进程和 Instruments 集成更自然。 |
| 底层采集 | pymobiledevice3 独立 Sidecar | Python 私有协议适配速度快;通过稳定进程协议与 Swift 隔离;不把 Python 对象渗透到 UI。 |
| 增强诊断 | xctrace 独立 Adapter,用户主动开启 | 保留 Apple .trace 证据;Xcode 缺失或模板不支持时,基础采集继续工作。 |
| 本地数据 | append-only Session 包 + 可重建 SQLite 索引 | 原始事实不被覆盖;图表、分析和上传均可重算;崩溃后可继续 finalize。 |
| 上传 | Manifest 先行、分块直传、哈希校验、幂等 finalize | 大 Session 与 Trace 支持断点续传;重复点击不产生重复测试记录。 |
| 后端 | Go 模块化单体 + PostgreSQL + S3/MinIO + 同仓 Worker | 第一版部署面小,保留 API/处理任务边界;不提前引入微服务和消息中间件。 |
| Web 报告 | React + TypeScript,服务端提供多分辨率时序查询 | 支持同步十字线、区间统计、异常证据和后续多 Run 对比。 |
| 事实来源 | 本地原始 Session 与云端对象存储中的不可变 Artifact | PostgreSQL 只保存元数据、分析和索引;报告缓存损坏后仍可重建。 |
Assumptions
第一版设计假设与容量边界
产品假设
- 第一版只支持 macOS Host + 一台 iOS 真机 + 一个主目标进程。
- 基础采集允许完全离线,用户可在测试结束后再联网上传。
- xctrace 是可选增强,用户安装完整 Xcode 才显示可用。
- 手工探索是首个主场景,CLI/CI、多设备与自动化后置。
容量假设
- 基础指标约 1 Hz,单次常见会话 10 分钟至 2 小时。
- 第一阶段以中小团队为目标,不以万设备同时采集设计。
- Trace、截图和日志远大于基础时序,全部走对象存储。
- 没有真实用量前,不以虚构 QPS 决定微服务或时序数据库。
当单 Workspace 的日 Run、单 Run 事件量、报告查询延迟或 Worker 积压达到实际阈值时,再基于观测结果拆分处理服务或引入 ClickHouse;API 与 Artifact 契约保持不变。
Options considered
关键方案取舍
| 决策 | 推荐 | 备选 | 取舍 |
|---|---|---|---|
| Mac UI | SwiftUI + 必要 AppKit | Electron / WebView 壳 | 原生方案更适合设备、子进程、文件、Keychain 和 Instruments 集成;代价是跨平台 UI 不能复用。 |
| Python 集成 | 独立 Sidecar | 嵌入 CPython / 直接调用 CLI | Sidecar 能做长连接和协议隔离;嵌入增加签名与崩溃面,碎片 CLI 会重复建链且难保证会话一致性。 |
| 本地事实存储 | Chunked JSONL + 可重建 SQLite | 全部 SQLite / 单个大 JSON | JSONL 更适合追加、恢复和协议审计;SQLite 只承担发现与查询缓存,避免高频事务成为唯一事实源。 |
| 后端形态 | Go 模块化单体 | TypeScript 模块化单体 / 微服务 | Go 便于单二进制、并发上传和 Worker;若团队 TypeScript 更成熟,可保持同一模块契约替换实现。首版微服务部署成本大于收益。 |
| 时序存储 | 对象存储 Raw + PostgreSQL 摘要/索引 + LOD | 直接引入 ClickHouse | 在 1 Hz 与未知规模下先减少运维面;当查询量和事件量证明需要时再替换查询后端。 |
| 上传入口 | 对象存储预签名分块直传 | 所有数据经过 API | 直传避免 API 承担大 Trace 带宽;API 仍控制清单、权限、checksum 和 finalize。 |
Version 1 boundary
第一版能力边界
| 能力域 | 第一版基座 | 后续对齐 PerfDog | 承诺等级 |
|---|---|---|---|
| 设备与目标 | USB 发现、Trust/Developer Mode/DDI/tunnel 状态、App 列表、运行进程、目标重绑 | Wi-Fi、多设备并行、App Extension/XPC 多进程编组 | P0 |
| 实时指标 | App CPU、Footprint/Resident Memory、线程、上下文切换、唤醒、磁盘速率、基础 FPS/GPU 趋势 | FrameTime、Jank/Big Jank、GPU Counter、稳定能耗、网络细分 | 需 F0 校准 |
| 测试操作 | 选择采集项、开始、暂停记录、继续、结束、Marker、场景标签、实时图表 | 区间剪辑、模板、重复轮次、阈值告警、自动化控制 | P0 |
| 本地记录 | Session 列表、回放、异常结束恢复、导出原始 JSONL/CSV、上传状态 | 跨电脑迁移、批量归档、保留策略 | P0 |
| 深度诊断 | 检测 Xcode/xctrace、录制 .trace、保存模板与版本、打开 Instruments | 结构化 TOC/表格、与实时曲线区间关联、符号与 dSYM 管理 | 增强 |
| 云端 | 登录、Project、每次 Run、断点上传、处理状态、单次 Web 报告 | 团队、任务、基线、多维对比、共享、权限、私有化部署 | P0 |
| 分析 | 概览、时间曲线、区间统计、P50/P90/P95/P99、Marker/场景、质量状态 | 自动瓶颈归因、趋势回归、AI 分析、跨版本质量门禁 | 基础闭环 |
Codesign4QC extraction
Codesign4QC 如何进入 Perfowl
| 现有能力 | 处理方式 | Perfowl 目标模块 | 必须修正 |
|---|---|---|---|
tools/performance_collector.py | 算法和测试优先复用 | CollectorSidecar | 升级为明确 handshake/control 协议;补 Network/Energy 独立通道;属性与单位版本化。 |
| provider、tunnel、4 次退避 | 重构后复用 | DeviceConnectionBroker | 当前代码把 iOS 17+ 全部交给 tunneld;Perfowl 应优先使用 pymobiledevice3 当前 macOS native/no-root 路径,仅为 17.0–17.3.1 等场景保留受控 privileged fallback。 |
| PID + executable + generation | 保留语义 | TargetBinding | 加入 bundleID、startTime、process role;累计量差分严格限定在 generation 内。 |
PerformanceEventRuntime | 抽成独立 Swift Package | PerfowlEventCore | 消除 Codesign4QC 命名;增加 chunk rollover、磁盘预算和 crash-safe checkpoint。 |
| Schema v2 Envelope | 作为 v1 设计起点 | PerfowlSessionSchema | 增加 metricDefinitionVersion、clockDomain、unit、scope、collectorBuild 和 upload artifact 元数据。 |
| Marker/Scenario/TestPlan | 模型可借鉴 | AnnotationCore | 修复规则只取首个场景的问题;区分 pause gap、场景和普通 Marker。 |
PerformanceSessionIndex | 思路复用 | LocalRunIndex | SQLite 继续是可重建索引;加入 upload state、serverRunID、artifact checksum。 |
PerformanceView / 大型 AppModel | 不复制结构 | 新 Feature Store 与 ViewModel | 设备、采集、Session、上传、报告各自拥有状态;UI 不直接管理进程和文件句柄。 |
| Probe/注入/签名链 | 排除 | 无 | 与 Perfowl 无侵入定义冲突,不进入源码、包体或会话协议。 |
Mac client
Mac 客户端分层
| 模块 | 职责 | 输入 / 输出 | 边界 |
|---|---|---|---|
DeviceDiscovery | 监听 USB、读取设备快照、发布连接变化 | usbmux/lockdown → DeviceSnapshot | 不打开长 DVT 流 |
DeviceConnectionBroker | 选择 lockdown/native/userspace/tunneld 路径,管理能力与恢复预算 | Device + OS → ProviderLease | 版本判断集中在此处 |
TargetCatalog | App/进程列表、目标身份、进程角色和重绑 | Device → AppIdentity/ProcessIdentity | UI 只消费稳定模型 |
SessionOrchestrator | 冻结 SessionPlan,协调 collector、pause、stop、finalize 和恢复 | UserIntent → SessionState/Event | 不解析 DVT 私有字段 |
CollectorSupervisor | Sidecar 生命周期、stdio 协议、心跳、超时、退出原因和版本校验 | Plan → RawCollectorEvent | stdout 仅协议,stderr 仅诊断 |
MetricNormalizer | 映射 metric ID、单位、scope、generation、质量和算法版本 | Raw → NormalizedMetric | 未知/缺失保持 Unknown |
ClockMapper | 保留 source/host/wall/xctrace 时钟并记录映射误差 | Clock samples → TimeMapping | 墙上时间不用于短间隔真值 |
EventIngestor | 有界队列、优先级、批量写盘、丢弃/乱序/gap 计数 | Events → Chunk + Quality | 磁盘 IO 不进入主线程 |
LiveQuery | 最近窗口、降采样、在线统计和多曲线同步游标 | Event stream → ViewState | UI 不保留全量样本 |
UploadManager | 创建云 Run、分块、哈希、断点、重试、网络恢复 | Finalized Session → Cloud Run | 采集完成不依赖上传成功 |
Collector contract
pymobiledevice3 Sidecar 设计
进程模型
- 每个活动 Session 一个长期 Sidecar,避免多个 Python 进程争抢同一 DVT 服务。
- stdin 接收版本化控制命令;stdout 只输出 NDJSON 事件;stderr 输出人类可读诊断。
- 首条事件为
hello,包含 protocol、collector、pymobiledevice3、Python、架构与能力。 - Host 负责终止预算、崩溃分类、最后心跳和 artifact 收尾。
采集通道
sysmontap:目标进程 CPU、内存、线程、切换、唤醒、磁盘与累计计数。graphics:前台设备 FPS 与 GPU 趋势,明确 scope 为 foreground-device。network:连接/流量原始事件,先证明归属再生成 App 指标。energy/notifications:按 capability 启动;缺失时记录 Unsupported。
连接策略
- iOS 16 及更早:Lockdown/usbmux。
- iOS 17.4+:macOS 优先 native/no-root provider,失败时按固定顺序退化并记录实际 route。
- iOS 17.0–17.3.1:进入 privileged tunnel 专项路径,并在 UI 显示一次性设置状态。
- 连接路径属于 Session capability,不只写在日志中。
协议原则
- 所有事件携带 sessionID、sourceID、sequence、generation、sourceMonotonic、hostReceive、quality。
- 字段名与单位通过 Metric Registry 声明,Sidecar 不输出 UI 文案。
- 控制事件 P0、基础 sample P1、高频明细 P2;每类丢弃均可观察。
- 累计量遇到重启、回绕或缺样时重置差分基线。
Deep diagnosis
xctrace 增强链
| 阶段 | 第一版行为 | 产物 | 降级 |
|---|---|---|---|
| 预检 | 检查完整 Xcode、active developer directory、设备、模板与目标可见性 | xctrace-capability.json | 基础采集继续,增强按钮说明缺失项 |
| 录制 | 用户选择 Time Profiler / Animation Hitches / Allocations / Game Performance 等已验证模板 | 原始 .trace、命令、模板、Xcode 版本 | 录制失败写入 diagnostic artifact |
| 导出 | 先执行 TOC 探测,再按版本化选择器导出可用表格 | toc.xml、结构化导出 | 解析器漂移时保留原 Trace 并停止结构化分析 |
| 关联 | 记录 Trace 起止和 Host 时间映射;在报告中链接到相同测试区间 | TraceArtifact + TimeMapping | 映射误差过大时只显示独立 Artifact |
| 分析 | 第一版优先“打开 Instruments”和证据保留 | 下载/打开入口 | 源码级符号依赖 dSYM 与可调试环境 |
Offline-first artifact
本地 Session 包与事实模型
Perfowl Sessions/<session-id>/
├── manifest.json # 身份、状态、版本、开始/结束、失败原因
├── session-plan.json # 开始前冻结的目标、指标、选项与开销预算
├── capabilities.json # 设备、route、DVT/xctrace、实际支持项
├── metric-registry.json # metric ID、单位、scope、来源、算法版本
├── events/
│ ├── events-000001.jsonl # append-only 统一事件 Chunk
│ └── events-000002.jsonl
├── raw/
│ ├── collector-000001.jsonl # 未归一化 Sidecar 事实
│ └── sidecar.stderr.log
├── annotations.json # Marker、场景、pause gap
├── quality.json # drop/gap/reorder/writer/clock/route 质量
├── analysis/
│ ├── summary.json # 可重建摘要
│ └── lod/ # 本地回放多分辨率曲线缓存
├── traces/<trace-id>/ # .trace、TOC、导出与诊断
├── upload.json # serverRunID、分块哈希与重试状态
└── checksums.json # 不可变 Artifact SHA-256
不可变事实
原始 collector、统一事件、Marker/场景控制事件、Trace 和 capability snapshot。云端接收后按 checksum 保存,不做原地修改。
可重建派生
SQLite 索引、图表 LOD、统计、规则结论、HTML/Web 报告缓存。算法升级时保留旧版本并生成新 analysis revision。
Metric Definition 最小字段
{
"id": "ios.process.cpu.non_normalized",
"displayName": "App CPU",
"unit": "percent",
"scope": "process",
"source": "dvt.sysmontap",
"aggregation": ["avg", "p50", "p95", "max"],
"definitionVersion": "1",
"support": "validated | experimental | unsupported",
"qualityRequirements": ["target_bound", "unit_verified"]
}
Cloud foundation
后端与 Web 报告架构
后端模块
| 模块 | 职责 | 第一版部署 |
|---|---|---|
Identity | 登录、token 刷新、用户与最小 Workspace 权限 | API 进程内模块 |
Projects | Project、AppIdentity、成员最小关系 | PostgreSQL |
Runs | 每次测试身份、设备/App 快照、状态、客户端版本、质量摘要 | PostgreSQL |
Uploads | 上传会话、分块计划、签名 URL、幂等 finalize、checksum | API + S3/MinIO |
Processing | 完整性验证、事件扫描、统计、LOD、规则和报告版本 | 同仓独立 Worker;任务表使用 PostgreSQL 锁 |
Reports | 概览、曲线窗口、区间统计、Marker、质量、Artifact 下载 | API 查询 + Web |
Audit | 上传、重算、删除、分享等操作记录 | PostgreSQL append-only 记录 |
核心 API 契约
| 接口 | 用途 | 幂等键 / 关键结果 |
|---|---|---|
POST /v1/runs | 创建云端 Run 草稿 | clientSessionID 唯一;返回 serverRunID |
POST /v1/runs/{id}/upload-plan | 提交 artifact manifest 与 checksum | 返回缺失分块和直传地址 |
PUT signed-object-url | 分块直传对象存储 | 按 artifact/chunk checksum 去重 |
POST /v1/runs/{id}/finalize | 确认上传完成并进入处理 | 重复调用返回同一 processing revision |
GET /v1/projects/{id}/runs | 测试记录列表、筛选和状态 | 游标分页 |
GET /v1/runs/{id}/series | 按 metric、时间窗口和分辨率读取曲线 | 返回 min/max/avg/count 与质量 |
GET /v1/runs/{id}/report | 报告概览、统计、异常和 Artifact | 带 analysisVersion |
Domain model
云端核心数据模型
| 实体 | 关键字段 | 说明 |
|---|---|---|
| Workspace | id, name, retentionPolicy | 团队与数据边界;第一版权限只做 Owner/Member。 |
| Project | id, workspaceID, name, appKeys | PerfDog“测试项目/任务”中的稳定归档容器。 |
| AppIdentity | bundleID, executable, displayName | 跨版本稳定身份;版本/build 保存在 Run 快照。 |
| TestRun | clientSessionID, projectID, state, startedAt, endedAt, appSnapshot, deviceSnapshot, quality | 每次测试一条记录;本地 Session 与云 Run 一一对应。 |
| Artifact | runID, kind, objectKey, checksum, size, immutable | raw/event/trace/log/export/report 等文件。 |
| MetricDefinition | metricID, unit, scope, source, definitionVersion | 报告名称和比较合法性的基础。 |
| MetricSummary | runID, metricID, window, count, avg, p50, p95, p99, min, max | 全局与场景统计;派生数据可重算。 |
| Annotation | runID, type, name, start/end, source | Marker、场景和 pause gap 使用同一时间轴。 |
| AnalysisRevision | runID, algorithmSet, state, resultArtifact | 同一原始 Run 支持多版本分析,旧报告仍可追踪。 |
| UploadSession | runID, artifactPlan, completedChunks, expiresAt | 断点、重试和清理孤儿对象。 |
Security & privacy
安全、隐私与数据生命周期
客户端
- 访问令牌只进入 macOS Keychain,不写 Session、日志或 UserDefaults。
- Session 默认只采集明确启用的指标;日志、截图、Trace 单独显示数据敏感提示。
- 上传使用 TLS,预签名地址短时有效;日志对路径、token 和账号信息脱敏。
- 本地 Session 的删除、保留和自动清理由用户可见策略控制。
后端
- Workspace/Project/Run 每次查询都执行租户授权,不能只依赖前端隐藏。
- Artifact 服务端加密,checksum 防止静默损坏;对象键不包含原始文件名或账号信息。
- 上传、下载、重算、分享和删除进入 Audit;第一版分享功能保持关闭。
- 删除采用“标记 → 后台清理对象 → 审计完成”的可追踪流程,并明确保留期。
PerfDog-like workflow
Mac 产品信息架构与交互
- 登录与项目
登录后选择 Workspace/Project;token 已缓存且网络中断时仍允许本地采集,结束后进入待上传队列。
- 连接设备
顶部设备选择器展示连接、Trust、Developer Mode、DDI、Tunnel 和 iOS 版本;问题直接给出下一步,不只显示“连接失败”。
- 选择 App/进程
按 App 名、Bundle ID、运行状态筛选;默认绑定主进程,支持目标退出后按 stable identity 重绑并标出 generation。
- 配置指标
左侧指标区采用“采集 / 显示”分离:关闭、采集但隐藏、采集并显示;每项展示 scope、开销和支持等级。
- 开始测试
开始前冻结 SessionPlan,显示实际 route 与缺失能力;进入主视图后图表共享时间轴和十字线。
- 暂停记录与继续
暂停只停止测试样本写入,保持设备与采集器连接;时间轴写入 pause gap,继续时新建连续片段,避免把空白当成 0。
- Marker 与场景标签
单点 Marker 标记事件,场景标签表示时间区间;快捷键、颜色和命名可编辑,所有标注进入统一事实流。
- 结束与确认
先停止采集并完成本地 finalize,再弹出名称、Project、备注与“保存并上传”;上传可在后台继续。
- 历史与回放
本地记录展示完成/异常/待上传/上传中/云端已就绪;打开后使用与实时页同一图表组件回放。
- Web 报告
浏览器展示概览、同步曲线、区间统计、场景、异常证据、数据质量、设备/App 快照和原始 Artifact。
主窗口布局建议
测试工作台
顶部:Project、设备、App/进程、连接状态;左栏:指标采集/显示与当前值;中央:多曲线时间轴;右上:开始、暂停、继续、结束;底部:Marker、场景、日志与质量状态。
历史与上传
左侧导航切换“实时测试 / 本地记录 / 上传队列 / 设置”;历史列表按 App、设备、版本、时间和上传状态筛选;报告在客户端回放与浏览器云端之间保持相同术语。
Web report v1
第一版报告结构
| 页面区块 | 内容 | 证据要求 |
|---|---|---|
| Run Header | 名称、Project、App 版本、设备/iOS、开始/结束、时长、客户端/collector 版本、状态 | 全部来自不可变 manifest 快照 |
| Overview | 关键指标 avg/p95/max、采样数、场景数、错误和质量徽标 | 展示 definitionVersion 和有效样本比 |
| Timeline | CPU、Memory、FPS、GPU、Network 等共享时间轴,缩放、拖动、同步十字线 | 每个点保留 scope 与 quality |
| Interval Inspector | 框选区间统计、起止、变化量、P50/P90/P95/P99、异常点 | 查询携带 resolution,关键 extrema 不被降采样吞掉 |
| Scenes & Markers | 场景带、Marker、pause gap、注释 | 来源可追到统一事件 ID |
| Quality | route、能力、drop/gap/reorder、断连、重绑、写盘、上传和时钟误差 | 质量异常不隐藏在脚注 |
| Deep Trace | xctrace 模板、起止、状态、Trace 下载/打开、结构化摘要 | 原始 .trace 始终保留 |
| Artifacts | 原始事件、CSV、诊断、Manifest、Checksum | 下载操作进入审计 |
State machines
关键状态机
设备
disconnected → detected → trusted → developerReady → routeReady → available;任何失败都保存 code、action 和 lastGoodState。
本地 Session
draft → validating → preparing → recording ↔ paused → stopping → finalizing → completed,旁路为 degraded / failed / cancelled / recovered。
Collector
idle → launching → handshaking → streaming → recovering → stopping → stopped;恢复预算耗尽后 Session 进入 degraded 或 failed。
上传
localOnly → planning → uploading → verifying → processing → reportReady,错误进入 retryable / blocked / rejected 并保留已完成分块。
云 Run
draft → receiving → uploaded → validating → analyzing → ready,异常为 incomplete / invalid / processingFailed。
进程绑定
targetResolved → waiting → attached(generation N) → ended → rebinding → attached(N+1);累计指标不跨 generation。
Non-functional requirements
基座质量目标
| 目标 | 第一版验收标准 | 验证方法 |
|---|---|---|
| 长时稳定 | 60 分钟基础会话不因 UI、网络或后台上传中断;accepted 与 persisted 可对账 | 固定设备矩阵重复长测,保存事件与 Host/Device 开销 |
| 实时延迟 | 1 Hz 基础指标 source→UI p95 目标 ≤ 1.5 秒;延迟样本保留原时间 | source、host receive、UI present 三阶段时间戳 |
| 内存有界 | 实时 UI 和写入队列不随会话时长线性增长 | 120 FPS 压力事件 + 慢盘/暂停/后台切换 |
| 异常恢复 | 客户端重启可识别 unfinished Session 并完成恢复或失败收尾 | 强制结束 App、拔线、Sidecar crash、磁盘满、Mac 休眠 |
| 上传可靠 | 网络中断后从缺失 chunk 续传;重复 finalize 只产生一个 Run | 代理断网、token 过期、对象重复、checksum 错误 |
| 报告可追溯 | 任一统计可追到 metric definition、原始 chunk、区间和 analysisVersion | 抽样从 Web 数值反查原始事件 |
| 离线运行 | 移走源码目录、干净用户目录下仍可采集、回放、导出并排队上传 | arm64/x86_64 App/DMG、签名、Sidecar 哈希和无网启动 |
| 无侵入 | 包体、运行进程和会话中不存在 Probe、重签、注入或 WDA 默认依赖 | 静态包检查 + 真机进程/安装前后对照 |
Delivery gates
建议实施顺序
| 阶段 | 交付 | 进入条件 | 退出条件 | 当前状态 |
|---|---|---|---|---|
| F0 真值与基座验证 | pymobiledevice3 route、字段/单位、CPU/Memory/FPS/GPU、并发 xctrace、开销和 60 分钟稳定实验 | 底层方向已确认 | 固定 fixture、Metric ADR、支持矩阵、授权交付结论 | A Conditional Pass · B Partial / E2 |
| M0 工程骨架 | Swift Package 边界、Mac Shell、Sidecar handshake、Session Schema/Store、模拟事件 | F0 中协议与指标字段冻结;当前以 Experimental 并行落地 | 无需真机可完整演示 Session 生命周期和恢复 | 已实现 · Fixture PASS |
| M1 本地采集闭环 | 设备/App、基础指标、实时图表、Marker/场景、本地历史与回放 | M0 通过 | 60 分钟、断连/重绑、异常恢复、干净 DMG 验收 | 部分完成 · 待 Marker/历史/稳定性 |
| M2 云端单报告 | 登录、Project/Run、断点上传、Worker、Web 单次报告 | Session Schema 稳定 | 上传幂等、报告追溯、对象与数据库恢复演练 | 未开始 |
| M3 xctrace 增强 | 预检、录制、Trace Artifact、TOC-first 导出、报告关联 | 并发/开销实验通过 | 模板矩阵和 Schema 漂移降级可复现 | 未开始 |
| M4 PerfDog 高阶对齐 | FrameTime/Jank、能耗、GPU Counter、多 Run 比较、任务/团队、CLI/CI | 对应数据源逐项通过真值验证 | 算法、兼容与开销门禁通过 | 后置 |
PerfDog evidence request
付费账号与文档什么时候需要
- Mac 客户端全流程录屏
登录、设备连接、App/进程、指标面板、开始/暂停/继续/结束、Marker/Label、区间选择、保存上传和本地回放。
- 当前付费指标矩阵
iOS 各指标名称、单位、帮助说明、USB/Wi-Fi 限制、版本/机型限制和错误状态。
- 真实 Web 报告
单次报告、区间统计、报告对比、趋势、项目/任务、分享权限、导出格式和处理状态。
- 真实 Session 与导出
一份普通 App、一份游戏、一份 App 重启或断连样本;包括本地导出、云端报告和同场 PerfDog 采样。
- 异常与边界录屏
设备锁屏、Developer Mode/镜像问题、指标灰置、上传失败、短测试、断线、App 退出和 xctrace 冲突。
账号使用建议通过已经登录的浏览器会话完成,不在文档或聊天中保存密码。你后续提供的官方文档地址将登记到本页“依据”并标注版本/访问日期。
Risk register
最高风险与控制
| 风险 | 概率/影响 | 控制 | 降级 |
|---|---|---|---|
| DVT 私有服务随 iOS 变化 | 高 / 高 | Provider/Collector 隔离、能力快照、固定原始 fixture、版本矩阵 | 明确 Unsupported;保留已验证基础项和 xctrace Artifact |
| 指标名称看似相同但口径不同 | 高 / 高 | Metric Registry、单位/scope/算法版本、同场 Xcode/PerfDog 对照 | 改用中性名称并标 Experimental |
| pymobiledevice3 授权与闭源交付冲突 | 中 / 高 | F0 完成具体交付形态审查、许可证与源码履行方案 | 暂停商业打包决策,不建设第二运行时 |
| xctrace 与 DVT 并发互斥或放大开销 | 中 / 高 | 默认关闭并发;按模板、Xcode/iOS 固定实验 | 独立增强 Run 或先结束普通采集 |
| Mac 客户端成为大型单体 | 中 / 高 | Swift Package 边界、领域状态机、Sidecar 协议、模块 ViewModel | 功能模块独立关闭,不影响 Session Store |
| 上传/云端过早拖慢采集 | 中 / 高 | 本地 finalize 优先、后台分块上传、磁盘与网络隔离队列 | 保持 localOnly,稍后重传 |
| 报告海量点导致交互卡顿 | 中 / 中 | 多分辨率 LOD、极值保留下采样、窗口查询 | 降低分辨率并保留区间统计准确性 |
| UI 只模仿外观而流程不一致 | 中 / 中 | 付费账号逐屏行为录制、状态/错误清单、可用性走查 | 先保持自洽工作流,再做视觉贴合 |
Approval boundary
已批准的架构决策
已进入架构基线
- pymobiledevice3 是唯一主采集栈。
- xctrace 是用户按需增强。
- 原生 Mac 客户端负责采集和本地 Session。
- Go + PostgreSQL + S3/MinIO + React 云端记录每次 Run 并提供 Web 报告。
- 首版限定单设备、单 App 主进程、单次报告。
完成 F0 B 批次前待确认
- iOS 16 USB 只读冒烟已完成,动态断连/重绑场景尚缺。
- 是否允许完善、构建、签名并安装 PerformanceProbeFixture。
- A2 商店 App 与 A3 高刷样本。
- PerfDog 官方文档地址与付费账号已登录实测窗口。
当前已新增 Mac App 与 Sidecar 本地采集代码;后端、Web、数据库、上传和部署代码仍未启动。
设计依据
- Perfowl 无侵入底层能力决策 v1 — pymobiledevice3 主链、xctrace 增强、指标边界与 F0。
- Perfowl Gate F0 真机能力与指标校准计划 v1 — 设备矩阵、实验清单、误差门槛、证据产物与停止条件。
- Codesign4QC 性能采集专项分析 — DVT、generation、Schema v2、背压、质量、Session、场景与报告。
- Apple Instruments 专项调研 — Trace/Template/Instrument、xctrace 和验证基准。
- PerfDog 官方客户端说明 — 无侵入、Mac/iOS、实时指标、Marker/Label、停止、上传与 Web 管理。
- PerfDog 官方产品页 — 实时监控、报告分析、全平台与自动化产品方向。
- pymobiledevice3 iOS 17+ tunnel 指南 — macOS native/no-root 默认路径与 17.0–17.3.1 privileged tunneld 边界。
- pymobiledevice3 DVT API — Process、Sysmontap、Network、Energy、Graphics、ActivityTrace、CoreProfile 等入口。
- Apple Xcode command-line tool reference — xctrace 录制、导入、导出与符号化定位。
- Perfowl 调研与开发规则 — 先分析、批准后开发、HTML 归档和本地提交。