Skip to content

Latest commit

 

History

History
57 lines (37 loc) · 6.96 KB

dmsg_desktop_performance_zh.md

File metadata and controls

57 lines (37 loc) · 6.96 KB

dMsg 桌面解锁与首屏性能调查

2026-10-24 归档:本文保留当时的设计、测量和验证边界,不作为当前接口或待办清单。现行说明见文档入口;下文日期、状态和未运行项均属于原记录。

日期:2026-10-22。调查起点为 53a03b31,验证期间保留并跟随了独立提交的头像修复 7bad118d。已读取本地私有仓库的 PRD v1.1 和实施设计 v1.1,检查时私有仓库提交为 75b9403f、工作区无修改;未核对远端。本文只记录公开实现与实测边界。

1. 证据与根因

本机当日运行日志中的成功调用:

调用 样本数 最短 中位数 最长
session/unlock 14 7.212 s 13.582 s 32.715 s
vault/list 8 0 ms 7 ms 17,861 ms
sync/run 2 15.832 s 28.557 s 41.281 s

这些不是独立性能基准;解锁总时间包含系统在场确认,不能全部归因于网络。列表的异常慢样本与连续三个解锁调用重叠;其余列表样本为 0–26 ms。数据量小的情况下,主要问题是本地读取等待解锁/同步释放客户端锁。

原先快速解锁的路径为:系统凭据/在场确认 → 本机密钥 → 用户 home 的设备状态 → 根加载(包括向中继发布安全证明)→ 完整内容同步 → 恢复保存的登录 → 返回并发出会话事件 → 界面读本地数据。open_root 内部等待 sync(),daemon 又在整个过程中持有客户端锁。定时同步和手动同步也持有同一把锁。

每次同步即使没有新内容,仍创建 export、读取完整快照并验证;有本地待上传版本时,还会逐项上传并再次读取快照。网络往返耗时被放进首屏等待路径。界面的自动解锁、侧栏、内容区和审批窗口还能重复触发解锁,加重排队。

2. 本次实现

  • 解锁完成设备校验与根加载后返回,本地内容立即可读;daemon 自动安排一次后台同步,周期同步关闭时也执行。
  • 已保存的根与刚取得的认证状态一致时,加载根无需先访问中继。在线设备撤销检查、根变更时的下载验证、离线快速解锁的既有边界均保留。
  • 内容同步的网络访问改用 Hold:仅在同步步骤中读取/修改 Client。同步与密文 flush 串行提交,本地查看、编辑、锁定可在网络等待期间继续。
  • 锁定使旧同步执行失效;即使同一账户随后重新解锁,旧执行也不能应用迟到的响应。排队中的同步绑定原账户;上传进度和提交结果写回前重新核对任务。
  • 同一窗口共享正在进行的解锁;daemon 对已经解锁的同一账户不重复执行解锁。内容区、侧栏、设置和审批窗口显示解锁中状态。
  • 状态增加 syncing,侧栏显示后台同步与失败重试;开始同步只刷新状态,完成或失败才刷新内容。锁定不再等待密文 flush 返回才通知界面。
  • 日志新增 sync/pass 耗时,区分解锁完成与完整同步完成;不记录内容、账户 ID 或凭据。

实现入口:client.rs、root.rs、sync.rs、daemon.rs、session.ts、GateRail.svelte。

3. 后续优化顺序

优先级 当前证据 建议与验证方式
高 sync::fetch 每次全量 export;apply 每轮仍打开全部快照 manifest 为日常同步设计认证的增量游标;首次同步和校验仍保留全量路径。需与中继合同一起处理遗漏/回滚检测,不能仅跳过已有条目。测无变化同步的请求数、字节数和 P95。
中 Vault.svelte 的 Promise.all 等列表、冲突和完整健康检查一起结束 首先发布列表,健康检查稍后补充;按版本缓存检查结果。测 1,000/10,000 条记录的首屏和 CPU,避免为当前小样本先增加缓存复杂度。
中 channels.rs 每 5 秒检查频道,频道网络读取在循环中串行进行 解锁/账户同步结束后唤醒频道读取;优先当前频道,其余采用有界并发。保持每个频道的游标、换代和重试语义。分别测本地历史出现和新消息到达。
中 解锁的设备安全校验、新根读取,以及部分账户/审批操作仍在 under_lock 中 继续按具体慢调用拆分;安全校验前不提前暴露被撤销设备的内容。单独测在场确认耗时与安全查询耗时,避免用放松校验来换速度。
中 冷启动加载的 renderer bundle 包含全部视图 根据冷启动 profiling 决定是否按路由延迟加载;当前日志不足以把约十秒的解锁归因于 bundle。

本次优先解决已有数据的首次可见与交互阻塞,没有改变云端同步协议。新设备没有本地内容时,仍需等待首次同步;正常在线快速解锁仍需要设备状态查询。优化后的真实 Touch ID 到首屏 P50/P95 需在更新运行中的应用后测量,不能用单元测试耗时替代。

4. 验证边界

确定性回归使中继接收请求后不响应,期间完成本地文件树/秘密库读取、写入一条内容及锁定,再放回旧响应,确认它不能继续同步或改写最后同步状态。一次本地运行中,这些本地操作合计约 4.4 ms;这是隔离测试数据,不是线上解锁耗时。

另有本地根无需中继即可加载、根变化仍需验证、重复解锁不重复执行、锁定后重新打开同一账户时拒绝旧响应的回归;Electron smoke 覆盖解锁中禁用、后台同步时查看列表与失败重试提示。

本地 PocketIC + 私有中继集成测试确认:关闭周期同步后,登录仍自动同步一次,并取回锁定期间另一台设备新增的内容。本次循环地址测试从模拟登录开始到读到缓存条目约 666 ms,整个用例 23.65 s;不含真人 Touch ID,也不代表公网耗时。

Rust 核心 196 项、CLI 43 项常规测试通过,Clippy(-D warnings)通过;前端 84 项测试、Svelte/TypeScript 检查与构建通过。真实 Secure Enclave 测试在受限环境返回不可用,两个原生挂载测试及已有的 large_vault、print_share_vector 显式忽略项未运行。macOS 原生全屏测试因窗口无法进入全屏而未通过,采用现有选项关闭该项后,完整桌面 smoke 通过;长按审批测试显式置前窗口,避免被遮挡窗口的动画帧暂停造成偶发失败。

完整 desktop_content_and_sync 在通过双设备冲突/删除恢复、100 MiB 备份往返和中断续传后,于 64 MiB 密码分享链接的 files/share_link 返回 UNAVAILABLE;整项不能记为通过,该超时的成因尚未确认。聚焦本次范围的 desktop_unlock_syncs_in_background_with_periodic_sync_disabled 已通过。