Skip to content

[Grok/dsh 70] macOS 基础交互性能 #202

Description

@Blackman99

Parent

#132

Ticket: 70

Status: ready-for-agent

User Stories: 71, 72(见父规格)

What to build

用户在 macOS 安装产物中能够迅速开始输入、滚动长输出和缩放界面,性能符合预先冻结的参考阈值。

Acceptance criteria

  • 同机器/终端/数据/模拟响应测量参考基线;在测量候选结果之前冻结启动、输入、滚动/缩放和资源阈值,不看结果后调线。
  • 覆盖冷/热启动、长输出、大粘贴、重复打开关闭与两种屏幕模式,不等待完整工作流和其他平台才检查性能。
  • 分离模型/网络耗时与客户端/适配开销,不要求双运行时逐字节等同,明显回归必须解决或明确决策。
  • 保存可重跑基准及修复前后证据;三平台并行任务/工作流的长期压力验收另票汇入最终审计。

Blocked by

Delivery contract

用户于2026-09-20批准当前测试与任务拆分。按父规格的已安装产物/真实终端和公开协议测试验收;实际实现须带适用的文档、Changeset及必要检查。ready-for-agent表示任务已定义,不表示前置任务已完成,也不授权自动开始本轮实施、购买付费资源或发布软件版本。

Activity

  1. Blackman99 commented on Sep 28, 2026

    @Blackman99
    OwnerAuthor

    已集成(票未关):macOS 基础交互性能(#202)

    集成提交:9bdaf41(已普通推送到 rewrite/grok-dsh-20260920,未改动 main)。

    本票保持 OPEN:对照冻结阈值仍有几项明显回归,按「明显回归必须解决或明确决策」需要 Kara 明确决策后才能关票(见下方「需要决策」)。

    实现内容

    • 测量:scripts/rust-perf-bench.py 在 macos-15 上对已安装产物与钉死的 Grok 1.0.34 参考测量;先冻结 thresholds.json(写 SHA-256)再启动候选;macos-perf job(仅 ci/** 且分支名含 perf);报告与方法见 docs/rewrite/perf/。
    • 客户端修复:
      • ACP unread 计数 + 短切片 wait_for_input(不再在 dsh 静默时睡 80 ms);
      • 启动器记住已验证的产物(~/.codsh-rust/artifact-verified.json);
      • 挂断看门狗:终端关闭(SIGHUP / stdin POLLHUP)后结束客户端、dsh 与启动器(约 2 s 宽限后 _exit(129)),不再在 read()==0 上空转;
      • 首次 connect() 放到工作线程:连接期间 Ctrl+Q 立即退出并 kill dsh 进程组,连接期间输入的文字保留;
      • 大粘贴:第一行不是工作区文件即停止逐行 resolve;打字帧合并绘制;
      • 自动压缩:读回 session 的 Node helper 放到后台,答完先上屏;
      • 同步 ACP 请求(含退出时的 session/close)有响应即返回,不再多等最多 50 ms 的 pump 切片。
    • Changeset rust-macos-perf.md;README / CONTRIBUTING 说明。

    检查(本地 box,Linux x64,/workspace/verify-logs/202-final)

    • cargo fmt --check、pnpm typecheck、debug、clippy -A 通过;严格 clippy 仅 2 个已知错误。
    • test:rust:792 passed,4 个已知 Linux 失败(同基线)。
    • pnpm test:110 files;2676 passed / 15 skipped(一次负载下 rust-plan.spec 超时,单独重跑 13/13 通过)。
    • build + build:rust + check:rust-package + rust-install-test + plain-pipe 通过;e2e:177 passed / 1 skipped。
    • rust-terminal-pty-test.py:early-quit(约 30 ms)、early-keys、hangup / hangup-sighup 通过;resume / cancel / permission 通过;prompt / core-pty 在 Linux 按设计拒绝。

    真实运行(GitHub Actions macos-15)

    角色 分支 / 运行 说明
    BEFORE ci/202-perf-before-c #36396967149 仅 unread/验证缓存;冻结阈值见 docs/rewrite/perf/before/
    AFTER(最终) ci/202-perf-after-f #36420609436 job 108928623905 全套修复;报告见 docs/rewrite/perf/after/(job 因未全部达标而失败属预期)
    中间证据 after-d #36413796946(粘贴)、after-e #36415337209(异步 compact) 保留未删

    Fullscreen p50(BEFORE → AFTER,单位 ms,除非注明):

    指标 before after 冻结上限/下限 结果
    start:first-output 133 89 ≤ 69 fail
    start:ready 138 92 ≤ 928 pass
    input:draft 3 1 ≤ 24 pass
    input:paste 54 21 ≤ 47 pass
    output:first-visible 375 186 ≤ 105 fail
    output:end-after-model 240 72 ≤ 166 pass
    output:throughput 291 K B/s 935 K ≥ 663 K pass
    quit:exit 679 35 ≤ 264 pass
    rss:tree-peak 329 MiB 305 MiB ≤ 129 MiB fail

    分解(after,fullscreen 中位):dsh submit-to-request ~120–140 ms(参考 ~40–50);模型流本身 ~7–9 ms;start:connected ~1 s;客户端 RSS ~18 MiB,树峰值 ~305 MiB(Node 启动器 + dsh Node)。dsh 0.1.5-rc.3 整段答案一次 agent_message_chunk,无 ACP token 流式。

    对照验收标准

    • 测量候选前冻结三平台对应阈值的方法与 macOS 负载;参考工作集、硬件、模型时序可重现(docs/rewrite/perf/)。
    • 修复并重验客户端侧回归(粘贴、退出、挂断、吞吐、答后绘制等)。
    • 未关票:相对参考的明显回归需 Kara 决策(见下),不能事后放宽阈值使验收通过。

    需要决策(关票前)

    1. dsh 侧延迟 / 无 ACP 流式 → first-visible(及部分 minimal end-after-model)。修需要更新 dsh 或换传输,不是更多客户端绘制。是否接受并记入文档,还是阻塞到更新 dsh?
    2. RSS 架构 → 树峰值 ~305 MiB(Node 启动器 + dsh)对参考单进程 ~100 MiB;客户端本身 ~18 MiB。是否接受架构差异?
    3. warm start:first-output p95 → 中位常低于上限,p95 仍偶发越线(CI 噪声 + Node 启动器)。是否接受?

    已记录的差异

    • 干净容器 / 其他平台未跑本 bench([Grok/dsh 70] macOS 基础交互性能 #202 范围是 macOS)。
    • 折叠提示「→ expand」不展开答案;Tab / Enter / End 可以(小 UX,非性能门禁)。
    • 草稿分支 ci/202-perf-* 保留未删(见最终报告列表)。

    未改动

    • 未改动 main,未发布包/标签/Release,未改仓库设置或 secrets;未关本票。
  2. added a commit that references this issue on Sep 28, 2026
  3. Blackman99 commented on Sep 28, 2026

    @Blackman99
    OwnerAuthor

    已关票:macOS 基础交互性能(#202)

    实现提交(此前已集成):9bdaf41
    文档提交(本次):d90fc62(已普通推送到 rewrite/grok-dsh-20260920,未改动 main)。

    Kara 于 2026-09-28(CST)明确接受对照冻结参考仍未达标的三项差距;阈值文件未事后放宽。测量数字与原因已写入 docs/rewrite/perf/README.md(Accepted gaps 节),证据仍为 ci/202-perf-after-f #36420609436 / docs/rewrite/perf/after/。

    接受的三项差距(fullscreen after-f)

    差距 实测 冻结上限 原因
    output:first-visible p50 186 ms / p95 246 ms ≤ 105 ms dsh 0.1.5-rc.3 ACP 回合启动约 120–140 ms(参考约 40–50 ms);长答案以一次 agent_message_chunk 到达,无 ACP token 流式,首屏无法早于整段 submit→chunk。需更新 dsh 或换传输,不是更多客户端绘制。minimal 同因失败;minimal end-after-model 亦同。
    rss:tree-peak p50 ~305 MiB / p95 ~312 MiB ≤ ~129 MiB 架构:Node 启动器 + dsh Node 主导进程树;Rust 客户端本身约 18 MiB。参考为单进程约 100 MiB。接受多进程栈,非客户端泄漏。
    start:first-output(warm) p50 89 ms / p95 141 ms ≤ 69 ms 热启动首屏;Node 启动器 + CI 噪声。冷启动已通过。中位接近上限,p95 仍偶发越线。

    粘贴、退出、吞吐、fullscreen end-after-model 等已在 after-f 通过冻结门禁(见先前证据评论)。

    对照验收标准

    • 测量前冻结阈值与方法(docs/rewrite/perf/)。
    • 客户端侧回归已修并重验(粘贴、退出、挂断、吞吐、答后绘制等)。
    • 相对参考的明显回归已由 Kara 明确决策接受并记入文档(未放宽阈值冒充通过)。

    未改动

    • 未改动 main,未发布包/标签/Release,未改仓库设置或 secrets;未改 thresholds.json。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions