功能:完善通用云管工作台、审计与诊断能力
No files matched your search
@@ -14,6 +14,10 @@
|
||||
|
||||
另保留正在讨论的[云端服务与 Web 控制台功能设计](cloud-console-functional-design-20261109.md),用于产品/UI/后端任务拆分;它是讨论稿,不属于本次清理的历史实施记录。
|
||||
|
||||
[通用版与高级版首批实现](cloud-editions-20261111.md):两套真实界面、员工授权向导、终端诊断与高级 GPU 任务核对;[助手与后续流程设计](cloud-editions-and-assistant-design-20261111.md)保留后续方案,模型本轮暂不接入。
|
||||
|
||||
[高级版日志与诊断中心](cloud-diagnostics-20261111.md):按设备/桌面关联任务、会话、告警和审计,设备日志采集回执与完整诊断包导出;已完成真实盒子采集与页面验收。
|
||||
|
||||
[云管开发说明](cloud-platform-development.md)记录第一阶段代码、启动方式、接口与当前限制;本机控制台使用 Go API 和 PostgreSQL;已另行完成[真实 PVE 与盒子接入](cloud-live-integration.md),正式入口为 5182。
|
||||
|
||||
[控制台 UI 接入记录](cloud-console-ui-20261109.md)记录按 `ui/` 设计稿接入的深浅主题、页面范围、验证方式与实际数据边界。
|
||||
@@ -52,3 +56,11 @@
|
||||
- [GPU 清单与配置引用](cloud-gpu-inventory-20261110.md):真实 PCI 清单、IOMMU 分组、当前/待应用直通引用及不完整检查提示;仅资源查看,绑定与健康采集尚未接入。
|
||||
|
||||
- [终端系统指标与历史](cloud-terminal-metrics-20261110.md):真实 CPU、内存、SoC 温度、运行时长和 30 天历史;串流 FPS/RTT 仍未采集。
|
||||
|
||||
- [终端系统指标告警](cloud-terminal-alerts-20261111.md):CPU、内存和 SoC 温度阈值、按真实采样持续判断、缺失提示、确认与恢复。
|
||||
|
||||
11-11 已补齐[操作审计历史查询与 CSV 导出](cloud-audit-history-20261111.md)及[执行任务历史查询与 CSV 导出](cloud-task-history-20261111.md),均支持数据库分页、多条件查询和全部匹配页导出;外部归档和防篡改仍待后续。
|
||||
|
||||
11-11 已补齐[管理员在线登录管理](cloud-admin-sessions-20261111.md):查看登录来源及到期时间,单独撤销指定登录并记录审计,保留当前登录保护。
|
||||
|
||||
11-11 已部署[管理员双重验证](cloud-mfa-20261111.md):本人可选绑定身份验证器,动态码与一次性恢复码登录,支持更新恢复码和关闭。既有账号默认不启用。
|
||||
@@ -0,0 +1,38 @@
|
||||
# 管理员在线登录管理(2026-11-11)
|
||||
|
||||
已部署 `http://127.0.0.1:5182/settings` →「管理员账号」→ 对应账号的「在线登录」。仅超级管理员可查看与撤销。
|
||||
|
||||
## 行为
|
||||
|
||||
- 显示尚未退出、撤销或到期的登录凭据,支持分页和手动刷新。显示来源地址、登录时间、到期时间和浏览器/客户端,并标记当前登录。有效凭据不代表浏览器当前仍在使用。
|
||||
- 「撤销登录」确认后只撤销所选登录,其他登录与密码保留;该凭据后续管理 API 请求返回 401。当前登录按钮禁用,服务端也返回 409,需使用正常退出入口。
|
||||
- 新登录记录请求来源及最多 500 字符的 User-Agent;来源经过现有可信代理配置解析。代理/NAT 可能使地址显示为网关,User-Agent 可由客户端填写,均只作排查信息,不作为身份凭据。
|
||||
- 升级前会话继续有效,来源与登录时间明确显示未知;不推算或伪造旧元数据。到期会话不列入有效列表。
|
||||
- 查询或撤销失败显示错误并清除旧列表;取消确认不提交,切换账号不会被旧请求覆盖。
|
||||
|
||||
## 接口与数据
|
||||
|
||||
`GET /api/v1/administrators/{id}/sessions`:每页默认 20 条、最多 100 条,按到期时间及内部标识降序排列。
|
||||
|
||||
`DELETE /api/v1/administrators/{id}/sessions/{sessionKey}`:成功 204;不存在、已撤销、已到期或账号不匹配返回 404;本人当前登录返回 409;未登录 401,非超级管理员 403。并发撤销仅一次成功,成功撤销与 `revoke_administrator_session` 审计同事务提交。
|
||||
|
||||
公开的 key 为带独立用途前缀的 HMAC-SHA256 管理句柄。列表、路径和审计不暴露 JWT、内部会话标识或密码。句柄自身不能登录。事务内复查操作者当前会话及最新权限;等待期间被撤销的操作者不能继续撤销其他登录。原账号角色、启停和改密撤销全部登录的行为保持兼容。
|
||||
|
||||
新增 `admin_session_details` 附表,外键关联 `admin_sessions` 且删除级联。既有 `admin_sessions` 三列保持不变;旧 API 的插入仍兼容。登录与附表写入同一事务。附表无历史回填,现有管理员、密码和设备身份不重置。
|
||||
|
||||
## 验收
|
||||
|
||||
- 独立测试 PostgreSQL 的 Go 全量测试和 vet 通过,覆盖单独撤销、保留其他登录、三角色权限、当前登录保护、旧登录兼容、过期排除、来源清理与不可信代理、凭据不泄露、并发一次成功、等待锁期间操作者被撤销。
|
||||
- 前端 lint/typecheck、3 项单元测试和生产构建通过;新增 4 项登录管理及原有 4 项管理员浏览器回归通过,包含确认/取消、错误处理、分页、旧响应保护、深浅主题和 390px。
|
||||
- 真实临时账号建立两条登录,准确选取并撤销其中一条,旧凭据返回 401,另一条仍可读取本人资料;停用账号撤销剩余登录,审计记录仅含管理句柄。临时账号及会话已定向清理,审计保留。
|
||||
- 真实深浅主题、1440/390px 界面通过,无脚本异常、失败 API 或浏览器业务写请求。既有账号密码指纹、用户授权、设备身份、告警规则及 VM 配置/电源与本轮部署前基线一致,盒子在线。未执行 VM、磁盘、GPU 或终端控制。
|
||||
|
||||
证据:[真实 API 核验](evidence/cloud-admin-sessions-20261111/live-verification.json)、[真实浏览器核验](evidence/cloud-admin-sessions-20261111/browser-verification.json)。首次验收脚本误把按时间倒序的第一条当作首次登录,已改为根据指定凭据的管理句柄精确选择后重验通过,应用实现无需变更。
|
||||
|
||||
## 部署与回退
|
||||
|
||||
备份 `.local/live/backups/before-admin-sessions-20261111-150936.dump`,原镜像标签 `before-admin-sessions-20261111-150936`。独立打包基线二进制与部署前 SHA-256 相同:`78f454b057fd2de9510fa966ada07654692c609181faa62dc72c96391f0d95ec`;保留已部署 GPU 代码和配置。
|
||||
|
||||
回退前核对后续是否另有部署,恢复原 API/console 镜像标签,并用 `.local/admin-sessions-review/compose.release.yml`、原环境文件及 `--project-directory deploy` 执行 `up -d --no-build --no-deps api console`。附表可保留,不删除业务卷或恢复整个数据库覆盖其他工作。旧 API 登录不写附表,再次升级时这些登录也会显示来源未知。
|
||||
|
||||
此项仅管理控制台登录,桌面串流会话仍由「远程会话」管理。专用 VM、Windows 副本、存储准备及真实快照还原继续暂缓。
|
||||
@@ -0,0 +1,42 @@
|
||||
# 操作审计历史查询与 CSV 导出(2026-11-11)
|
||||
|
||||
入口:控制台 `http://127.0.0.1:5182/tasks` →「操作审计」。本轮补齐真实 PostgreSQL 查询和导出,执行任务页维持原有行为。
|
||||
|
||||
## 使用方式
|
||||
|
||||
- 支持关键词、操作者包含、动作、结果与自定义时间范围;时间控件提供最近 24 小时、7/30/90 天快捷项。不选时间查询全部已有历史,包含超过最近 1000 条的旧记录。
|
||||
- 动作、结果可以选择中文选项,也可输入原始代码;关键词查对象、操作者、动作、结果、请求标识和审计标识,`%`、`_`、反斜杠按普通文字匹配。
|
||||
- 点击「查询审计」应用条件。每页 20 条,翻页和导出沿用已应用的条件及截止时间,避免新记录不断插入导致页内容移动;修改输入后需重新查询。查询失败清除旧结果,禁止把旧结果当成新条件的导出。
|
||||
- 「导出查询结果 CSV」包含所有匹配页,最多 10000 条;超量时禁止导出并提示缩小范围,服务端也返回 413,绝不悄悄截取前几页。API 空结果返回表头。
|
||||
- 页面时间按浏览器本地时区显示;CSV 时间为 UTC,使用 UTF-8 BOM、CRLF 和 CSV 转义,动作与结果保留原始代码。可能被表格软件当公式的单元格增加前置单引号。
|
||||
|
||||
## 接口与边界
|
||||
|
||||
`GET /api/v1/audit-logs`:数据库分页,默认 `page=1&pageSize=20`,最多每页 100 条。支持可选 `from`、`to`(含时区的 RFC3339)、`keyword`、`actor`、`action`、`result`。动作和结果精确匹配,操作者包含匹配。时间边界含两端;起止同时提供时要求结束晚于开始。没有隐含 1000 条上限,也没有新加历史清理策略。
|
||||
|
||||
`GET /api/v1/audit-logs/export`:使用相同筛选条件,忽略分页;成功返回 `text/csv`、附件名和 `X-Export-Count`。只输出时间、操作者、动作、对象、结果、请求标识、审计标识。不会读取密码、设备令牌、PVE 密钥或任务原始参数。导出文件准备成功会记一条 `export_audit_logs` 审计;它表示服务端生成文件,不证明客户端已保存。
|
||||
|
||||
查询与导出均要求有效管理员会话;三角色均可访问,与原有审计读取权限一致。不会新增设备控制权限。单次列表的总数和记录来自同一 PostgreSQL 快照,排序为 `created_at DESC,id DESC`。页面固定截止时间,记录正常追加时保持翻页稳定;审计导入时若回填历史时间,仍可能改变后续查询。
|
||||
|
||||
审计不再加入全局定时刷新,进入标签页时按需查询。执行任务查询仍为原有最近 1000 条,本轮未改任务历史分页。既有操作是否产生日志仍取决于对应接口,未新增所有鉴权失败或操作前后差异记录;外部归档、签名防篡改、多租户隔离和日志保留策略仍待后续产品化。
|
||||
|
||||
## 验证与部署
|
||||
|
||||
验证结果和现场部署记录见同目录下 `evidence/cloud-audit-history-20261111/`。测试使用独立一次性 PostgreSQL,不对现场库执行测试清空。
|
||||
|
||||
仓库另有并行的独占显卡切换开发。本轮部署使用独立源码目录,只包含已部署的终端告警基线和本轮审计改动;排除这部分并行修改,不修改工作区原文件。通过重建基线与现场二进制比较确认部署基础,保留数据库备份、原镜像标签和源码校验清单。
|
||||
|
||||
专用 VM、Windows 模板副本、额外磁盘及真实快照还原继续暂缓。本轮不需要对 VM 或终端发控制命令。
|
||||
|
||||
|
||||
## 本轮验收结果
|
||||
|
||||
- 已部署到 5182 真实环境;Go 全量测试与 vet、前端 lint/typecheck/build、3 项单元测试、65 项安全 fixture 页面测试通过,其中新增审计页面 4 项。后端专用测试覆盖超过 1000 条历史记录、10000 条完整导出及 10001 条拒绝、三角色与未登录拒绝、筛选组合和 CSV 转义/公式防护。
|
||||
- 现场将 root 的 187 条匹配记录按每页 2 条查询,共 94 页;CSV 的 187 个审计标识及顺序与所有匹配页完全一致。另用真实界面按操作者和保存告警规则筛选并下载 CSV。
|
||||
- 深浅主题、1440 和 390px 真实界面通过;没有页面脚本异常、失败 API 或前端业务写请求。导出接口本身按设计新增审计,验收登录/退出也保留正常审计。
|
||||
- 账号/密码指纹、用户授权、终端身份及配置版本、告警规则一致;PVE 三台 VM 配置摘要和电源状态保持验收前基线,任务仍为 8 条。验证时 VM100/102 为 running、VM101 为 stopped;这是本轮只读观测,不代表本轮执行过开机。
|
||||
- 独立打包基线二进制 SHA-256 与部署前二进制一致:`8c87f4e2183bd6f96ff5d67544f0467dc832c6af524ba8f1426aa5ec54d82d75`。本次未部署仓库中并行的独占 GPU 逻辑和相关 Compose 配置。
|
||||
|
||||
部署前备份为 `.local/live/backups/before-audit-history-20261111-101812.dump`,原 API/console 镜像保留 `before-audit-history-20261111-101812` 标签。本轮没有新增数据库结构变更。需回退时先核对其他会话是否又有部署,再将两项镜像重新打回原名称,并使用 `.local/audit-review/compose.release.yml` 及 `--project-directory deploy`、原环境文件执行 `up -d --no-build --no-deps api console`。不要删除 PostgreSQL 业务卷,也不要把本轮只读验收的电源状态当成需要强制恢复的目标。
|
||||
|
||||
后续更新:执行任务也已补齐[完整历史分页与 CSV 导出](cloud-task-history-20261111.md),本文“最近 1000 条”描述仅为审计批次当时边界。
|
||||
@@ -0,0 +1,41 @@
|
||||
# 高级版日志与诊断中心
|
||||
|
||||
日期:2026-11-11。已部署到真实控制台 `http://127.0.0.1:5182`,入口为“高级版 → 日志与诊断”。
|
||||
|
||||
## 已实现
|
||||
|
||||
- 按终端设备或云桌面的唯一 ID 关联执行任务、桌面会话、监控告警、操作审计和已回传的终端日志片段。同名设备不会串记录。
|
||||
- 支持时间范围、记录来源、数据库分页、来源数量及详情展开;最长查询 7 天,默认近 24 小时。修改筛选后清除旧结果,重新查询后才能导出。
|
||||
- 设备、桌面及关联任务详情可直接进入指定对象诊断。设备选择显示 SN,桌面选择显示 VMID。
|
||||
- 导出 ZIP 包含 `diagnostics.json` 和 `README.txt`,使用已查询的对象、时间及来源,包含全部匹配页。超过 2000 条时拒绝并提示缩小范围,不静默截断;导出记录审计。
|
||||
- 在线设备可在确认后提交一次日志采集,显示真实任务回执;已有未完成或结果未知的设备命令时阻止再提交。失败重试复用幂等标识,提交成功与设备执行成功分开显示。
|
||||
- 超级管理员、运维人员可使用;只读角色隐藏入口,直接页面访问被拦截,接口返回 403。界面模式不改变角色权限。
|
||||
- 深浅主题和 390px 窄屏布局;日志以纯文本呈现。导出字段采用白名单,并遮盖常见凭据格式。
|
||||
|
||||
## 数据含义
|
||||
|
||||
对象卡片是查询时的当前快照,不代表所选历史时间点。任务提交条目展示查询时状态,另列最后一次更新事件,不伪造完整的任务状态变更历史。会话按预留、连接、结束分别列事件,因此查询范围之前开始但范围内结束的会话也能查到。
|
||||
|
||||
设备视角按终端 ID 及显卡准备任务的 `device:<ID>` 关联;桌面视角按桌面 ID 关联,并包含所属节点告警。只按名称保存、缺少稳定关联标识的旧审计不推测归属。不根据设备当前绑定推断历史日志属于哪台桌面,所以终端日志仅在设备视角出现。
|
||||
|
||||
日志来自设备已回传的片段,当前 Qt Agent 读取会话错误日志尾部及版本、启动标识、运行时长和 kiosk 状态。没有记录可能是尚未采集、未上报或超出留存;不代表没有故障。本轮没有实现持续实时日志推送、服务端全量日志归档或自动采集 VM 客体日志。常见凭据遮盖不保证消除所有自由文本中的自定义敏感信息。
|
||||
|
||||
## 测试与真实验收
|
||||
|
||||
- 后端 6 项诊断专项集成测试通过,覆盖同名隔离、旧会话结束时间、跨来源分页、权限/参数、ZIP 完整性/限额、白名单与凭据遮盖;使用一次性 PostgreSQL,未对业务库运行集成测试。
|
||||
- Go 全量 `go test ./... -count=1`、`go vet ./...` 通过;全量测试之后仅增加能力标识及调整导出说明,最终 API 生产镜像构建通过。
|
||||
- 前端 TypeScript、ESLint、6 项单元测试及生产 Docker 构建通过。9 项诊断页面测试、12 项两版界面测试、4 项 GPU 核对回归共 25 项通过;修正截图动画后另复验 1 项视觉用例。
|
||||
- 真实 API 对 1 台设备和 3 台桌面核验近 24 小时查询、全部分页、5 类来源筛选与 ZIP 内容一致;临时运维账号可读/导出,临时只读账号 403,未登录 401。临时账号和会话已清理,保留审计。
|
||||
- 真实浏览器核验:通用版 5 个入口、超级管理员高级版 14 个入口、设备/桌面深链、第二页、详情、筛选失效、实际下载、只读角色限制;1440/390 宽度及深浅主题通过,无脚本错误或失败 API 响应。
|
||||
- 进一步通过实际页面确认并提交 **1 次 `collect-logs`**,`qt-platform/0.4.0` 真实盒子成功回执,页面展示日志并下载诊断包。导出中有 1 条对应日志,日志尾部 11981 个字符,内容保留在本机私有目录;公共证据仅保存元数据和收起日志后的截图。
|
||||
- 采集完成后,原管理员密码/角色、桌面连接配置、用户/授权、设备身份/配置版本及告警规则仍与更新前一致。任务数 63→64,唯一新增任务为此次成功日志采集;快照任务数不变。未发送 VM 电源、GPU 切换、会话重置或终端重启。
|
||||
|
||||
证据:[真实接口核验](evidence/cloud-diagnostics-20261111/live-verification.json)、[真实页面核验](evidence/cloud-diagnostics-20261111/browser-verification.json)、[实际采集回执](evidence/cloud-diagnostics-20261111/collection-verification.json)、[采集后的状态核对](evidence/cloud-diagnostics-20261111/collection-state-verification.json)、[页面截图](evidence/cloud-diagnostics-20261111/live-diagnostics-light.png)。
|
||||
|
||||
## 发布与回退
|
||||
|
||||
从上一轮已部署源码 `.local/editions-review/release` 生成隔离发布目录,只叠加本轮 17 个文件;基线 API 重建二进制 SHA256 与更新前实际运行二进制一致。没有包含其他会话正在修改的终端/串流代码。
|
||||
|
||||
更新前备份:`.local/live/backups/before-diagnostics-20261111-174813.dump`,已校验归档目录。旧 API/控制台镜像均保留标签 `before-diagnostics-20261111-174813`。此次只更新 API、控制台,没有数据库结构变更,未重启 PostgreSQL,业务库 `fsync=on`。
|
||||
|
||||
需要回退时使用该标签的两套镜像和本轮保留的 compose 配置,仅重建 API/控制台;不要恢复整个业务库或使用 MFA 之前的 API。镜像身份与文件校验见[发布记录](evidence/cloud-diagnostics-20261111/deployment.json)和[文件清单](evidence/cloud-diagnostics-20261111/manifest.json)。
|
||||
@@ -0,0 +1,48 @@
|
||||
# 通用版与高级版:首批实现
|
||||
|
||||
日期:2026-11-11。真实控制台:`http://127.0.0.1:5182`。
|
||||
|
||||
## 使用入口
|
||||
|
||||
登录后,侧栏上方可切换“通用版 / 高级版”。新账号默认进入通用工作台;浏览器按管理员账号记住选择。直接打开旧的专业页面仍可访问,并切到高级导航。两版共用真实后台、数据、任务和审计,切换界面不会获得额外权限。本期实现的是两种操作界面,尚未实施商业许可、收费或组织功能包限制。
|
||||
|
||||
## 通用版
|
||||
|
||||
| 页面 | 已接入的真实功能 |
|
||||
| --- | --- |
|
||||
| 工作台 `/workbench` | 运行中的桌面、在线设备、活动连接;员工分配、设备检查和问题处理捷径;未分配员工、离线/待激活设备、未确认任务摘要 |
|
||||
| 员工与桌面 `/people` | 查找、添加员工;先选桌面、查看方案,再追加或撤销指定授权;桌面名称、使用人、电源和连接状态;单台开机、正常关机、重启的确认提交 |
|
||||
| 终端设备 `/devices` | 查找设备、在线状态、使用人、当前桌面;登记设备并显示一次性激活密钥;进入指定设备诊断 |
|
||||
| 问题处理 `/help` | 只读检查设备启用、在线、员工关联、员工启用、有效桌面授权、电源、初始化及已知连接服务状态;当前触发中告警前 20 条与总数 |
|
||||
| 操作记录 `/records` | 人员/配置审计和设备/桌面任务两类查询,服务端分页与关键词检索,展示实际结果和操作人 |
|
||||
|
||||
员工新增、授权、设备登记仍要求超级管理员;桌面电源允许运维人员;只读人员只能查看。本人密码、双重验证和主题切换在两版均保留,超级管理员也能从通用版顶部进入系统设置。
|
||||
|
||||
授权复用已有批量增减接口,只修改选定员工与桌面的关系,保留其他授权、员工状态和关联设备。查看方案不会写入;保存成功不代表桌面已经开机或完成串流。撤销会作废未消费的旧票据,已有串流不被强制断开。
|
||||
|
||||
电源操作提交后等待实际任务回执;界面不会将提交成功显示为设备已执行成功。存在排队、执行中或结果未知的关联任务时,通用版阻止再次操作。生产环境验收没有操作业务桌面的电源。
|
||||
|
||||
连接服务为“未检测”时不能认定桌面不可用;首页展示真实电源运行数量,详细诊断保留“尚未确认就绪”的说明。设备在线、服务状态通过也不能替代实际网络、画面与输入延迟验收。全局数据或告警读取失败时明确报错,不显示“没有告警”作为正常结论。
|
||||
|
||||
## 高级版
|
||||
|
||||
保留 13 个专业入口:总览、桌面、远程会话、终端、终端策略、计算资源、GPU、监控告警、模板、桌面池、用户授权、任务审计和系统设置。导入、批量电源预检、连接配置、规格、快照、模板/池、指标/规则、管理账号与登录会话等继续使用原有实现及验收范围。
|
||||
|
||||
本轮另补齐“任务与审计 → 执行任务 → 任务详情 → 核对显卡准备结果”,接入已有 `POST /tasks/{id}/gpu-reconcile`。仅超级管理员/运维人员可核对 `gpu-prepare` 类型且结果未知的任务。提交前说明:只读取原 PVE 任务与组内实际电源状态,不重发开关机;核对成功结束未确认流程并释放预留,原任务标记失败,需要重新准备时另行发起。缺少原 UPID、原任务未结束、实际电源未知时显示后台拒绝,保留待查状态。
|
||||
|
||||
## 测试与真实验收
|
||||
|
||||
- 前端 lint、TypeScript、生产 Docker 构建通过;6 项单元测试通过。
|
||||
- 12 项版本/通用页面浏览器测试、4 项 GPU 核对浏览器测试,以及 18 项双重验证、任务历史、审计、在线会话回归通过,共 34 项。首页摘要调整后另复验默认入口、账号隔离及深浅窄屏 3 项。
|
||||
- 4 项 GPU 服务端集成测试通过,包括未知提交不重放、原任务无法读取时拒绝、可核对后释放预留。使用一次性 PostgreSQL 与 PVE 测试服务,没有对真实业务库运行集成测试。
|
||||
- 真实浏览器完成:登录默认通用、两版切换、按账号记忆、临时员工新增、查看方案无写入、两次追加授权、仅撤销其中一个、真实审计查询。临时员工与其授权已清理,保留操作审计。
|
||||
- 真实 1440 / 390 宽度、深浅主题及五个通用页面检查通过;无脚本错误或失败 API 响应。
|
||||
- 原账号、授权、桌面连接配置、设备身份及告警规则快照一致;API 镜像与数据库容器保持原部署,业务库 `fsync=on`。此次只发布经过隔离比对的控制台改动。
|
||||
|
||||
证据:[浏览器验收](evidence/cloud-editions-20261111/browser-verification.json)、[原状态核对](evidence/cloud-editions-20261111/state-verification.json)、[真实通用工作台](evidence/cloud-editions-20261111/live-common-workbench-dark.png)、[高级界面](evidence/cloud-editions-20261111/live-advanced-overview.png)。
|
||||
|
||||
## 后续边界
|
||||
|
||||
按用户要求,本轮不接模型,不展示假的“一句话 AI”。现有向导为明确选择对象的真实授权流程,跨步骤方案持久化、模型解释、受控脚本目录尚未实现。当前尚未把员工关联设备、员工停用、批量业务操作简化到通用版,这些仍在高级版完成。
|
||||
|
||||
高级版页面归类不改变原未完成功能的状态:通用 GPU 绑定与健康、扩展终端策略、外部通知、OTA、目录认证、公共池自动领取/还原、自动初始化、独立交付等继续按原计划逐项完成。GPU 核对以隔离集成与页面测试验收,没有为验收人为制造真实显卡切换超时。专用 VM、Windows 副本、额外存储准备和真实恢复验收仍按用户要求暂缓。
|
||||
@@ -0,0 +1,126 @@
|
||||
# 通用版、高级版与一句话助手设计
|
||||
|
||||
日期:2026-11-11。状态:两版界面及首批真实业务流程已按[实施记录](cloud-editions-20261111.md)落地;本文其余方案对象、模型与脚本内容仍为后续设计。用户已明确本轮不接模型,先完成通用/高级界面的区别。
|
||||
|
||||
## 产品定位
|
||||
|
||||
通用版面向不熟悉虚拟化的日常管理员,以“开通员工、分配桌面、查看设备、处理问题”组织流程。高级版面向 IT 运维,提供节点、模板、存储、规格、GPU、策略、监控和任务等详细管理。
|
||||
|
||||
建议使用同一套 Go 后台、数据库、任务与审计,两套导航和操作流程。现有控制台作为高级界面的基础,新增通用工作台。界面模式与角色权限分别管理:只读账号切换到高级界面仍只有只读权限;通用版管理员发放桌面仍需要后端授权。
|
||||
|
||||
第一期以“通用模式 / 高级模式”落地,设置默认入口并记住个人选择;需要商业版本销售时,再配置组织可用的功能包及服务端许可校验,避免维护两个代码分支。没有高级版授权的安装不能通过切换模式或直接调用接口开启受限功能。
|
||||
|
||||
## 两版功能划分
|
||||
|
||||
| 业务 | 通用版 | 高级版 |
|
||||
| --- | --- | --- |
|
||||
| 首页 | 健康摘要、常用操作、需要处理的事、助手 | 资源水位、节点、任务、详细告警及助手 |
|
||||
| 员工与桌面 | 添加员工、分配/撤销桌面、关联盒子 | 用户批量导入、批量授权、分组筛选及详情 |
|
||||
| 桌面管理 | 业务名称、使用人、是否运行、能否连接;开机/正常关机/重启 | VMID、节点、模板、池、规格、批量预检及维护详情 |
|
||||
| 新增桌面 | 选择人数与用途,优先分配已有桌面;已就绪模板可进入发放向导 | 节点、存储、模板版本、规格及池成员配置 |
|
||||
| 终端管理 | 设备在线状态、名称、使用人、激活向导 | 分组、策略版本、部署回执、系统指标、诊断日志 |
|
||||
| 故障处理 | “桌面打不开 / 设备离线”等引导,说明原因和下一步 | 原始指标、关联事件、任务、诊断及专业核对入口 |
|
||||
| 监控 | 简明健康状态、待处理事件 | 趋势、阈值规则、确认、历史和缺失采样详情 |
|
||||
| GPU/存储/快照 | 常规业务页通过可用性和限制提示体现 | 提供专业页面;具体操作按已实现及已验收能力开放 |
|
||||
| 记录 | 操作结果、谁操作、何时完成 | 全历史检索、CSV、任务关联与审计 |
|
||||
| 账号安全 | 本人改密、双重验证;管理账号按角色开放 | 同样保留安全能力,并展示详细账号及会话管理 |
|
||||
|
||||
通用版减少术语与必填参数,仍明确区分“桌面正在开机”“连接服务未就绪”“设备离线”和“数据已过期”。“断开连接”“重启桌面”“还原数据”分别命名,不使用容易混淆的“一键修复”。
|
||||
|
||||
现有未完成或暂缓的能力继续保留边界:真实克隆与快照还原验收、公共池自动领取/还原、通用 GPU 绑定、OTA、外部通知等不会因为新增助手变成可用。当前已有指定 GPU 的桌面准备与切换能力,也不能推广为任意显卡都可自动分配。
|
||||
|
||||
## 通用版页面交给 UI 的内容
|
||||
|
||||
建议只保留五个一级入口:工作台、员工与桌面、终端设备、问题处理、操作记录。账号菜单保留安全设置,接入配置由有权限的管理员通过设置进入。
|
||||
|
||||
工作台结构:
|
||||
|
||||
```text
|
||||
工作台 [账号] [设置]
|
||||
|
||||
今天的平台情况
|
||||
[可用桌面] [在线设备] [正在使用] [需要处理的问题]
|
||||
|
||||
你想完成什么?
|
||||
[例如:给张三分配一台办公桌面 ] [生成方案]
|
||||
[开通新员工] [分配已有桌面] [批量开机] [桌面打不开]
|
||||
|
||||
常用操作 需要处理的事
|
||||
添加员工 / 激活盒子 设备离线、授权缺失、失败任务
|
||||
|
||||
最近操作
|
||||
对象、操作、当前进度、结果、查看详情
|
||||
```
|
||||
|
||||
生成方案后以卡片显示:目标、推荐做法、影响对象、需要的资源、尚缺条件、执行步骤。主要按钮为“执行方案”“修改需求”,旁边提供“查看详情”。有未满足的条件时显示具体下一步,执行按钮不可用。
|
||||
|
||||
高级版助手可使用同样的卡片,额外展开对象标识、节点/存储、参数、检查结果和底层任务。通用版默认展示用户能理解的业务名称,详情仍可追溯。
|
||||
|
||||
## 一句话助手如何工作
|
||||
|
||||
```text
|
||||
用户描述 → 识别意图和缺失信息 → 读取真实资源与权限
|
||||
→ 生成方案 → 预检与展示 → 用户执行 → 逐步任务与结果
|
||||
```
|
||||
|
||||
脚本或工作流负责检查和执行。理解自由描述、解释结果需要接入语言模型;固定场景也可通过同一套表单向导操作。两者共用执行能力,模型不可用时仍可使用明确的业务向导。
|
||||
|
||||
默认先生成方案。查状态、解释已有告警等读取请求直接返回结果;修改配置、授权或电源的请求先展示具体对象与影响,再由用户点击执行。涉及重启、断开或数据恢复时,明确展示会中断什么、会改变什么。
|
||||
|
||||
### 示例:给张三分配一台办公桌面
|
||||
|
||||
1. 匹配真实用户;同名时提供候选选择。用户不存在时,补充登录名等必要信息,生成“创建用户并分配”的方案。
|
||||
2. 查看当前授权与已有可分配桌面。已有合适桌面时优先复用,避免每次都新建 VM。
|
||||
3. 需要新建时检查已登记模板、存储、克隆权限及当前支持范围;条件不足就展示缺少什么。普通 Windows 业务镜像尚未完成模板验收时,不能直接承诺自动发放。
|
||||
4. 方案卡片说明分配给谁、使用哪台桌面、是否新建、是否关联终端、是否需要开机。
|
||||
5. 执行后分别展示“用户已创建 / 授权已保存 / 终端已关联 / 桌面可连接”等实际结果。
|
||||
|
||||
上述为交互示例,不代表当前已有名为张三的用户或空闲资源。人数、规格和模板名称均须由真实环境或管理员预设产生。
|
||||
|
||||
### 首批适合接入的六种请求
|
||||
|
||||
| 用户说的话 | 方案或返回结果 | 当前接口基础与实施范围 |
|
||||
| --- | --- | --- |
|
||||
| 给张三分配一台办公桌面 | 匹配人员、选桌面、授权;可选关联盒子 | 用户/桌面查询、现有绑定接口;新增跨步骤方案编排 |
|
||||
| 把研发组的桌面都开起来 | 固定目标清单、逐台预检、可执行/跳过原因 | 已有批量电源预检与提交;“研发组桌面”的映射不明确时需选择目标 |
|
||||
| 这个盒子为什么没有桌面 | 注册/启用、绑定用户、授权、心跳等只读检查 | 现有终端/用户/授权信息;新增诊断规则 |
|
||||
| 看看今天有哪些异常 | 汇总真实告警、失败任务、离线设备 | 已有告警与任务历史接口;说明查询时区和时间范围 |
|
||||
| 给这个员工换一台桌面 | 展示旧/新授权及当前使用情况,确认后改授权 | 现有绑定/批量授权;不将撤销授权误写成旧 VM 已删除或串流已断开 |
|
||||
| 我想再增加几个人使用 | 现有资源与模板前提检查、复用/新增建议、实施步骤 | 可做规划;容量结论需明确估算依据,真实克隆仍按现场验收限制开放 |
|
||||
|
||||
预设“标准办公”“开发”等用途时,规格、允许模板、是否允许新建和资源预留由管理员配置。预设未配置时只询问影响方案的关键信息,不凭模型常识替客户决定资源或软件授权。
|
||||
|
||||
## 接口与脚本的实现方式
|
||||
|
||||
增加业务动作目录,由代码定义每种动作的参数、权限、预检和执行器。语言模型只能从目录中选择动作和填写参数,执行器再次验证。
|
||||
|
||||
优先复用当前平台接口:用户和桌面查询、用户绑定、CSV 预检、批量电源预检/任务、模板验证和克隆预检等。脚本适合已有接口未覆盖的受控运维步骤,以版本化模板登记;每个模板定义输入、执行位置、超时、返回结构及允许的任务类型。
|
||||
|
||||
脚本通过平台执行器获得限定的参数和凭据,凭据保留在服务端。模型生成的自由文本不能直接作为 Shell、PowerShell、SSH 命令执行;界面无需让普通用户复制命令。
|
||||
|
||||
建议新增的后台对象及接口(设计,当前尚未存在):
|
||||
|
||||
| 对象/接口 | 内容 |
|
||||
| --- | --- |
|
||||
| 业务动作目录 | 查询范围、参数定义、权限、执行器、版本、预检要求 |
|
||||
| `POST /assistant/plans` | 输入需求,生成方案草稿;缺参数时返回简短问题或候选对象 |
|
||||
| `POST /assistant/plans/{id}/check` | 对已确定的对象和动作预检,保存检查时间与资源版本 |
|
||||
| `POST /assistant/plans/{id}/execute` | 对同一版本的方案进行幂等提交,重新核对权限和资源 |
|
||||
| `GET /assistant/plans/{id}` | 方案步骤、执行状态、关联任务和结果 |
|
||||
| 方案及步骤存储 | 意图、对象标识、参数、预检快照、执行人、每步结果及任务关联 |
|
||||
|
||||
执行权限取当前真实登录身份,同时检查版本可用功能;模型和脚本不能越过服务端 RBAC。只读账号可查和生成允许范围内的方案,执行写操作仍会被后端拒绝。日志、设备名称、用户描述和模型输出都按数据处理,不能改变动作权限。
|
||||
|
||||
方案必须保存确定的对象标识和版本。“所有设备”也先展开成可核对的清单,不在执行时重新解释为另一批对象。资源、授权或方案发生变化时重新预检。脚本版本在方案内固定,执行前变更不能悄悄套用。
|
||||
|
||||
每步拥有稳定操作标识并关联现有 task/command;HTTP 提交成功只代表已提交。对于尚无原生幂等支持的接口,编排层需保存调用状态并提供结果核对。结果未知的步骤先核对,不重发;部分成功时保留成功结果、停止依赖步骤并给出具体处理建议。跨系统工作流不承诺全局事务回滚,补偿动作单独展示和执行。
|
||||
|
||||
## 按项实施与验收
|
||||
|
||||
1. 通用工作台与导航:接真实数据、业务名称、常用操作,保留高级界面;测试权限、空态、失败、深浅主题和窄屏。
|
||||
2. 业务向导与方案对象:先完成“已有桌面授权”“批量开机预检”“终端无桌面诊断”。测试预检无业务副作用、对象唯一性、重复点击和逐步结果。
|
||||
3. 接语言模型:使用真实模型服务,验证输出动作参数,展示可执行方案;测试缺信息、同名对象、服务失败、越权请求及日志中的恶意指令。模型供应方式、外发数据范围、密钥和费用上限由部署配置决定。
|
||||
4. 扩展脚本模板与流程:选择一个现场可验证的流程接入,测试模板版本、超时、离线、部分成功和结果核对,再开放下一项。
|
||||
5. 商业版本授权:功能分包、服务端校验、到期与升级流程,单独验收。账号安全与审计保留为两版基础能力。
|
||||
|
||||
按用户要求,每项完成并通过对应测试后再进入下一项。原先暂缓的专用 VM、Windows 副本、存储准备和真实还原验收继续暂缓,不因本设计自动恢复。
|
||||
@@ -16,9 +16,9 @@
|
||||
| 终端与会话 | 设备登记、注册、心跳、名称/分组修改、停用/重新激活与旧令牌撤销;授权列表、票据、串流状态、重启/会话重置/诊断日志回执;运维策略模板、按设备/分组下发与应用回执;90 天会话历史与名称快照 | Wi-Fi、USB、应用与显示策略;重新激活需管理员更新设备身份配置 |
|
||||
| 桌面使用者 | 新增、姓名编辑、启停、更换/解除关联终端、多桌面授权、批量追加/撤销、CSV 用户与授权导入、未消费票据作废 | 用户目录集成、用户自主登录模式 |
|
||||
| GPU | 已部署真实节点 PCI 显卡清单、IOMMU 分组、当前/待应用配置引用与纳管关系;直通配置由现场手工维护 | 实际驱动/运行占用、独占锁与绑定/解绑、健康指标和 GPU broker;配置引用不表示可分配 |
|
||||
| 监控告警 | 节点历史曲线、CPU/内存/存储与节点异常/终端离线规则、控制台告警确认及自动恢复;终端 CPU/内存/SoC 温度/运行时长、历史曲线和 30 天留存;缺失值保持空 | VictoriaMetrics、外部通知、终端系统指标告警、完整串流 FPS/RTT 采集 |
|
||||
| 监控告警 | 节点历史曲线、CPU/内存/存储与节点异常/终端离线规则、控制台告警确认及自动恢复;终端 CPU/内存/SoC 温度/运行时长、历史曲线和 30 天留存,以及终端 CPU/内存/SoC 温度持续告警;缺失值保持空 | VictoriaMetrics、外部通知、完整串流 FPS/RTT 采集 |
|
||||
| OTA | 尚无发布闭环 | 包签名、适配机型、灰度批次、暂停/恢复、Agent 安装、A/B 回滚 |
|
||||
| 批量与交付 | 本机 Docker/真实 PostgreSQL、用户/终端/授权 CSV 预检及整批导入、操作审计与任务记录 | 独立服务器、MQTT/Rust Agent、七服务独立部署、备份恢复演练、离线交付 |
|
||||
| 批量与交付 | 本机 Docker/真实 PostgreSQL、用户/终端/授权 CSV 预检及整批导入、操作审计与任务记录、审计全历史分页/多条件查询与 CSV 导出(单次 10000 条) | 独立服务器、MQTT/Rust Agent、七服务独立部署、备份恢复演练、离线交付 |
|
||||
|
||||
画质/延迟、上网代理、软件白名单和品牌兜底画面继续按原有计划单独处理。
|
||||
|
||||
@@ -135,4 +135,23 @@ Go 全量测试与 `go vet` 通过,使用独立临时 PostgreSQL,覆盖账
|
||||
|
||||
## 终端系统指标与历史(2026-11-10)
|
||||
|
||||
5182 的「终端管理 → 详情 → 查看运行指标」已接通真实 CPU、内存、SoC 温度和运行时长,支持 1 小时/24 小时/7 天趋势、30 天留存、缺失断线和过期隐藏。盒子升级为 `qt-platform/0.4.0`,真实连续采样已入库,旧 Agent 兼容通过;没有将目标 FPS 或请求耗时当作串流实测指标。Go 全量及静态检查、前端检查/构建、57 项页面回归和盒子 6 项 CTest 通过,真实深浅主题及 390px 页面检查无异常。原设备配置、账号密码哈希指纹、桌面参数和授权一致,三台 VM 的配置 digest 与运行状态保持。详见[采集范围与验收](cloud-terminal-metrics-20261110.md)。串流 FPS/RTT、GPU 健康指标及系统指标告警仍待接入。
|
||||
5182 的「终端管理 → 详情 → 查看运行指标」已接通真实 CPU、内存、SoC 温度和运行时长,支持 1 小时/24 小时/7 天趋势、30 天留存、缺失断线和过期隐藏。盒子升级为 `qt-platform/0.4.0`,真实连续采样已入库,旧 Agent 兼容通过;没有将目标 FPS 或请求耗时当作串流实测指标。Go 全量及静态检查、前端检查/构建、57 项页面回归和盒子 6 项 CTest 通过,真实深浅主题及 390px 页面检查无异常。原设备配置、账号密码哈希指纹、桌面参数和授权一致,三台 VM 的配置 digest 与运行状态保持。详见[采集范围与验收](cloud-terminal-metrics-20261110.md)。串流 FPS/RTT、GPU 健康指标仍待接入;系统指标告警已在 11-11 接入,见后续记录。
|
||||
|
||||
|
||||
## 终端系统指标告警(2026-11-11)
|
||||
|
||||
5182「监控告警」新增终端 CPU、内存、SoC 温度规则,按真实新采样计算持续时长;计时不早于规则启用/修改,重复评估不推进,缺失/过期不冒充恢复。支持原有三角色权限、确认、规则启停和 90 天事件历史;摄氏度与百分比分开显示。Go 全量与静态检查、前端检查/构建及 61 项隔离页面回归通过,旧规则/事件/待触发状态的重复升级验证通过。无需更新终端,未操作 VM、磁盘或 GPU。详见[规则与验收边界](cloud-terminal-alerts-20261111.md)。
|
||||
|
||||
11-11 补充:[操作审计历史查询与 CSV 导出](cloud-audit-history-20261111.md)补齐超过最近 1000 条的历史查询,支持时间、操作人、动作、结果和请求标识检索。执行任务历史已在后续批次补齐,见[任务历史查询与 CSV 导出](cloud-task-history-20261111.md)。
|
||||
|
||||
## 管理员在线登录管理(2026-11-11)
|
||||
|
||||
已部署「系统设置 → 管理员账号 → 在线登录」,支持来源、登录/到期时间、分页与指定登录撤销。Go 全量/vet、前端检查/构建、8 项页面回归与真实临时账号双登录撤销验收通过。旧登录来源显示未知,当前登录保护,审计不暴露凭据。见[使用说明与测试证据](cloud-admin-sessions-20261111.md)。
|
||||
|
||||
## 管理员双重验证(2026-11-11)
|
||||
|
||||
已部署右上角「双重验证」:本人可选绑定身份验证器、动态码或恢复码登录、恢复码更新与关闭。Go 全量/vet、前端检查/构建、6 项新增页面和 12 项既有回归通过,并完成真实临时只读账号及实际页面完整验收。root 登录方式保持,见[功能、证据与回退限制](cloud-mfa-20261111.md)。
|
||||
|
||||
11-11 追加:[通用/高级两版界面](cloud-editions-20261111.md)已在 5182 部署,包含通用员工授权向导、设备登记/诊断、简明记录和高级显卡准备结果核对。两版共用真实 API/RBAC;首批 34 项页面测试、6 项单元测试和 GPU 专项集成通过,真实临时员工授权流程验收后已清理。模型暂不接入,剩余高级事项保持原验收边界。
|
||||
|
||||
11-11 追加:[高级版日志与诊断中心](cloud-diagnostics-20261111.md)已在 5182 部署:设备/桌面按唯一 ID 关联五类记录,数据库分页、来源/时间筛选、设备采集回执和完整 ZIP 导出。6 项后端专项、Go 全量/vet、25 项浏览器回归及真实接口/页面验收通过;真实盒子成功完成一次只读日志采集。现有身份、授权、连接配置及告警规则保持,唯一新增任务为该次采集。持续实时日志、全量归档和客体自动采集仍待后续。
|
||||
@@ -0,0 +1,50 @@
|
||||
# 管理员双重验证(2026-11-11)
|
||||
|
||||
已部署本机 `http://127.0.0.1:5182`。入口为右上角锁形按钮「双重验证」,三个角色均可维护本人设置。既有账号默认不启用;root 密码和原登录方式保持,未为用户账号自动绑定验证器。
|
||||
|
||||
## 使用
|
||||
|
||||
1. 点击「双重验证」,输入当前密码开始绑定。在身份验证器中手动添加账号,填入页面显示的密钥,选择基于时间、6 位、30 秒更新;本期提供手动密钥,不生成二维码。
|
||||
2. 输入动态码并点击「验证并开启」。绑定准备有效 10 分钟,必须在发起绑定的同一登录中确认;确认前不启用。关闭准备窗口不会启用验证,重新开始会生成新密钥。
|
||||
3. 保存只显示一次的 8 条恢复码,可下载文本。每条只能使用一次;关闭窗口后无法再次查看原码。开启后其他登录立即失效,当前登录保留。
|
||||
4. 登录先验证用户名和密码,启用账号随后出现动态码/恢复码输入框。验证成功前不签发或保存登录令牌。动态码成功使用一次后需等待身份验证器刷新,服务端容许前后一个 30 秒时间步的时钟误差。
|
||||
5. 更新恢复码或关闭验证,均须当前密码及有效动态码/恢复码,并二次确认。更新使全部旧恢复码作废,关闭恢复密码登录;两项操作均撤销其他登录,保留当前登录。
|
||||
|
||||
动态码遵循 [RFC 6238](https://www.rfc-editor.org/rfc/rfc6238),使用 SHA-1、6 位和 30 秒时间步。请保持验证器和服务器时间同步。丢失验证器和全部恢复码时需要受控运维恢复,当前网页不提供其他管理员代删 MFA、邮件找回或目录服务恢复;重置密码也不会绕过已有双重验证。
|
||||
|
||||
## 接口与保护
|
||||
|
||||
| 接口 | 用途 |
|
||||
| --- | --- |
|
||||
| `GET /api/v1/auth/mfa` | 本人启用状态、剩余恢复码数量,不回显密钥 |
|
||||
| `POST /api/v1/auth/mfa/setup` | 当前密码验证后生成临时绑定密钥 |
|
||||
| `POST /api/v1/auth/mfa/confirm` | 验证动态码、启用并返回一次性恢复码 |
|
||||
| `POST /api/v1/auth/mfa/recovery` | 当前密码和验证代码校验后更新恢复码 |
|
||||
| `DELETE /api/v1/auth/mfa` | 当前密码和验证代码校验后关闭 |
|
||||
| `POST /api/v1/auth/login` | 新增可选 `code`;启用账号必须通过第二因素 |
|
||||
|
||||
- 临时和启用密钥使用 AES-GCM 加密,独立用途密钥由 `VDI_JWT_SECRET` 派生,附加认证数据绑定管理员标识。备份恢复须保留对应环境密钥,不能只恢复数据库或随意替换 JWT 密钥。
|
||||
- 恢复码使用 128 位随机值,库中仅保存哈希;消费、会话创建、恢复码轮换、设置修改及相关审计使用事务。TOTP 时间步单调递增,同一动态码及同一恢复码的并发请求仅一次成功。
|
||||
- 账号行锁将登录与权限/密码/MFA 修改串行,事务内复核当前登录及最新账号状态。开启、关闭及恢复码更新分别记录 `enable_mfa/disable_mfa/rotate_mfa_recovery`,审计不保存密钥、明文恢复码、密码或验证码。
|
||||
- MFA 设置验证和登录各使用独立持久化尝试预算:每账号每 5 分钟 10 次、每来源地址 30 次。失败尝试和成功尝试均计数;返回 429 与 Retry-After。错误密码不会暴露账号是否已启用 MFA,也不会消费恢复码。
|
||||
- 密钥、恢复码和密码只在当前页面流程中短暂保留,关闭窗口清理,不写入 localStorage/sessionStorage。恢复码仅通过明确下载操作保存到用户本地。
|
||||
|
||||
新增 `admin_mfa/admin_mfa_recovery` 附表,不改原账号及会话表字段。关闭 MFA 删除本人附表记录及恢复码;删除临时管理员时级联清理。验证设置取消或过期后不激活,过期密文保留至下一次绑定覆盖或账号清理。
|
||||
|
||||
## 验收
|
||||
|
||||
- 独立 PostgreSQL 的 Go 全量测试与 vet 通过;专项通过 RFC 六组 SHA-1 测试向量(含 2038 年之后)、时间窗口、动态码重复使用拒绝、恢复码重复使用拒绝、并发消费、密文账号绑定、三角色本人维护、准备过期/跨登录拒绝及尝试限制。另补充超级管理员重启后设置保留及改密仍需第二因素的验证,专项通过。
|
||||
- 前端 lint/typecheck、3 项单元测试和生产构建通过;新增 6 项 MFA 页面测试通过,既有管理员/在线登录/界面 12 项回归通过。最初 3 条错误文案断言未包含请求编号,修正断言后全部通过,应用提示逻辑正常。
|
||||
- 真实临时只读账号完成开启、原登录撤销、密码单独登录拒绝、真实当前时间动态码登录、动态码重复拒绝、恢复码登录及重复拒绝、恢复码更新及旧码失效、关闭后密码登录。设置变化审计不含秘密,临时账号及其 MFA/会话已清理。
|
||||
- 真实浏览器操作完成绑定确认、恢复码下载、登录第二因素、恢复码登录及关闭;1440/390px 深浅主题通过,无脚本异常、非预期 API 错误或越界写请求。真实截图仅展示登录提示及启用状态,不保存有效密钥或恢复码。
|
||||
- 原账号/密码指纹、用户授权、终端身份与配置、告警规则及三台 VM 配置摘要一致,盒子在线。验收期间盒子另行提交成功的 `gpu-prepare` 任务:业务任务 61→62,VM100 开机、VM101 关机,VM102 保持关机。该次设备任务和前后状态已完整保留,不把电源变化当作本轮 MFA 测试操作,也未强制恢复现场状态。
|
||||
|
||||
证据:[真实接口](evidence/cloud-mfa-20261111/live-verification.json)、[真实页面](evidence/cloud-mfa-20261111/browser-verification.json)。集成测试只使用一次性 `vdi-mfa-test-db`,未在业务库清空数据;隔离库为减少清理同步等待临时关闭 fsync,因此这些测试不证明数据库断电恢复能力,业务 PostgreSQL 配置未改动。
|
||||
|
||||
## 部署与回退
|
||||
|
||||
部署前备份 `.local/live/backups/before-mfa-20261111-154828.dump`,原镜像标签 `before-mfa-20261111-154828`。独立构建基线二进制与部署前 SHA-256 一致:`ac04d8f5423b07aa2afa442013a4ddeaee55bbf0343a0876c50a8e829c6a4779`,保留已部署 GPU 功能及 Compose 配置。
|
||||
|
||||
旧 API 不检查新增 MFA 表,直接回退会绕过第二因素。只要存在已启用 MFA 的账号,就必须保留强制验证的兼容 API,不能直接回退到旧镜像;部署脚本的失败恢复也加入了启用账号检查。只有确认没有启用账号且没有后续部署时,才可恢复原镜像并沿用 `.local/mfa-review/compose.release.yml` 和原环境配置;附表可保留,不删除业务卷或恢复整库覆盖其他工作。
|
||||
|
||||
此项为可选的本人 TOTP 与恢复码,尚未实现组织强制策略、目录集成、硬件安全密钥或 WebAuthn。专用 VM、Windows 副本、额外磁盘及真实快照还原仍按用户要求暂缓。
|
||||
@@ -142,7 +142,7 @@ go test ./...
|
||||
- 在线按最近 90 秒心跳计算;FPS/RTT 缺失为 null,不填 0。PVE 电源状态与 VM 内连接服务状态分开。
|
||||
- 任务成功必须有计算适配结果或设备回执。提交后发生通信异常时保留“结果未确认”,由管理员核对实际状态,不自动重试。
|
||||
- 桌面“重启”只用 PVE reboot;未将硬重启 reset 冒充“还原镜像”。
|
||||
- 当前任务和审计列表展示最近 1000 条,完整记录仍存 PostgreSQL;长期检索和归档后续扩展。
|
||||
- 任务和审计已支持完整历史的数据库分页、组合检索及 CSV 导出;单次导出最多 10000 条。全局轮询只读取近期任务和全部未结束任务;外部归档、防篡改待扩展。详见[任务历史](cloud-task-history-20261111.md)和[审计历史](cloud-audit-history-20261111.md)。
|
||||
- 凭据不写入审计;设备上报的自由文本不直接放入公开任务结果。
|
||||
|
||||
## 管理员维护(2026-11-10)
|
||||
@@ -184,3 +184,12 @@ go test ./...
|
||||
## 终端系统指标与历史(2026-11-10)
|
||||
|
||||
5182 的「终端管理 → 详情 → 查看运行指标」已接通真实 CPU、内存、SoC 温度和运行时长,支持 1 小时/24 小时/7 天趋势、30 天留存、缺失断线和过期隐藏。盒子升级为 `qt-platform/0.4.0`,真实连续采样已入库,旧 Agent 兼容通过;没有将目标 FPS 或请求耗时当作串流实测指标。Go 全量及静态检查、前端检查/构建、57 项页面回归和盒子 6 项 CTest 通过,真实深浅主题及 390px 页面检查无异常。原设备配置、账号密码哈希指纹、桌面参数和授权一致,三台 VM 的配置 digest 与运行状态保持。详见[采集范围与验收](cloud-terminal-metrics-20261110.md)。串流 FPS/RTT、GPU 健康指标及系统指标告警仍待接入。
|
||||
|
||||
|
||||
## 终端系统指标告警(2026-11-11)
|
||||
|
||||
5182「监控告警」新增终端 CPU、内存、SoC 温度规则,按真实新采样计算持续时长;计时不早于规则启用/修改,重复评估不推进,缺失/过期不冒充恢复。支持原有三角色权限、确认、规则启停和 90 天事件历史;摄氏度与百分比分开显示。Go 全量与静态检查、前端检查/构建及 61 项隔离页面回归通过,旧规则/事件/待触发状态的重复升级验证通过。无需更新终端,未操作 VM、磁盘或 GPU。详见[规则与验收边界](cloud-terminal-alerts-20261111.md)。
|
||||
|
||||
2026-11-11:[管理员在线登录管理](cloud-admin-sessions-20261111.md)已上线,提供单独撤销与登录来源查看。新增兼容附表,密码与原会话表不重置。
|
||||
|
||||
2026-11-11:[可选管理员 TOTP 双重验证](cloud-mfa-20261111.md)已上线。既有账号默认不启用;启用账号必须验证动态码或恢复码。存在启用账号时禁止直接回退到不校验 MFA 的旧 API。
|
||||
@@ -0,0 +1,28 @@
|
||||
# 执行任务历史查询与 CSV 导出(2026-11-11)
|
||||
|
||||
已部署本机 `http://127.0.0.1:5182/tasks` →「执行任务」,使用真实 PostgreSQL 数据。
|
||||
|
||||
## 使用与接口
|
||||
|
||||
支持关键词、操作者包含、动作、类型、状态、提交时间范围;每页 20 条,详情可打开旧任务,并保留既有核对、诊断入口。不选起始时间可查全部历史,不再截取最近 1000 条。查询固定截止时间,任务状态随平台刷新,新增任务需重新查询;导出使用已应用条件,修改草稿后不会混用。查询失败清空旧结果并禁用导出。
|
||||
|
||||
- `GET /api/v1/tasks`:SQL 分页,默认每页 20、最多 100 条。可选 `keyword/actor/action/kind/status/targetId/from/to/active`;关键词覆盖任务、目标、操作者、动作和结果。`%/_/反斜杠` 按普通文字匹配,时间使用含时区 RFC3339,边界包含两端。
|
||||
- `active=true` 查询全部 queued/running/timeout。全局刷新只取最近 100 条与分页拉全的未结束任务,旧任务继续阻止冲突操作,避免每 5 秒下载完整历史。
|
||||
- `GET /api/v1/tasks/export`:共享筛选,忽略分页,UTF-8 BOM/CRLF,10 列,时间为 UTC。成功生成记 `export_tasks` 审计;不包含 provider_ref、幂等键或原始任务参数。公式单元格加单引号。最多 10000 条,超过返回 413 并提示缩小范围;不会静默截断。
|
||||
|
||||
三角色均可查询和导出,未登录返回 401。列表总数和记录使用同一数据库快照,稳定排序 `created_at DESC,id DESC`。固定截止时间可避免正常追加造成翻页移动;历史时间回填和状态筛选结果变化仍可能改变后续页。没有新增历史清理或归档。
|
||||
|
||||
## 验收结果
|
||||
|
||||
- 独立 PostgreSQL Go 全量及 vet 通过;专项覆盖 1052 条旧任务分页、旧活动任务、组合筛选、字面通配符、导出 10000/10001 条边界、权限和公式防护。
|
||||
- 前端 lint、类型检查、3 项单元测试、生产构建通过。任务历史新增 4 项浏览器用例通过;原有快照、规格、批量电源和审计 26 项回归通过。
|
||||
- 真实环境 51 条任务按每页 2 条查询,共 26 页;CSV 的 51 个任务标识及顺序与完整分页一致。组合筛选、active、401 和非法条件拒绝、导出审计通过。
|
||||
- 真实深浅主题、1440/390px 页面、任务详情与 CSV 下载通过,无脚本错误、失败 API 或前端业务写请求。账号密码指纹、用户授权、终端身份及配置、告警规则、VM 配置和电源状态均与部署前一致,任务数仍为 51。
|
||||
|
||||
证据见 [真实接口核验](evidence/cloud-task-history-20261111/live-verification.json) 与 [真实浏览器核验](evidence/cloud-task-history-20261111/browser-verification.json)。独立打包以已部署 GPU 功能为基线,保留既有 GPU 配置;基线二进制 SHA-256 与部署前一致:`913056171c513393c24d15abfabcd7efd142a0d0bef3db6ae934f7ffa2cd8a8a`。
|
||||
|
||||
## 回退与范围
|
||||
|
||||
无数据库结构变更。部署前备份 `.local/live/backups/before-task-history-20261111-145521.dump`,原镜像标签 `before-task-history-20261111-145521`。回退前先核对后续部署,再将原 API/console 镜像打回服务名,使用 `.local/task-history-review/compose.release.yml`、原环境文件、`--project-directory deploy` 执行 `up -d --no-build --no-deps api console`,不删除业务卷。
|
||||
|
||||
专用测试 VM、Windows 副本、存储和真实还原仍按用户要求暂缓。此项不执行 VM、磁盘、GPU 或盒子控制命令。外部归档、防篡改仍待后续。
|
||||
@@ -0,0 +1,50 @@
|
||||
# 终端系统指标告警(2026-11-11)
|
||||
|
||||
本轮在已有真实 CPU、内存、SoC 温度采集之上,接通终端系统指标的规则、持续判断、事件、确认和恢复。入口为控制台「监控告警」,无需更新盒子客户端。
|
||||
|
||||
## 使用
|
||||
|
||||
超级管理员在「告警规则 → 新增规则」选择终端 CPU、终端内存或终端 SoC 温度,配置高水位与持续时间。使用率阈值为 1~100%,SoC 温度阈值为 1~150°C,持续时间为 0~3600 秒;值大于等于阈值视为超限。温度选项默认 80°C、持续 120 秒,只是表单初值,需按实际设备调整。
|
||||
|
||||
新增规则作用于已激活且启用的终端。旧客户端、不支持的传感器、空值和过期采样均不按正常值处理。SoC 温度只使用已有 `soc-thermal` 采集,不等同于 CPU 或 GPU 温度。系统升级不会自动创建或启用这三类终端规则。
|
||||
|
||||
运维人员可查看和确认告警,只读人员可查看。确认表示已知悉,不能代替指标恢复。修改或停用规则按现有流程结束该规则的当前事件,原因标为「规则变更」,并重新计时。已恢复事件保留 90 天。
|
||||
|
||||
本轮仅控制台告警,外部通知、终端 GPU 健康指标和串流 FPS/RTT 仍未接入。
|
||||
|
||||
## 数据与持续时间
|
||||
|
||||
- 评估循环沿用 15 秒周期,读取设备最近的真实采样。设备心跳和指标都须在 90 秒以内,设备须仍启用、已注册且支持系统指标。
|
||||
- 持续时间按源采样的时间差计算,起点不早于规则最近启用或修改时间;规则启用前的旧样本不占用持续时长。重复评估同一条采样不会累加。持续时间为 0 时,首次有效超限样本即可触发。
|
||||
- 无效或缺失采样清除待触发计时,保留已发生的告警。采样间隔或监测中断超过 90 秒,新的超限采样重新开始计时。
|
||||
- 为避免漏过评估间隔中的短暂恢复,使用已有历史采样检查上次评估之后是否出现正常值或空值;发现后从当前样本重新计时。检查仅回看最近 90 秒,利用终端/时间索引。
|
||||
- 这是采样级持续判断,不代表两次采样之间每一瞬间都被测量;服务长时间中断后会保守地重新计时。
|
||||
- 已触发事件在数据缺失时保持未恢复,页面明确显示「数据已过期或缺失;显示最近告警值,等待有效采样」。恢复有效采样后,仍超限就继续原事件,正常才自动恢复,不重复创建同一未结束事件。
|
||||
- 终端停用或重新激活导致目标不可用时结束事件,原因标为「目标移除或停用」,不冒充指标自然恢复。
|
||||
|
||||
## 接口和迁移
|
||||
|
||||
沿用 `/api/v1/monitor/rules`、`/monitor/rules/{id}`、`/monitor/alerts` 和 `/monitor/alerts/{id}/acknowledge`。
|
||||
|
||||
规则的 `metric` 增加 `terminal_cpu`、`terminal_memory`、`terminal_temperature`。事件增加可空的 `dataFresh`:终端系统指标返回当前来源是否有效,其他指标返回 `null`;事件值在数据缺失时仍为最近告警值,不能视作当前测量值。设置能力增加 `terminal-metric-alerts`,OpenAPI 与前端类型同步生成。
|
||||
|
||||
启动迁移扩展 `alert_rules_metric_check`,在 `alert_rules` 增加内部更新时间 `updated_at`,在 `alert_states` 增加可空 `last_sample_at`;不清空原规则、事件、待触发状态或业务数据。反复启动可重复执行。节点资源和离线规则继续沿用原有判断,不按终端源采样方式计算。
|
||||
|
||||
## 验证与回退
|
||||
|
||||
使用独立临时 PostgreSQL 验证三指标、持续源时间、重复评估、缺失/过期/旧 Agent、不连续采样、恢复、目标撤销、阈值/RBAC和旧库重复升级。控制台验证单位、温度上限、规则提交、错误保留、过期提示、确认语义、权限及深浅主题/窄屏。完整测试和现场结果见 [证据目录](evidence/cloud-terminal-alerts-20261111/)。
|
||||
|
||||
更新前备份为私有 `.local/live/backups/before-terminal-alerts-20261111-092529.dump`;旧 API 和控制台镜像标签为 `before-terminal-alerts-20261111-092529`。回退旧 API 前应先用新版本停用这三类终端指标规则,防止旧评估器误解未知指标。新列可以保留;不要通过删卷或恢复旧库覆盖新增业务数据。
|
||||
|
||||
本轮不修改设备策略或二进制,不操作 VM 电源、快照、磁盘、GPU 或模板。现场原有 VM 状态以更新前基线为准,而不是沿用前一天的运行状态。
|
||||
|
||||
|
||||
## 最终现场结果
|
||||
|
||||
API 与控制台已更新到本机 5182。真实盒子保持 `qt-platform/0.4.0` 在线,无客户端更新。临时将温度阈值设为 1°C、持续 60 秒验证真实链路,没有给设备加压或制造过热;最终复验覆盖 4 条真实温度样本,事件从开始到触发约 102 秒(包含采样与评估周期),起点不早于规则启用时间。确认后事件仍在告警;随后将该规则设为 **80°C / 120 秒、停用**,事件按“规则变更”结束。验收期间的测试事件保留在历史中,未将这一流程冒充实际过热或自然降温恢复;正常值自动恢复、过期和缺失流程由隔离数据库及页面测试验证。
|
||||
|
||||
Go 全量测试、`go vet`、旧表结构两次升级、前端 lint / 类型 / 3 项单元测试 / 生产构建及 61 项页面回归通过。真实深浅主题、1440px 与 390px 页面检查无脚本异常、失败响应或写请求,截图展示验收结束后的停用规则和已确认历史事件。
|
||||
|
||||
原账号密码哈希指纹、终端身份、授权、桌面参数和既有规则一致;VM102 保持运行,VM100/101 保持关机,三台 VM 的配置 digest 均与本轮更新前一致。期间另有一次资源同步任务新增,已原样保留,本轮没有提交桌面或终端任务。没有操作终端、PVE 电源、快照、磁盘或 GPU。
|
||||
|
||||
证据:[后端与页面测试](evidence/cloud-terminal-alerts-20261111/validation.json)、[真实触发与确认](evidence/cloud-terminal-alerts-20261111/live-verification.json)、[真实页面](evidence/cloud-terminal-alerts-20261111/browser-verification.json)。
|
||||
@@ -24,7 +24,7 @@ Agent 版本为 `qt-platform/0.4.0`。采集只读取系统文件,不启动额
|
||||
- `GET /api/v1/terminals/{id}/metrics?from=...&to=...` 返回当前值、在线/新鲜度、最近采样时间和聚合历史。未知终端 404,无管理登录 401。单次查询最长 7 天,6 小时以内按 60 秒、24 小时以内按 300 秒、更长按 1800 秒聚合。
|
||||
- CPU/内存/温度历史为桶内均值,运行时长为桶内最大值。显式返回空桶,页面在缺失处断线;粗粒度聚合可能合并同一桶内的短暂中断,不表示整桶内持续在线。
|
||||
- 设备停用、心跳或指标超过 90 秒,当前数值返回空值;历史仍可查。设备重新激活会清除旧身份的当前指标,保留历史。
|
||||
- 现有观测循环定期清理 30 天以前的历史。当前使用 PostgreSQL;VictoriaMetrics 和指标告警规则尚未接入。
|
||||
- 现有观测循环定期清理 30 天以前的历史。当前使用 PostgreSQL;VictoriaMetrics 尚未接入;终端系统指标告警已于 11-11 补齐,见[规则与采样判断](cloud-terminal-alerts-20261111.md)。
|
||||
|
||||
API 契约由 `tools/generate-platform-openapi.mjs` 生成,并同步到控制台类型。
|
||||
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
截至 2026-11-10,依据仓库中的实施记录整理。“已验证”以对应日期和范围为准,并非持续实时健康报告;11-10 启动认证修复已重新连接盒子核验。
|
||||
|
||||
2026-11-11 更新:Ubuntu、麒麟已接入 GTX 965M 渲染与 NvFBC/NVENC,三桌面按用户授权轮流直通同一块显卡;平台和盒子已部署“退出当前串流、选择下一台时正常关机再启动”的切换流程。下文原 Linux 软件编码资源表保留为历史基线,本轮配置、测量与尚未通过的稳定性条件以 [GPU 优化实施记录](evidence/linux-gpu-20261111/README.md) 为准,不能将其描述为三桌面并发或稳定 2K60。
|
||||
|
||||
## 产品与架构
|
||||
|
||||
当前主线是 RK3528 盒子上的 Qt kiosk,通过 Moonlight/Sunshine 接入 Windows、Ubuntu、麒麟。盒子开机进入“选择云桌面”,选择后启动串流,结束后回到列表。11-09 已在独立 production 数据库接通 PVE VM100/101/102 和真实盒子:设备注册/心跳、授权列表、一次性票据、三系统串流事件与远程会话重置。服务目前在开发机 Docker,详见[真实接入说明](cloud-live-integration.md)。
|
||||
@@ -32,6 +34,7 @@
|
||||
|
||||
| 事项 | 记录与验证边界 |
|
||||
| --- | --- |
|
||||
| 终端系统指标告警 | 11-11 新增 CPU/内存/SoC 温度持续规则、采样有效性与恢复判断;61 项页面回归通过,无需更新终端。见[规则与验收](cloud-terminal-alerts-20261111.md) |
|
||||
| 终端系统指标 | 11-10 已部署真实 CPU、内存、SoC 温度、运行时长与历史趋势;盒子 0.4.0 连续入库,57 项页面回归和 6 项 Qt 测试通过。串流 FPS/RTT 仍未采集。见[采集与验收](cloud-terminal-metrics-20261110.md) |
|
||||
| GPU 资源查看 | 11-10 已部署真实显卡清单、PCI/IOMMU、当前/待应用配置引用和纳管关系;现场识别 Intel 核显、GTX 965M 及 VM100 引用,51 项页面回归通过。未修改直通配置,独占分配和健康指标尚未接入。见[功能与验收](cloud-gpu-inventory-20261110.md) |
|
||||
| 桌面批量电源 | 11-10 已部署最多 50 台的开机/正常关机/重启、逐台预检、批次历史、幂等任务和原结果核对;45 项页面回归通过,现场仅做预检及取消,三台 VM 保持运行。专用 VM/Windows 副本和存储准备按用户要求暂缓。见[功能与边界](cloud-batch-operations-20261110.md) |
|
||||
@@ -74,3 +77,13 @@
|
||||
## 11-10 关机快照与手动还原
|
||||
|
||||
本机 5182 已部署真实快照列表、创建/删除/手动还原任务及只读核对,维护期间和未知结果阻止新连接与桌面修改。还原撤销旧票据并要求重新确认初始化。Go 全量、37 项浏览器回归和窄屏复验通过;现场只读检查保持原业务配置和三台 VM 运行,盒子心跳正常。当前 Token 无快照权限,PVE 报告 VM100 不支持快照,真实写入尚未验收;公共池退出自动还原未实现。见[快照与还原说明](cloud-snapshots-20261110.md)。
|
||||
|
||||
11-11 已补齐[操作审计历史查询与 CSV 导出](cloud-audit-history-20261111.md)及[执行任务历史查询与 CSV 导出](cloud-task-history-20261111.md),均支持数据库分页、多条件查询和全部匹配页导出;外部归档和防篡改仍待后续。
|
||||
|
||||
11-11 已补齐[管理员在线登录管理](cloud-admin-sessions-20261111.md):查看登录来源及到期时间,单独撤销指定登录并记录审计,保留当前登录保护。
|
||||
|
||||
11-11 已部署[管理员双重验证](cloud-mfa-20261111.md):本人可选绑定身份验证器,动态码与一次性恢复码登录,支持更新恢复码和关闭。既有账号默认不启用。
|
||||
|
||||
11-11 已部署[通用版与高级版](cloud-editions-20261111.md):通用版五个日常入口,真实员工授权、设备登记、只读问题诊断和简明操作记录;高级版保留专业管理并补齐显卡准备超时任务核对入口。模型暂不接入,界面模式不改变账号权限或原功能验收范围。
|
||||
|
||||
11-11 已部署[高级版日志与诊断中心](cloud-diagnostics-20261111.md):按唯一设备/桌面关联任务、会话、告警、审计和设备日志,支持 7 天内筛选、分页与完整 ZIP 导出;真实盒子通过页面采集成功并展示/导出。6 项后端专项、Go 全量/vet、25 项页面回归及真实权限/深浅/窄屏检查通过。持续实时日志、全量归档和 VM 客体日志自动采集仍未实现。
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"time": "2026-11-11T07:17:20.960Z",
|
||||
"realAPI": true,
|
||||
"themes": [
|
||||
"dark",
|
||||
"light"
|
||||
],
|
||||
"viewportWidths": [
|
||||
1440,
|
||||
390
|
||||
],
|
||||
"scriptErrors": [],
|
||||
"failedResponses": [],
|
||||
"blockedWrites": [],
|
||||
"screenshots": 3
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"time": "2026-11-11T07:09:39.915702+00:00",
|
||||
"backup": ".local/live/backups/before-admin-sessions-20261111-150936.dump",
|
||||
"backupBytes": 256037,
|
||||
"oldImageTag": "before-admin-sessions-20261111-150936",
|
||||
"oldImages": {
|
||||
"api": "sha256:92138b1111fab09270b192ce465ba66fa98393158bace1a359a7553f92dda046",
|
||||
"console": "sha256:828b045abf8c6eca17592a1bfbd2b62f8e50b723f4dbd6439d7f3ebfbccc3fd7"
|
||||
},
|
||||
"deployedAt": "2026-11-11T07:14:11.930124+00:00",
|
||||
"baselineBinarySHA256": "78f454b057fd2de9510fa966ada07654692c609181faa62dc72c96391f0d95ec",
|
||||
"baselineMatchesLiveBinary": true,
|
||||
"existingGPUConfigurationPreserved": true,
|
||||
"activeJobsBeforeDeployment": 0,
|
||||
"newImages": {
|
||||
"api": "sha256:4bc0609343b3c9382c859444579c0246bc12bb6ff787c2d0fb784ec7942db3b7",
|
||||
"console": "sha256:52c38fa17705374202f557edd959271e0fae1c88d9f104a356b266dbd54b5e83"
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 81 KiB |
|
After Width: | Height: | Size: 83 KiB |
|
After Width: | Height: | Size: 45 KiB |
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"time": "2026-11-11T07:17:17.750800+00:00",
|
||||
"mode": "production",
|
||||
"realDatabase": true,
|
||||
"twoSessionsCreated": true,
|
||||
"selectedSessionRevoked": true,
|
||||
"otherSessionValid": true,
|
||||
"sessionsHideCredentials": true,
|
||||
"auditRecorded": true,
|
||||
"accountDisableRevokedSessions": true,
|
||||
"authenticationEnforced": true,
|
||||
"administratorsUsersBindingsDeviceIdentityUnchanged": true,
|
||||
"alertRulesUnchanged": true,
|
||||
"vmConfigAndPowerUnchanged": true,
|
||||
"businessTaskAndSnapshotCountsUnchanged": true
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"time": "2026-11-11T02:22:58.470Z",
|
||||
"realAPI": true,
|
||||
"themes": [
|
||||
"dark",
|
||||
"light"
|
||||
],
|
||||
"viewportWidths": [
|
||||
1440,
|
||||
390
|
||||
],
|
||||
"downloaded": true,
|
||||
"scriptErrors": [],
|
||||
"failedResponses": [],
|
||||
"blockedWrites": [],
|
||||
"screenshots": 4
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"time": "2026-11-11T02:18:16.487141+00:00",
|
||||
"backup": ".local/live/backups/before-audit-history-20261111-101812.dump",
|
||||
"backupBytes": 206044,
|
||||
"oldImageTag": "before-audit-history-20261111-101812",
|
||||
"oldImages": {
|
||||
"api": "sha256:040ca70d5ecf42a0db2c43d089bc3e1da85d98730a2eb22cfb043babe94fc2d4",
|
||||
"console": "sha256:919d26c7ee5e0292fb22d1fcbb7b6144a6eb110cce6271351cc5bdc2a80d1034"
|
||||
},
|
||||
"deployedAt": "2026-11-11T02:22:33.443673+00:00",
|
||||
"baselineBinarySHA256": "8c87f4e2183bd6f96ff5d67544f0467dc832c6af524ba8f1426aa5ec54d82d75",
|
||||
"baselineMatchesLiveBinary": true,
|
||||
"concurrentGPUCodeExcluded": true,
|
||||
"composeGPUConfigurationExcluded": true,
|
||||
"activeJobsBeforeDeployment": 0,
|
||||
"newImages": {
|
||||
"api": "sha256:4b01050834124b526eba7b5ee32839bfffccfa43a674f86c53c9e3f29199bfb3",
|
||||
"console": "sha256:b4d15d6fa16c3576ca2beba1132369917554dcc3978e8609547a46483cf0324d"
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 183 KiB |
|
After Width: | Height: | Size: 126 KiB |
|
After Width: | Height: | Size: 186 KiB |
|
After Width: | Height: | Size: 76 KiB |
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"time": "2026-11-11T02:22:54.883217+00:00",
|
||||
"mode": "production",
|
||||
"realDatabase": true,
|
||||
"matchingRecords": 187,
|
||||
"pageSize": 2,
|
||||
"pages": 94,
|
||||
"csvRows": 187,
|
||||
"csvMatchesAllPages": true,
|
||||
"exportAudited": true,
|
||||
"authenticationEnforced": true,
|
||||
"invalidRangeRejected": true,
|
||||
"administratorsUsersBindingsDeviceIdentityUnchanged": true,
|
||||
"alertRulesUnchanged": true,
|
||||
"vmConfigAndPowerUnchanged": true,
|
||||
"vmPowerStates": [
|
||||
"running",
|
||||
"stopped",
|
||||
"running"
|
||||
],
|
||||
"businessTaskAndSnapshotCountsUnchanged": true,
|
||||
"taskCount": 8
|
||||
}
|
||||
@@ -0,0 +1,140 @@
|
||||
{
|
||||
".dockerignore": "1ec5c1cbf7804fe50681775ff7204bd0a753ace315c071e089fb35b6cc38e24a",
|
||||
"console/.env.example": "ab72c957a6f5895d608a924ddd6bcc4c92044ed854465ccd38490bf2896d7128",
|
||||
"console/Dockerfile": "0ec09a6f15331a85b24d5ef278719827ea2a9bb6eb0759cfa4ddf6377f4c88a7",
|
||||
"console/eslint.config.js": "d55522173395ade075e0ae7bac6567ad25ed218e5862184e9edffc011e23a72a",
|
||||
"console/index.html": "04a80010b9d643f1e922b53b76242632d1bb23a55151f87e370644e2868e624f",
|
||||
"console/package-lock.json": "bdf4236cdb3ffd48a8a8d2394a5324c3b3beabc6c82f382c5ecd82ca1f402a1b",
|
||||
"console/package.json": "cd2cb1bf4e74cfd35547ae47cae6b77296ce62a6a6aaa986ed6d0c0695530851",
|
||||
"console/playwright.config.ts": "0d3eab93c9da1dcb9c4ae3106af46784edafe9ef45c9104ee2fa07c1ab281aa1",
|
||||
"console/playwright.live.config.ts": "6d965bfed9446c0b398083d70ac12b4cddbd702ce3bbbcf6dcb70ce10527eb06",
|
||||
"console/README.md": "b8fb84bb09b8b634d2dfb53aeb6f9a984cc6aacb71b39820f91e5cc573515cec",
|
||||
"console/tsconfig.json": "becebae4321654e60c434896219fbada01bd8a8ddf3325e39e70a460a7667cea",
|
||||
"console/vite.config.ts": "22fb15d5fd246e1511318444e59126a03a152b7385e3fd19518c85e9d4a5e5a9",
|
||||
"console/vitest.config.ts": "74ef7d84fb000f03870f49b271d17f329d1c8c4b043db3f31dede2b12a88e069",
|
||||
"deploy/compose.dev.yml": "60e2545268c994f4efa410abc7a0a4878d80c1e93ae3094cf37548f4615595da",
|
||||
"deploy/compose.live.yml": "70b60e5dfc89369e7f26665b1310a73638a259798a77d07fcc5a9f0d464c6c9d",
|
||||
"deploy/nginx.conf": "c81448d1329fd13bc50fe8e5969b8fe049477bc3c7ff43eefa74d6c0c769d803",
|
||||
"deploy/nginx.live.conf": "3c5bd01b9e9d5e50cae6fd36568fdcb2b96a7480d2690f30928e8b458befb493",
|
||||
"platform/.env.example": "4d979ea700686c54830ca039ef4649ff0f653545720db29c37cf4227e4758572",
|
||||
"platform/Dockerfile": "61ae69a5b8ed1b19d31b5f47e628ac978d95a54ca15936aeb688504c9a5961ca",
|
||||
"platform/go.mod": "559117ddf04023e338455ab192790b813a4a153f1ea5bd936ea0907bd2b572a8",
|
||||
"platform/go.sum": "25fa1de5f07dd2cce19db1534dd066262c32e93dcbb6118cac87ff8996854097",
|
||||
"platform/README.md": "52ce4e99d72ac4333fad8b2342a22f88dc7bf4c49c08a6f13fab7f8e28fa2d71",
|
||||
"platform/pkg/proxmox/client.go": "8e8c256adb8ca37c85f453bc592087b80742ffccb76f640da264e28367e2995b",
|
||||
"platform/pkg/proxmox/client_test.go": "5a2ce7031fd0b402608a4d10d5f5d2cf4c41938f6fedc8ecfa0723de837b13ef",
|
||||
"platform/pkg/proxmox/gpu.go": "946fa364aabba8b96679c8ee184e407f7e09c1a5667930fdbedd1480ccc615d4",
|
||||
"platform/pkg/proxmox/gpu_test.go": "b72fe8a8f06fcead0b73dd71bea3803b4ff51e1513abff95fa71ed578dab119e",
|
||||
"platform/pkg/proxmox/hardware.go": "d35be1f147872101f88ccec84e60050da46579d2563b7b0fd013a77cb4bc3a2b",
|
||||
"platform/pkg/proxmox/hardware_test.go": "60ebff73c6ae9d9356638f84b5e1b41464529ac71988bc1f98a8262551923c5a",
|
||||
"platform/pkg/proxmox/provision.go": "eea12dd036f325adf8ca6d3add8a075a873f837f191cc24d5d61c49bcb496f66",
|
||||
"platform/pkg/proxmox/provision_test.go": "dc100d228fa1cda0fe02bf5052660b6bd348932e717bd8caf4bfe096cac05163",
|
||||
"platform/pkg/proxmox/snapshots.go": "5620699da3345bea052d2b31dc5005496ed610918d7a63668b1986ee4d71d0ea",
|
||||
"platform/pkg/proxmox/snapshots_test.go": "5c2aaab24c87894316a473ad97b1488b84e0108c1db56b07fc242f03b39e3969",
|
||||
"platform/internal/config/config.go": "ee4bec0d50f50d2fab8b87f2b1bff23392a8913a090396c0995f65195f49966f",
|
||||
"platform/internal/model/model.go": "f5eb9f9f68e8ea655fa7061ee9dc994a88eeb73df0fa3256cf627479baf50989",
|
||||
"platform/internal/server/admin.go": "1771c904df180e846794a81f447a9889bd03301e9e8d783e798ad137b4fee2b3",
|
||||
"platform/internal/server/administrators.go": "400989e699329c4643bb37fdbdb5a89acaba4959fc7d1587524bc84c73b12fc4",
|
||||
"platform/internal/server/administrators_test.go": "750b4f915d290d181503d836c6585aca48a8f011f4600b9ab50fbde4dfa1d97b",
|
||||
"platform/internal/server/audits.go": "6706dd7fdbfaae6bd9dab9e43549eb498f9921862a10ece84c0c3a67c265f43f",
|
||||
"platform/internal/server/audits_test.go": "5ce668bb6e4d4d49d85e637168ddb76d85ac02ef7b4d5b039d7a96796686b119",
|
||||
"platform/internal/server/catalog.go": "5970c170a02204f92b46db4e2657aa184dc6b7489061c40e4a5b16afb86ad890",
|
||||
"platform/internal/server/catalog_test.go": "5fbdf7c1bad6ffe445d027270a04072ae273c3b3b64206a5dc61f58953e1cadb",
|
||||
"platform/internal/server/compute_connection.go": "87ee2de5cad7b2222d185048442f173dbfb349fa721ada90c095f38e259b2975",
|
||||
"platform/internal/server/configuration_test.go": "7d66f7f672f7b6978235d3178a219943fd05f5a9a79c939f0470342a894c5729",
|
||||
"platform/internal/server/gpu.go": "f1a46be6bd8995fb1388a5bd57e1fc6f91494bc662368faa900183ed5e65e212",
|
||||
"platform/internal/server/gpu_test.go": "3f06e25b64ca6edebb382493751b52d846b36d2e31c449116fac7a565bda467b",
|
||||
"platform/internal/server/hardware.go": "63675368f7bdde9173d8cdcb82a2633b16c8757c05d77860e936dd40d29b9040",
|
||||
"platform/internal/server/imports.go": "413854f1565f01c91a3bdb58ce5a9517925dd7d841b0d08a5302f68094283db7",
|
||||
"platform/internal/server/lifecycle.go": "32ba57fbb74655f2eb10c4896adc09e8e6115d75ec1e7a54fa4e119bde157cde",
|
||||
"platform/internal/server/lifecycle_test.go": "c2a905d7415ac9da0522f6793a540dcfb4f743ccf008b98e6d7d5baf0fac4a58",
|
||||
"platform/internal/server/login_limits.go": "4c18db415396140522a6a7d7bd99f5475e527bab9ac62291af6b5cfb4ebb7f96",
|
||||
"platform/internal/server/maintenance.go": "1e3fd3e712a2e40175b30e9aa4f1c4a884534ecdf22c22be8d860fd7bee6851c",
|
||||
"platform/internal/server/observability.go": "90b3667ab5a12304714a6e0dba52ee910ec8f536c4b28a8106f0468e0e0d28eb",
|
||||
"platform/internal/server/operations_test.go": "9dd8eb57118f55cc19949edb2725c18b2912a42eab7eb011d0f68237a9224077",
|
||||
"platform/internal/server/policies.go": "f1b2fbe06c7467a14b923b5deda4ca5405431a1c246d20e589a1f8d70396da9b",
|
||||
"platform/internal/server/policies_test.go": "146f79f9271e222c5bda54fe171a838fafe3cf18c9bccd9dc52bfc213b98f8ec",
|
||||
"platform/internal/server/power_batches.go": "69220167981a712e415a1ff5d2e5dbd857f186cf4063bfdd1be6f7baef7c8ffe",
|
||||
"platform/internal/server/power_batches_test.go": "f3be4c6398885ff5579b9dc45dddb6c9a4a8b219be2fdafa92254419917d2e6b",
|
||||
"platform/internal/server/power_batch_worker.go": "ecab67a9aff19efac3e674881d947c80395a6e88776dd923a2ec9d0dfdd0b454",
|
||||
"platform/internal/server/provision_worker.go": "9d3d6419f47a32d15bae2c8fac3a02fbf8e5858488a05015beab58f73d7d0010",
|
||||
"platform/internal/server/server.go": "990095f61c16169312a74fc3a7ac70df9ac2762be29bdc17477579bd2f442ff9",
|
||||
"platform/internal/server/server_test.go": "25d6323570f7a454ca5ca9cb1683e28be66f75de4521b0908153bcef138fec1d",
|
||||
"platform/internal/server/session_history.go": "4098d126d1a7e841a1c4b5b1be4fe101dd884b08a71c78b8ca98e73309008c78",
|
||||
"platform/internal/server/snapshots.go": "97dd570e5b7e0352dd6c0037dca529f4ff764a6718e36d6c9e2b682ff75aceb6",
|
||||
"platform/internal/server/snapshots_test.go": "90523abace16f3cca1a0b538b6896072294a05163b8a54ee760fba360eddb0de",
|
||||
"platform/internal/server/terminal.go": "0143bf616243a9d0292aaec1ea134ced43f0ed4900765894d61e592f23f83dff",
|
||||
"platform/internal/server/terminal_alerts.go": "eb44d842b9f7430ac71f7d361f0dcf27f3d4490b7e51685629323f9ee2dfc2fb",
|
||||
"platform/internal/server/terminal_alerts_test.go": "cec76be6fea3bc37c3ad01c72c476e059140696af3fa4f735bc5b23329699c50",
|
||||
"platform/internal/server/terminal_metrics.go": "8c1c02d8085772b078cd91243a75099ddb592d8b655db8d96af8059b2075d03b",
|
||||
"platform/internal/server/terminal_metrics_test.go": "1d0ac4d73694104c9d9f3da9274b6e8c6e1f7f29609d51f1daa5d703e1eafbd0",
|
||||
"platform/internal/store/schema.sql": "a8ccab01ae90d9070cb793ab02be7509ce174a1660581cb25d7aa2c9e876d349",
|
||||
"platform/internal/store/store.go": "333bc9798f1a671c8376ae55ce80ca83a7305fc12116ef3ddc248d824742658f",
|
||||
"platform/cmd/api-gateway/main.go": "271660f003afff20b968938ba084b11f314126d90409def2d213f9587fdfb827",
|
||||
"console/e2e/administrators.spec.ts": "225b8e96781d2abd648b798b70d9443c80e2831473ca37a9b00066e4bf5cdd9b",
|
||||
"console/e2e/audits.spec.ts": "2fcc63e8534416e5f2a918cf7a5d4d1da78dae552ee631bb81de691587737485",
|
||||
"console/e2e/batch-operations.spec.ts": "76f6a04870aa335bdcd5e44cc65ba43ab961f776cb0e28daaeffcf3831415669",
|
||||
"console/e2e/catalog.spec.ts": "af2fa3783ac2b6de920af227c925650d2416c66194ff0de98e5c0fd1789224a4",
|
||||
"console/e2e/configuration.spec.ts": "0cd3e4fa5a3020fa19d251cdc1bd1a953f94e9b4a7ab406ed790532196d0d2f9",
|
||||
"console/e2e/console.spec.ts": "705de4025cab9525bafee455ed27cecb96550c887464f69a179795240d21dbc3",
|
||||
"console/e2e/gpus.spec.ts": "d7953d1d14fe22bb550ad754a4412cf172186fd770d7083438f55e73d953c91c",
|
||||
"console/e2e/lifecycle.spec.ts": "6374ab61a67fd0b51a132a1e4079f3e2dd351ce747dba8a6180f38fb611638ed",
|
||||
"console/e2e/live.spec.ts": "3af8b236e0ca7ebb3fb3a6a434372c71f53d4577f4b7cf30332e684b39d5a961",
|
||||
"console/e2e/operations.spec.ts": "eea905df578b1ea7f26a13c112748ed80816606487db450c8627a26a36ca73aa",
|
||||
"console/e2e/policies.spec.ts": "156b74f615e0817f368cb12607cbc56821956300eb6aac94ca404b8518bd0abc",
|
||||
"console/e2e/snapshots.spec.ts": "d16dae0fb17634105f4aeca103bb19af20c1bb5fb19f4719f625edf93663ac97",
|
||||
"console/e2e/terminal-alerts.spec.ts": "e5419fcff8c97917d7f013fe366a62b24379b3d1822bd16a99742af66982809e",
|
||||
"console/e2e/terminal-metrics.spec.ts": "02a24fa7aa0fadbdc712027d7ee06505d7a0f4ff570710b1da3cef012d0667cb",
|
||||
"console/e2e/ui.spec.ts": "dcc8ed295dce67f54036b6ae4843cc5cb28b9d3c00fd40e2daa377d971b7ecee",
|
||||
"console/public/mockServiceWorker.js": "26171599d94d5445297303f3a1f1cedec26835ea3d0057dcfa92ec520cb35cca",
|
||||
"console/src/App.vue": "51aa88af1efacc8189f3cb8e5d1491af4f40997466c8036a8933246dd443380d",
|
||||
"console/src/main.ts": "1954e1e7c6e278b800b1d687547039a888392402934311c0c0f3a83fccba41e5",
|
||||
"console/src/api/audit-labels.ts": "3a01ba5a9f105bbdba132a360ecc6ff6bd6e533dd87901fd6f671dcd962d6a75",
|
||||
"console/src/api/index.ts": "e9bfa7618c47d28e03a2baaa580db974a2294f276c1add55df8f10107a894610",
|
||||
"console/src/api/schema.d.ts": "5e745e0505eaaebbed4b3fb088b0bc52d43d96316c437ffe08f359c6b975b549",
|
||||
"console/src/assets/brand-mark.svg": "30ccb90d95e4fa305fad1a6045251f91d9a75efe97908de562c104d547792956",
|
||||
"console/src/assets/kylinsoft.png": "98397497b49338607a7a4e1c1db562ce6fd1cdc1a6f35cb1f5f3a0b524876086",
|
||||
"console/src/assets/ubuntu.svg": "b0aca674c881a07bb60b26afbcee07093ae419e29ee38e376f938817fa66ae03",
|
||||
"console/src/components/AdministratorAccounts.vue": "fa42b4a3877175385efdc7dad32c6500f93f4c50c70bc30d3f9999386349dfa1",
|
||||
"console/src/components/AuditHistory.vue": "36d4ceb12d5616e10f6672d28178eeb3397d1cc3a3f5515b0415f59284ce1273",
|
||||
"console/src/components/ChangePasswordDialog.vue": "af9708676717dbeee3284a0ed8d7a57d4c5b43ffde17889ef8509078f528b2d7",
|
||||
"console/src/components/CloneDesktopDialog.vue": "a098994d5285cbb9e9a718eb8182a7d4e1065e5c8029ed856d2923d5cef1a0af",
|
||||
"console/src/components/CsvImportDialog.vue": "91f2ced2ee35c5808122421acb4c1c0588a6ac37fa2777fd44e4830c4f98fc86",
|
||||
"console/src/components/DesktopBatchDialog.vue": "aaf9729b1d3c71b040689ce38486d084a37e64a64c672ca7d992cdb03900721b",
|
||||
"console/src/components/DesktopHardwareDialog.vue": "ce7a1689c8bc6b0959a3322969c7669a9af1e0a18a7b0af00c5bfc0bd6dd237d",
|
||||
"console/src/components/DesktopSnapshotsDialog.vue": "c005c73e6861ad6a68c3e91d8dc608cadc5d8459b8859c21c437264e572d48b6",
|
||||
"console/src/components/PveConnectionDialog.vue": "0a1df39a83dc88e4bb1816f23765aa40dc11b36be9d005c5ed9b1fdc15f4df7c",
|
||||
"console/src/components/ResourceTrend.vue": "6b9150b93658fc2508d25e434757a3e96d8e7ac21920c77b61e65bb077d30fd7",
|
||||
"console/src/components/SessionHistory.vue": "d67ae011dd6236e15646760952b8d53d9402ae4cb806217d79ecdb6fb644311d",
|
||||
"console/src/components/StatusTag.vue": "c1119aabc24c740ed45d7e8c6c1450f6ab9ceed67a4076667e1e8d1fbfe7712b",
|
||||
"console/src/components/SystemIcon.vue": "c2c1c81950305cafa40c8618ef2b8a0d00b629ad43f4113adc86e0ce486510e6",
|
||||
"console/src/components/TerminalMetrics.vue": "3cffab8fc3027579892fee34604e84f58691086a5d622c4043ad9004989a10da",
|
||||
"console/src/components/TerminalMetricTrend.vue": "643ed690201b3a2596fce822cc42dc2669c930af8ad6e5bab7a078ee199040a4",
|
||||
"console/src/components/ThemeToggle.vue": "20321bee998e83377e969ff3cb2004efc629b3fa6b72080282bfc9e98fc8bb25",
|
||||
"console/src/composables/useAction.ts": "2567143620249766e9940f1e63e263cca180332b0fcdd15fdd31ca9fa09815b8",
|
||||
"console/src/composables/useTheme.ts": "2de0fde65c75a8cf9ade9b2d93d162fa245e027507ea36d0046e5161292dd61e",
|
||||
"console/src/layouts/ConsoleLayout.vue": "4622c695cfac6298cd7aedc3d3f8b32a5c5deed58b48256e0572be57873a8db3",
|
||||
"console/src/mocks/browser.ts": "1b751209d7fbfcf39bb47376cd893ca42c71281e4ca39188aece1d768464d543",
|
||||
"console/src/mocks/handlers.ts": "46ebab4dbad545cd5799facb2647e10e3560e4054dbab11e2788d5cecc77aa18",
|
||||
"console/src/router/index.ts": "b9f806c59aa317c204c404a5a5f9385746daf4dbaef6991aa84ff9f01fc898d4",
|
||||
"console/src/stores/auth.test.ts": "26adb951ebfa12196fdebd586083f88b18c67fc648225d64233d49eac7f98633",
|
||||
"console/src/stores/auth.ts": "32d5ad0394ec136b167447b8a3d8be8cda7ba574e78f8f7b7f21d0f069ff0675",
|
||||
"console/src/stores/platform.ts": "cde4cd50b1c7a39a525651a601d07f8cd09740bc7dc0bbfe118e899fa41a90c2",
|
||||
"console/src/styles/tokens.css": "64c09a6c5b54c3fc8121a80cd29d79542a3926ee638235755f41f7599f3c8bbc",
|
||||
"console/src/views/Desktops.vue": "291b4acde5d476812bfac78c19f773c5707e6d3601a4c47ab68d6722f64c5c7a",
|
||||
"console/src/views/Forbidden.vue": "6391073f7b441e547f6918d27c8e628341e7be04b850644b9e0089280455b6be",
|
||||
"console/src/views/GPUs.vue": "e08261a1f7aa5ccf9422acff112f239c44f477b255847c03ca884ddcf462c716",
|
||||
"console/src/views/Login.vue": "e58aaa254cc0d9b9d578d8a7348aabb454ffb6646538b7f4073eafec500c06c0",
|
||||
"console/src/views/Monitor.vue": "f3cb6760f85c88a4faccac4ae35540ac2ad2be669cf50d4229223ffabc4dd63f",
|
||||
"console/src/views/NotFound.vue": "924455b640a9adb9f3c921b8bc5d4004f4d5915cecc503f0e0829db3d4497224",
|
||||
"console/src/views/Overview.vue": "bff2ea6496b70a44265b182cdfee95a0ceed3245613fe875685f2131673a0183",
|
||||
"console/src/views/Pools.vue": "04f0d8dc390c34a94da4dda5c25ce2b80e15966a96f8dec0b03de75327e07908",
|
||||
"console/src/views/Resources.vue": "e98f825f0c7f7f411cd97a0455faa4ca2dd05d98b793256f6eb71d3d7f7b837e",
|
||||
"console/src/views/Sessions.vue": "367555f4bb152907cac7b7f71231c81a95e887a1b6fb60cdf842c74a6282edef",
|
||||
"console/src/views/Settings.vue": "8841e5d9a667403bbb5a956cb1bd7b77ccaea388b879367e7432133efa96fa00",
|
||||
"console/src/views/Tasks.vue": "2ebae81b54544fe3f43edf6eefbf6a8b7099f508f576f1246dcf0cc22be86d51",
|
||||
"console/src/views/Templates.vue": "db39841af85c3a73d288c374065d38f0c3f1b1a6e2f3d46c927c53076ae29e59",
|
||||
"console/src/views/TerminalPolicies.vue": "f0b3b77b73749f02e265b0cbab4e0e4d28be1b18f139dc77e2950bb934a1acfb",
|
||||
"console/src/views/Terminals.vue": "8bcf6aad71ce73c3b83d9ee913ea6bd287c528676a8b00c1e6904d05d6296c4a",
|
||||
"console/src/views/Users.vue": "a2a9fda424660ce7e5865dc3bcbd902b5b86e7da07edc2b4ace22dd30a7959c6"
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"time": "2026-11-11T02:22:38.197918+00:00",
|
||||
"goFullSuite": "passed on isolated database; both workspace and GPU-excluded release",
|
||||
"goVet": "passed for release",
|
||||
"frontendLint": "passed",
|
||||
"frontendBuild": "passed",
|
||||
"frontendUnitTests": 3,
|
||||
"safeFixtureE2E": 65,
|
||||
"newAuditE2E": 4,
|
||||
"goAuditTests": 3,
|
||||
"dedicatedTestDatabase": "vdi_audit_test on temporary container vdi-audit-test-db",
|
||||
"liveDatabaseNeverTruncated": true,
|
||||
"limitsTested": {
|
||||
"queryBeyond1000": true,
|
||||
"export10000": true,
|
||||
"rejectExport10001": true,
|
||||
"csvFormulaInjection": true,
|
||||
"literalWildcards": true,
|
||||
"anonymous401": true,
|
||||
"threeRoles": true
|
||||
},
|
||||
"expectedBuildWarnings": [
|
||||
"Existing Vite chunk size warning"
|
||||
],
|
||||
"deployed": true,
|
||||
"realAPIAcceptance": "passed",
|
||||
"realBrowserAcceptance": "passed"
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
# 日志与诊断验收证据
|
||||
|
||||
日期:2026-11-11。真实服务:本机 5182。
|
||||
|
||||
| 文件 | 范围 |
|
||||
| --- | --- |
|
||||
| `live-verification.json` | 采集前真实设备/桌面查询、全分页与导出一致、三角色和未登录权限 |
|
||||
| `browser-verification.json` | 真实两版入口、查询/详情/筛选/下载、角色守卫及深浅窄屏 |
|
||||
| `state-verification.json` | 第一阶段只读验收及临时账号清理后,配置一致、任务仍为 63 |
|
||||
| `collection-verification.json` | 随后通过真实页面提交一次日志采集,设备成功回执、展示及下载 |
|
||||
| `collection-state-verification.json` | 采集后唯一新增任务与原配置一致性、ZIP 含实际日志 |
|
||||
| `deployment.json` / `manifest.json` | 备份、镜像、基线二进制校验及隔离发布文件 |
|
||||
| `live-*.png` | 真实页面,日志原文收起;较早的总览图中日志数为采集前的 0 |
|
||||
|
||||
各核验 JSON 的时间戳标明先后阶段:只读阶段没有提交业务命令,随后采集阶段新增一条 `collect-logs`,不是相互矛盾的任务计数。原始诊断 ZIP 仅保存在被忽略的 `.local/diagnostics-review/`,未将设备原始日志纳入公共证据。
|
||||
|
||||
隔离测试结果:后端 6 项专项、Go 全量/vet;前端检查、6 项单元测试、生产构建;诊断 9 项/版本 12 项/GPU 4 项共 25 项浏览器测试通过。浏览器原始结果位于 `.local/diagnostics-review/e2e-final/`,视觉复验位于 `e2e-visual/`;用例源代码见 `console/e2e/diagnostics.spec.ts`,后端见 `platform/internal/server/diagnostics_test.go`。
|
||||
|
||||
测试数据库使用 `127.0.0.1:55441` 一次性容器;不使用真实业务库。现场验收没有发电源、GPU、重启或重置会话命令。功能范围与未实现项见[实施说明](../../cloud-diagnostics-20261111.md)。
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"time": "2026-11-11T09:52:22.239Z",
|
||||
"realAPI": true,
|
||||
"defaultCommonNavigationEntries": 5,
|
||||
"advancedOperatorNavigationEntries": 14,
|
||||
"terminalAndDesktopDeepLinks": true,
|
||||
"actualPageTwoRead": true,
|
||||
"detailsExpanded": true,
|
||||
"actualZIPDownload": true,
|
||||
"filterChangesInvalidateOldResults": true,
|
||||
"viewerNavigationHiddenAndDeepLinkForbidden": true,
|
||||
"themes": [
|
||||
"dark",
|
||||
"light"
|
||||
],
|
||||
"viewportWidths": [
|
||||
1440,
|
||||
390
|
||||
],
|
||||
"scriptErrors": [],
|
||||
"failedAPIResponses": [],
|
||||
"blockedBusinessWrites": [],
|
||||
"terminalCommandsSubmitted": 0,
|
||||
"vmPowerActionsSubmitted": 0,
|
||||
"gpuSwitchesSubmitted": 0
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"time": "2026-11-11T10:00:00.705662+00:00",
|
||||
"temporaryDatabaseAndAnonymousVolumeRemoved": true,
|
||||
"temporaryVite5183Stopped": true,
|
||||
"temporaryAdministratorsAndSessionsRemoved": true,
|
||||
"privateAccountCredentialFilesRemoved": true,
|
||||
"sourceFilesMatchReleaseManifest": true
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"time": "2026-11-11T09:57:30.567493+00:00",
|
||||
"collectedZIPContainsDeviceReceipt": true,
|
||||
"logsInArchive": 1,
|
||||
"logTailCharacters": 11981,
|
||||
"knownConfiguredSecretsAbsent": true,
|
||||
"businessIdentityConfigurationAndBindingsStillUnchanged": true,
|
||||
"alertRulesStillUnchanged": true,
|
||||
"onlyAddedTaskIsSuccessfulLogCollection": true,
|
||||
"newTasks": [
|
||||
{
|
||||
"id": "task_f4e4f72e2303be996e6c8bf75303c01c",
|
||||
"kind": "terminal",
|
||||
"action": "collect-logs",
|
||||
"status": "success"
|
||||
}
|
||||
],
|
||||
"rawZIPKeptPrivate": true
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"time": "2026-11-11T09:56:38.177Z",
|
||||
"realTerminal": true,
|
||||
"submittedViaBrowser": true,
|
||||
"confirmedBeforeSubmission": true,
|
||||
"actualDeviceReceipt": "success",
|
||||
"taskId": "task_f4e4f72e2303be996e6c8bf75303c01c",
|
||||
"terminalAgentVersion": "qt-platform/0.4.0",
|
||||
"logSourceVisible": true,
|
||||
"deviceMetadataExpanded": true,
|
||||
"actualCollectedZIPDownload": true,
|
||||
"submittedCommands": [
|
||||
"collect-logs"
|
||||
],
|
||||
"commandCount": 1,
|
||||
"vmPowerActionsSubmitted": 0,
|
||||
"gpuSwitchesSubmitted": 0,
|
||||
"sessionResetCommandsSubmitted": 0,
|
||||
"scriptErrors": [],
|
||||
"failedAPIResponses": [],
|
||||
"blockedBusinessWrites": [],
|
||||
"beforeCounts": {
|
||||
"tasks": 63,
|
||||
"snapshots": 0
|
||||
},
|
||||
"afterCounts": {
|
||||
"tasks": 64,
|
||||
"snapshots": 0
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"deployedAt": "2026-11-11T09:48:30.313383+00:00",
|
||||
"backup": ".local\\live\\backups\\before-diagnostics-20261111-174813.dump",
|
||||
"backupBytes": 285675,
|
||||
"oldImageTag": "before-diagnostics-20261111-174813",
|
||||
"oldImages": {
|
||||
"api": "sha256:106f7df40c654b281650a0011e39c365e7b7e8c6a1fae56eea8b81a4e5d164ca",
|
||||
"console": "sha256:2859db73b4eb6531549ee67e288d1d84ffd9e68d7b8beaefc9000d1ec1911069"
|
||||
},
|
||||
"newImages": {
|
||||
"api": "sha256:00b12a4ba144776b53a33bcc39f8eddae9639f3cd711b38faf0c4327b93d40fb",
|
||||
"console": "sha256:7e54468e502d50b945fc8d9abb787bf10efb1233bdbb092366f70ccfebe818ec"
|
||||
},
|
||||
"baselineBinarySHA256": "d195f248d7393f35321f1b0d4d92cda4a14abcf73ea92a6bb0223ed6ff37a034",
|
||||
"databaseRestarted": false,
|
||||
"databaseSchemaChanged": false,
|
||||
"terminalFilesIncluded": false,
|
||||
"sourceBaseline": ".local/editions-review/release",
|
||||
"overlayManifest": ".local/diagnostics-review/manifest.json"
|
||||
}
|
||||
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 121 KiB |
|
After Width: | Height: | Size: 154 KiB |
|
After Width: | Height: | Size: 118 KiB |
@@ -0,0 +1,74 @@
|
||||
{
|
||||
"time": "2026-11-11T09:49:33.002253+00:00",
|
||||
"realDatabase": true,
|
||||
"realAPI": true,
|
||||
"targets": [
|
||||
{
|
||||
"kind": "terminal",
|
||||
"total": 352,
|
||||
"counts": {
|
||||
"alerts": 5,
|
||||
"audits": 55,
|
||||
"logs": 0,
|
||||
"sessions": 182,
|
||||
"tasks": 110
|
||||
},
|
||||
"archiveBytes": 15237,
|
||||
"allPagesEqualExport": true
|
||||
},
|
||||
{
|
||||
"kind": "desktop",
|
||||
"total": 182,
|
||||
"counts": {
|
||||
"alerts": 2,
|
||||
"audits": 30,
|
||||
"logs": 0,
|
||||
"sessions": 90,
|
||||
"tasks": 60
|
||||
},
|
||||
"archiveBytes": 8705,
|
||||
"allPagesEqualExport": true
|
||||
},
|
||||
{
|
||||
"kind": "desktop",
|
||||
"total": 65,
|
||||
"counts": {
|
||||
"alerts": 2,
|
||||
"audits": 10,
|
||||
"logs": 0,
|
||||
"sessions": 33,
|
||||
"tasks": 20
|
||||
},
|
||||
"archiveBytes": 4495,
|
||||
"allPagesEqualExport": true
|
||||
},
|
||||
{
|
||||
"kind": "desktop",
|
||||
"total": 106,
|
||||
"counts": {
|
||||
"alerts": 2,
|
||||
"audits": 15,
|
||||
"logs": 0,
|
||||
"sessions": 59,
|
||||
"tasks": 30
|
||||
},
|
||||
"archiveBytes": 5943,
|
||||
"allPagesEqualExport": true
|
||||
}
|
||||
],
|
||||
"roleChecks": {
|
||||
"super_admin": "read/export allowed",
|
||||
"operator": "read/export allowed",
|
||||
"viewer": "both 403",
|
||||
"anonymous": "both 401"
|
||||
},
|
||||
"databasePaginationAndSourceFilters": true,
|
||||
"zipCompleteTwoFilesAndAuditRecorded": true,
|
||||
"subjectAndDetailsWhitelisted": true,
|
||||
"knownConfiguredSecretsAbsent": true,
|
||||
"businessIdentityAndAuthorizationUnchangedBeforeTests": true,
|
||||
"vmPowerActionsSubmitted": 0,
|
||||
"gpuSwitchesSubmitted": 0,
|
||||
"terminalCommandsSubmitted": 0,
|
||||
"temporaryAccountsRemovedAfterBrowserCheck": true
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
[
|
||||
{
|
||||
"path": "tools/generate-platform-openapi.mjs",
|
||||
"sha256": "91f1ae26bf9ee4c87f884e61b53569dcbe31d72e087566b8da4731ffdae47190"
|
||||
},
|
||||
{
|
||||
"path": "platform/internal/server/admin.go",
|
||||
"sha256": "7028dca5236de2238ada6c27fca34f66228e5588d215acee0253186b0c5767e2"
|
||||
},
|
||||
{
|
||||
"path": "platform/internal/server/server.go",
|
||||
"sha256": "9e4c9c487f154c018f31ed1f266703de017767d071ac9de93bad9ff1cef40d42"
|
||||
},
|
||||
{
|
||||
"path": "docs/openapi/platform.v1.json",
|
||||
"sha256": "4da7ace4959419d05a8cf60f821da64af5f60b31e53c81eb5a8f2c84dd2b7d12"
|
||||
},
|
||||
{
|
||||
"path": "console/src/api/audit-labels.ts",
|
||||
"sha256": "632f6895d6fb4f1b93e8bd2f0cce88ae0565a98cca0e860fdd192aa8f7fc9f4b"
|
||||
},
|
||||
{
|
||||
"path": "console/src/api/index.ts",
|
||||
"sha256": "59e8195ab5f00ef1cc2dc932527766f482063e11800ab49b010ea987ddd01b4a"
|
||||
},
|
||||
{
|
||||
"path": "console/src/api/schema.d.ts",
|
||||
"sha256": "c532951545d9259e738e198deb237c67a225e3201ce0124951829e1166be1f9e"
|
||||
},
|
||||
{
|
||||
"path": "console/src/components/TaskHistory.vue",
|
||||
"sha256": "fd3ed85e0c319816731609afad4b8d79aea9e08658ffb57b0b58de37402b7348"
|
||||
},
|
||||
{
|
||||
"path": "console/src/layouts/ConsoleLayout.vue",
|
||||
"sha256": "98dab479e76de2fd288cc70da642dd1f7916e061e09270084ef05e9859b2f14e"
|
||||
},
|
||||
{
|
||||
"path": "console/src/router/index.ts",
|
||||
"sha256": "25b0229cc0ebbf5d86fa61014c2b6f3afb510edd16384b4e0cb283e654f04ba2"
|
||||
},
|
||||
{
|
||||
"path": "console/src/views/Desktops.vue",
|
||||
"sha256": "dc20e3589a2bcb31d910c0c794758ddb172ba10a21d1579a69564ce18fca0c4e"
|
||||
},
|
||||
{
|
||||
"path": "console/src/views/Settings.vue",
|
||||
"sha256": "935456d69378c23ffb7ccbda06d231bec819ea6e4a7f330bade57682c9cb3019"
|
||||
},
|
||||
{
|
||||
"path": "console/src/views/Terminals.vue",
|
||||
"sha256": "596c2ae31d57a34d41e273dcfb4efa6d84b4c1564d761315656a63bac9bfe499"
|
||||
},
|
||||
{
|
||||
"path": "platform/internal/server/diagnostics.go",
|
||||
"sha256": "c87778e8901670d096fda36ecae629fbe75ce0f4e3456004a880d2cd66aaeae7"
|
||||
},
|
||||
{
|
||||
"path": "platform/internal/server/diagnostics_test.go",
|
||||
"sha256": "c477fc4b8efe5a003b75a6cfc7576f3ccc8162407750c43fefa96e104b2ba11a"
|
||||
},
|
||||
{
|
||||
"path": "console/src/views/Diagnostics.vue",
|
||||
"sha256": "272481cd97c5fe4378937a40f21eb06ff473bf882aea92db78dd345bcc36785a"
|
||||
},
|
||||
{
|
||||
"path": "console/e2e/diagnostics.spec.ts",
|
||||
"sha256": "1f603315ae0440f52976af34e8b5e183b165a57e98262855917fc54c42945f9c"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"time": "2026-11-11T09:54:41.570631+00:00",
|
||||
"existingAdministratorPasswordsRolesAndStatesUnchanged": true,
|
||||
"existingUsersBindingsDesktopConnectionAndDeviceIdentityUnchanged": true,
|
||||
"alertRulesUnchanged": true,
|
||||
"temporaryAdministratorsAndSessionsRemoved": true,
|
||||
"databaseFsync": "on",
|
||||
"beforeCounts": {
|
||||
"tasks": 63,
|
||||
"snapshots": 0
|
||||
},
|
||||
"afterCounts": {
|
||||
"tasks": 63,
|
||||
"snapshots": 0
|
||||
},
|
||||
"noBusinessTasksSubmitted": true,
|
||||
"deployedImagesStillMatchRelease": true,
|
||||
"databaseNotRestarted": true
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"time": "2026-11-11T09:13:10.454Z",
|
||||
"realAPI": true,
|
||||
"defaultCommon": true,
|
||||
"commonNavigationEntries": 5,
|
||||
"advancedNavigationEntries": 13,
|
||||
"perAccountModeRemembered": true,
|
||||
"actualUICreateEmployee": true,
|
||||
"actualUIPreviewHasNoWrite": true,
|
||||
"actualUIAdditiveGrant": true,
|
||||
"actualUISelectiveRevoke": true,
|
||||
"authorizationAuditVerified": true,
|
||||
"temporaryUserRemoved": true,
|
||||
"themes": [
|
||||
"dark",
|
||||
"light"
|
||||
],
|
||||
"viewportWidths": [
|
||||
1440,
|
||||
390
|
||||
],
|
||||
"scriptErrors": [],
|
||||
"failedAPIResponses": [],
|
||||
"blockedBusinessWrites": [],
|
||||
"vmPowerActionsSubmitted": 0,
|
||||
"gpuSwitchesSubmitted": 0,
|
||||
"terminalCommandsSubmitted": 0
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"time": "2026-11-11T09:18:05.152Z",
|
||||
"realAPI": true,
|
||||
"summaryUsesActualRunningState": true,
|
||||
"commonPagesReadOnlyVerified": 5,
|
||||
"professionalTasksReadOnlyVerified": true,
|
||||
"viewportWidths": [
|
||||
1440,
|
||||
390
|
||||
],
|
||||
"themes": [
|
||||
"dark",
|
||||
"light"
|
||||
],
|
||||
"scriptErrors": [],
|
||||
"failedAPIResponses": [],
|
||||
"businessWrites": []
|
||||
}
|
||||
|
After Width: | Height: | Size: 137 KiB |
|
After Width: | Height: | Size: 81 KiB |
|
After Width: | Height: | Size: 84 KiB |
|
After Width: | Height: | Size: 57 KiB |
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"businessIdentityAndConfigurationUnchanged": true,
|
||||
"alertRulesUnchanged": true,
|
||||
"liveDatabaseFsync": "on",
|
||||
"apiImageUnchanged": true,
|
||||
"temporaryUsersRemaining": 0
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"time": "2026-11-11T07:55:38.379Z",
|
||||
"realAPI": true,
|
||||
"temporaryViewerAccount": true,
|
||||
"actualUIEnrollmentAndConfirmation": true,
|
||||
"recoveryDownloaded": true,
|
||||
"actualUILoginChallengeAndRecoveryLogin": true,
|
||||
"actualUIDisable": true,
|
||||
"themes": [
|
||||
"dark",
|
||||
"light"
|
||||
],
|
||||
"viewportWidths": [
|
||||
1440,
|
||||
390
|
||||
],
|
||||
"scriptErrors": [],
|
||||
"failedResponses": [],
|
||||
"blockedWrites": [],
|
||||
"screenshots": 3,
|
||||
"screenshotsContainNoActiveSecrets": true
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"time": "2026-11-11T07:48:31.875276+00:00",
|
||||
"backup": ".local/live/backups/before-mfa-20261111-154828.dump",
|
||||
"backupBytes": 265458,
|
||||
"oldImageTag": "before-mfa-20261111-154828",
|
||||
"oldImages": {
|
||||
"api": "sha256:4bc0609343b3c9382c859444579c0246bc12bb6ff787c2d0fb784ec7942db3b7",
|
||||
"console": "sha256:52c38fa17705374202f557edd959271e0fae1c88d9f104a356b266dbd54b5e83"
|
||||
},
|
||||
"deployedAt": "2026-11-11T07:52:43.214467+00:00",
|
||||
"baselineBinarySHA256": "ac04d8f5423b07aa2afa442013a4ddeaee55bbf0343a0876c50a8e829c6a4779",
|
||||
"baselineMatchesLiveBinary": true,
|
||||
"existingGPUConfigurationPreserved": true,
|
||||
"activeJobsBeforeDeployment": 0,
|
||||
"newImages": {
|
||||
"api": "sha256:106f7df40c654b281650a0011e39c365e7b7e8c6a1fae56eea8b81a4e5d164ca",
|
||||
"console": "sha256:458f32152b048eb53d9841119a9fc99854c7394a9e35b988add3eb5c8915aba4"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"time": "2026-11-11T08:00:18.903056+00:00",
|
||||
"deployedImagesMatchTestedRelease": true,
|
||||
"originalBusinessIdentityAndAuthorizationSnapshotUnchanged": true,
|
||||
"temporaryAccountsRemaining": 0,
|
||||
"MFARowsRemainingAfterTemporaryTests": 0,
|
||||
"rootMFAEnabled": false,
|
||||
"terminalOnline": true,
|
||||
"livePostgreSQLFsync": "on"
|
||||
}
|
||||
|
After Width: | Height: | Size: 144 KiB |
|
After Width: | Height: | Size: 93 KiB |
|
After Width: | Height: | Size: 354 KiB |
@@ -0,0 +1,78 @@
|
||||
{
|
||||
"time": "2026-11-11T07:55:02.694317+00:00",
|
||||
"realDatabase": true,
|
||||
"temporaryViewerFullMFALifecycle": true,
|
||||
"passwordAloneRejected": true,
|
||||
"authenticatorLoginPassed": true,
|
||||
"TOTPReplayRejected": true,
|
||||
"recoveryLoginPassed": true,
|
||||
"recoveryReplayRejected": true,
|
||||
"rotationInvalidatedOldCodesAndOtherSessions": true,
|
||||
"disableRestoredPasswordLogin": true,
|
||||
"auditsHideSecrets": true,
|
||||
"temporaryAccountCleaned": true,
|
||||
"existingAccountsDeviceIdentityBindingsUnchanged": true,
|
||||
"alertRulesUnchanged": true,
|
||||
"vmConfigUnchanged": true,
|
||||
"vmPowerStatesUnchanged": false,
|
||||
"beforeVMs": [
|
||||
{
|
||||
"id": "desk_29cf3c79d9fc1b4a25e1bfe55c5c943f",
|
||||
"vmid": 102,
|
||||
"digest": "2fbb5c2e41737a6a640b0733c1ac5d20551c771a",
|
||||
"powerState": "stopped"
|
||||
},
|
||||
{
|
||||
"id": "desk_38010c040399376117ea116029767c25",
|
||||
"vmid": 100,
|
||||
"digest": "e83a4e40c5c927dc016e5f6d76b9081a420baef4",
|
||||
"powerState": "stopped"
|
||||
},
|
||||
{
|
||||
"id": "desk_bbec6e55af36b91f042f66df80902007",
|
||||
"vmid": 101,
|
||||
"digest": "5a71f3c510bf41641380dc9697bd1190f8847c31",
|
||||
"powerState": "running"
|
||||
}
|
||||
],
|
||||
"afterVMs": [
|
||||
{
|
||||
"id": "desk_29cf3c79d9fc1b4a25e1bfe55c5c943f",
|
||||
"vmid": 102,
|
||||
"digest": "2fbb5c2e41737a6a640b0733c1ac5d20551c771a",
|
||||
"powerState": "stopped"
|
||||
},
|
||||
{
|
||||
"id": "desk_38010c040399376117ea116029767c25",
|
||||
"vmid": 100,
|
||||
"digest": "e83a4e40c5c927dc016e5f6d76b9081a420baef4",
|
||||
"powerState": "running"
|
||||
},
|
||||
{
|
||||
"id": "desk_bbec6e55af36b91f042f66df80902007",
|
||||
"vmid": 101,
|
||||
"digest": "5a71f3c510bf41641380dc9697bd1190f8847c31",
|
||||
"powerState": "stopped"
|
||||
}
|
||||
],
|
||||
"beforeTaskCounts": {
|
||||
"tasks": 61,
|
||||
"snapshots": 0
|
||||
},
|
||||
"afterTaskCounts": {
|
||||
"tasks": 62,
|
||||
"snapshots": 0
|
||||
},
|
||||
"onlyConcurrentDevicePreparationTasksAdded": true,
|
||||
"concurrentDeviceTasks": [
|
||||
{
|
||||
"id": "task_56e8d83030b6231eb805636061fc887e",
|
||||
"kind": "gpu-prepare",
|
||||
"action": "prepare-desktop",
|
||||
"actor": "device:term_8f55853c7c3b1454018c4b9e20f3fa49",
|
||||
"status": "success",
|
||||
"created_at": "2026-11-11T07:51:04.237141+00:00"
|
||||
}
|
||||
],
|
||||
"existingAccountsMFADefaultUnchanged": true
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"goFullSuite": "passed",
|
||||
"goVet": "passed",
|
||||
"mfaAndLoginLimitTargeted": "passed",
|
||||
"superAdminRestartAndPasswordChange": "passed",
|
||||
"frontendLint": "passed",
|
||||
"frontendTypecheck": "passed",
|
||||
"frontendUnitTests": 3,
|
||||
"productionDockerBuilds": "passed",
|
||||
"newMFABrowserTests": 6,
|
||||
"existingAccountSessionAndUIBrowserTests": 12,
|
||||
"liveAPILifecycle": "passed",
|
||||
"realBrowserLifecycle": "passed",
|
||||
"testDatabase": "isolated disposable PostgreSQL, fsync disabled during testing",
|
||||
"liveVMWritesFromThisWork": 0,
|
||||
"liveTerminalCommandsFromThisWork": 0,
|
||||
"concurrentDeviceVMPreparationObserved": true
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"time": "2026-11-11T07:02:20.102Z",
|
||||
"realAPI": true,
|
||||
"themes": [
|
||||
"dark",
|
||||
"light"
|
||||
],
|
||||
"viewportWidths": [
|
||||
1440,
|
||||
390
|
||||
],
|
||||
"downloaded": true,
|
||||
"details": true,
|
||||
"scriptErrors": [],
|
||||
"failedResponses": [],
|
||||
"blockedWrites": [],
|
||||
"screenshots": 4
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"time": "2026-11-11T06:55:25.820094+00:00",
|
||||
"backup": ".local/live/backups/before-task-history-20261111-145521.dump",
|
||||
"backupBytes": 253717,
|
||||
"oldImageTag": "before-task-history-20261111-145521",
|
||||
"oldImages": {
|
||||
"api": "sha256:d91b71e4c202737a1866bfbd1e9dec646b4e385b243fa99888951165637f66c1",
|
||||
"console": "sha256:b4d15d6fa16c3576ca2beba1132369917554dcc3978e8609547a46483cf0324d"
|
||||
},
|
||||
"deployedAt": "2026-11-11T07:01:41.250632+00:00",
|
||||
"baselineBinarySHA256": "913056171c513393c24d15abfabcd7efd142a0d0bef3db6ae934f7ffa2cd8a8a",
|
||||
"baselineMatchesLiveBinary": true,
|
||||
"existingGPUConfigurationPreserved": true,
|
||||
"activeJobsBeforeDeployment": 0,
|
||||
"newImages": {
|
||||
"api": "sha256:92138b1111fab09270b192ce465ba66fa98393158bace1a359a7553f92dda046",
|
||||
"console": "sha256:828b045abf8c6eca17592a1bfbd2b62f8e50b723f4dbd6439d7f3ebfbccc3fd7"
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 99 KiB |
|
After Width: | Height: | Size: 346 KiB |
|
After Width: | Height: | Size: 350 KiB |
|
After Width: | Height: | Size: 135 KiB |
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"time": "2026-11-11T07:02:14.355093+00:00",
|
||||
"mode": "production",
|
||||
"realDatabase": true,
|
||||
"matchingRecords": 51,
|
||||
"pageSize": 2,
|
||||
"pages": 26,
|
||||
"csvRows": 51,
|
||||
"csvMatchesAllPages": true,
|
||||
"combinedFiltersAndActiveQueryPassed": true,
|
||||
"exportAudited": true,
|
||||
"authenticationEnforced": true,
|
||||
"invalidFiltersRejected": true,
|
||||
"administratorsUsersBindingsDeviceIdentityUnchanged": true,
|
||||
"alertRulesUnchanged": true,
|
||||
"vmConfigAndPowerUnchanged": true,
|
||||
"vmPowerStates": [
|
||||
"stopped",
|
||||
"running",
|
||||
"stopped"
|
||||
],
|
||||
"businessTaskAndSnapshotCountsUnchanged": true,
|
||||
"taskCount": 51
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"time": "2026-11-11T01:42:40.100Z",
|
||||
"themes": [
|
||||
"dark",
|
||||
"light"
|
||||
],
|
||||
"viewportWidths": [
|
||||
1440,
|
||||
390
|
||||
],
|
||||
"scriptErrors": [],
|
||||
"failedResponses": [],
|
||||
"blockedWrites": [],
|
||||
"source": "real terminal temperature with temporary 1C threshold and 60s hold; no physical overheating implied",
|
||||
"finalRuleDisabled": true,
|
||||
"finalEventResolvedByRuleChange": true,
|
||||
"celsiusUnits": true,
|
||||
"temperatureMaximum": 150,
|
||||
"screenshots": 6
|
||||
}
|
||||
|
After Width: | Height: | Size: 130 KiB |
|
After Width: | Height: | Size: 133 KiB |
|
After Width: | Height: | Size: 83 KiB |
|
After Width: | Height: | Size: 144 KiB |
|
After Width: | Height: | Size: 149 KiB |
|
After Width: | Height: | Size: 74 KiB |
@@ -0,0 +1,146 @@
|
||||
{
|
||||
"time": "2026-11-11T01:42:43.541798+00:00",
|
||||
"source": "real SoC temperature; temporarily lowered threshold 1C for validation, without heating/stressing the device",
|
||||
"holdSeconds": 60,
|
||||
"activatedAt": "2026-11-11 01:37:24.979235+00",
|
||||
"observedDurationSeconds": 102.073948,
|
||||
"sourceSamples": [
|
||||
{
|
||||
"sampled_at": "2026-11-11T01:37:26.316973+00:00",
|
||||
"soc_temperature_c": 48.954
|
||||
},
|
||||
{
|
||||
"sampled_at": "2026-11-11T01:37:56.312707+00:00",
|
||||
"soc_temperature_c": 48.954
|
||||
},
|
||||
{
|
||||
"sampled_at": "2026-11-11T01:38:26.31113+00:00",
|
||||
"soc_temperature_c": 49.579
|
||||
},
|
||||
{
|
||||
"sampled_at": "2026-11-11T01:38:56.30759+00:00",
|
||||
"soc_temperature_c": 50.204
|
||||
}
|
||||
],
|
||||
"firingEvent": {
|
||||
"id": "alert_b20dcebcb3a28f413872433638e59087",
|
||||
"ruleId": "rule_aaf4b97ba280dfd5d043deddee55dda8",
|
||||
"ruleName": "终端温度链路验收",
|
||||
"metric": "terminal_temperature",
|
||||
"targetId": "term_8f55853c7c3b1454018c4b9e20f3fa49",
|
||||
"targetName": "RK3528 联调终端",
|
||||
"value": 50.829,
|
||||
"threshold": 1,
|
||||
"status": "firing",
|
||||
"startedAt": "2026-11-11T01:37:26.316973Z",
|
||||
"openedAt": "2026-11-11T01:39:08.390921Z",
|
||||
"resolvedAt": null,
|
||||
"resolveReason": "",
|
||||
"acknowledgedAt": null,
|
||||
"acknowledgedBy": "",
|
||||
"dataFresh": true
|
||||
},
|
||||
"acknowledgedEvent": {
|
||||
"id": "alert_b20dcebcb3a28f413872433638e59087",
|
||||
"ruleId": "rule_aaf4b97ba280dfd5d043deddee55dda8",
|
||||
"ruleName": "终端温度链路验收",
|
||||
"metric": "terminal_temperature",
|
||||
"targetId": "term_8f55853c7c3b1454018c4b9e20f3fa49",
|
||||
"targetName": "RK3528 联调终端",
|
||||
"value": 50.829,
|
||||
"threshold": 1,
|
||||
"status": "firing",
|
||||
"startedAt": "2026-11-11T01:37:26.316973Z",
|
||||
"openedAt": "2026-11-11T01:39:08.390921Z",
|
||||
"resolvedAt": null,
|
||||
"resolveReason": "",
|
||||
"acknowledgedAt": "2026-11-11T01:40:08.101518Z",
|
||||
"acknowledgedBy": "root",
|
||||
"dataFresh": true
|
||||
},
|
||||
"finalEvent": {
|
||||
"id": "alert_b20dcebcb3a28f413872433638e59087",
|
||||
"ruleId": "rule_aaf4b97ba280dfd5d043deddee55dda8",
|
||||
"ruleName": "终端温度链路验收",
|
||||
"metric": "terminal_temperature",
|
||||
"targetId": "term_8f55853c7c3b1454018c4b9e20f3fa49",
|
||||
"targetName": "RK3528 联调终端",
|
||||
"value": 52.704,
|
||||
"threshold": 1,
|
||||
"status": "resolved",
|
||||
"startedAt": "2026-11-11T01:37:26.316973Z",
|
||||
"openedAt": "2026-11-11T01:39:08.390921Z",
|
||||
"resolvedAt": "2026-11-11T01:41:18.276284Z",
|
||||
"resolveReason": "rule_changed",
|
||||
"acknowledgedAt": "2026-11-11T01:40:08.101518Z",
|
||||
"acknowledgedBy": "root",
|
||||
"dataFresh": true
|
||||
},
|
||||
"finalRule": {
|
||||
"id": "rule_aaf4b97ba280dfd5d043deddee55dda8",
|
||||
"name": "终端 SoC 温度",
|
||||
"metric": "terminal_temperature",
|
||||
"threshold": 80,
|
||||
"hold_seconds": 120,
|
||||
"enabled": false
|
||||
},
|
||||
"latestTerminalMetrics": {
|
||||
"cpuPercent": 45.50165281872599,
|
||||
"memoryPercent": 16.847853703299627,
|
||||
"socTemperatureC": 61.592,
|
||||
"uptimeSeconds": 87935,
|
||||
"sampledAt": "2026-11-11T01:42:26.324146Z",
|
||||
"supported": true,
|
||||
"online": true,
|
||||
"fresh": true
|
||||
},
|
||||
"originalRulesUnchanged": true,
|
||||
"businessSnapshotUnchanged": true,
|
||||
"vmConfigurationDigestsUnchanged": true,
|
||||
"vmPowerStatesPreserved": [
|
||||
{
|
||||
"vmid": 102,
|
||||
"powerState": "running",
|
||||
"configurationDigestUnchanged": true
|
||||
},
|
||||
{
|
||||
"vmid": 100,
|
||||
"powerState": "stopped",
|
||||
"configurationDigestUnchanged": true
|
||||
},
|
||||
{
|
||||
"vmid": 101,
|
||||
"powerState": "stopped",
|
||||
"configurationDigestUnchanged": true
|
||||
}
|
||||
],
|
||||
"taskCountsBefore": {
|
||||
"tasks": 7,
|
||||
"snapshots": 0
|
||||
},
|
||||
"taskCountsAfter": {
|
||||
"tasks": 8,
|
||||
"snapshots": 0
|
||||
},
|
||||
"concurrentTaskNote": "One resource sync task was added by separate activity during validation; preserved, no terminal/desktop task was submitted by this work",
|
||||
"terminalUpdated": false,
|
||||
"powerWrites": 0,
|
||||
"snapshotWrites": 0,
|
||||
"diskWrites": 0,
|
||||
"gpuWrites": 0,
|
||||
"physicalCoolingRecoveryTested": false,
|
||||
"images": {
|
||||
"api": "sha256:040ca70d5ecf42a0db2c43d089bc3e1da85d98730a2eb22cfb043babe94fc2d4",
|
||||
"console": "sha256:919d26c7ee5e0292fb22d1fcbb7b6144a6eb110cce6271351cc5bdc2a80d1034"
|
||||
},
|
||||
"deployment": {
|
||||
"time": "2026-11-11T01:25:32.594530+00:00",
|
||||
"backup": ".local/live/backups/before-terminal-alerts-20261111-092529.dump",
|
||||
"backupBytes": 195633,
|
||||
"oldImageTag": "before-terminal-alerts-20261111-092529",
|
||||
"oldImages": {
|
||||
"api": "sha256:525a99894a7e1efade08087082e356888192a452b90e537fb6a278c59b1e62fe",
|
||||
"console": "sha256:17af96c4ba2ff10b9ea4c1380179d54e1e325edf5fda7d63225aca1d5e37e78e"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 105 KiB |
|
After Width: | Height: | Size: 71 KiB |
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"time": "2026-11-11T01:43:21.093936+00:00",
|
||||
"goAll": "passed",
|
||||
"goVet": "passed",
|
||||
"legacySchemaRepeatUpgrade": "passed",
|
||||
"frontendLint": "passed",
|
||||
"frontendTypecheck": "passed",
|
||||
"frontendUnitTests": 3,
|
||||
"frontendProductionBuild": "passed locally and in Docker",
|
||||
"browserFixtureTests": 61,
|
||||
"newFixtureCases": 4,
|
||||
"newBackendTests": 5,
|
||||
"liveDatabaseUsedForTests": false,
|
||||
"terminalAgentUpdated": false,
|
||||
"liveEvidence": "live-verification.json",
|
||||
"browserEvidence": "browser-verification.json",
|
||||
"limitations": [
|
||||
"No external notifications",
|
||||
"No physical overheating or cooling test; temporarily lowered threshold for real source validation",
|
||||
"Fresh samples prove sampled continuity, not all moments between samples",
|
||||
"One unrelated resource sync task was preserved during validation"
|
||||
],
|
||||
"temporaryDatabaseRemoved": true,
|
||||
"temporaryViteStopped": true,
|
||||
"finalDeploymentVerified": true
|
||||
}
|
||||
@@ -0,0 +1,250 @@
|
||||
# Ubuntu、麒麟 GPU 链路优化实施记录
|
||||
|
||||
实施日期:2026-11-11。依据桌面上的《麒麟与Ubuntu云桌面画质帧率及延迟对齐说明_20261110.docx》,以及用户补充的“允许三桌面轮流使用同一块 GPU”。原 Word 文档保留为实施前说明。
|
||||
|
||||
## 已实施的链路
|
||||
|
||||
宿主为 i7-4720HQ,4 个物理核、8 个逻辑线程,约 23.35 GiB 内存。GTX 965M 2 GiB 是本轮三桌面轮流使用的设备。HD 4600 没有可用 mdev,不按共享 vGPU 处理。Ubuntu、麒麟各配置 8 vCPU、8 GiB;8 vCPU 不等于新增 8 个物理核。
|
||||
|
||||
| 项目 | Ubuntu VM102 | 麒麟 VM101 |
|
||||
| --- | --- | --- |
|
||||
| 会话 | GNOME Xorg、test2 自动登录 | UKUI / ukui-kwin_x11、test1 自动登录 |
|
||||
| 渲染 | GTX 965M,glxinfo 与进程显存使用均已核实 | GTX 965M,glxinfo 与进程显存使用均已核实 |
|
||||
| 驱动 | Ubuntu 官方 580.178.04 | 麒麟官方 580.95.05 |
|
||||
| 实际捕获/编码 | NvFBC / CUDA / h264_nvenc | NvFBC / CUDA / h264_nvenc |
|
||||
| 显示路径 | NVIDIA 渲染,modesetting PRIME 输出;虚拟源屏测试提高至约 119.9 Hz | NVIDIA 固定 2560×1440 整屏,无 RandR 物理输出 |
|
||||
| 串流交付档位 | 2560×1440、45 FPS、25 Mbps、H.264 SDR | 2560×1440、45 FPS、25 Mbps、H.264 SDR |
|
||||
| 光标 | 保留系统原生形状、本地移动和租约协议 | 保留系统原生形状、本地移动和租约协议 |
|
||||
|
||||
Sunshine 固定为 v2025.924.154138。当前 2026 构建在 Maxwell 上实际出现 CUDA kernel 不兼容,不能仅因为版本更新就替换。私有程序位于 `/opt/vdi-sunshine-maxwell/`,用户服务为 `vdi-sunshine.service`。旧的软件编码绑核已清除;未将整个 Sunshine 改为 SCHED_FIFO,也未把关闭提示音、窗口居中当作视频优化。
|
||||
|
||||
Ubuntu 尝试无 RandR 输出的 NVIDIA 整屏路径时,GNOME 实际黑屏,已回退到可用 PRIME 输出;它仍含显示复制,不能称全程零拷贝。麒麟旧内核的 PRIME 显存导入失败,改用驱动实际报告的整屏 NvFBC 捕获。适配器只在真实屏幕为 2K、驱动可采集且没有输出时枚举整屏,不伪造物理显示器或硬件支持。麒麟重启后桌面曾自动改大屏幕,已通过 ServerFlags 禁用自动添加/绑定其他 GPU,并固定 X screen。
|
||||
|
||||
麒麟 glibc 2.31 与该官方 Sunshine 构建不兼容,因此程序使用私有 runtime 的加载器和依赖库,未替换系统 glibc。初始依赖经 Ubuntu APT 签名仓库核对;补充的 libwayland-client、libffi8、libva 来自 Ubuntu 官方 HTTPS 仓库并记录下载散列,但本轮未额外完成它们的 APT 签名索引校验。KYSEC 保持开启,仅对本轮文件进行 verified 认证。
|
||||
|
||||
## 操作方式与隔离
|
||||
|
||||
平台设置 `VDI_EXCLUSIVE_GPU_NODE=starhe`、`VDI_EXCLUSIVE_GPU_VMIDS=100,101,102`。盒子退出串流后,选择下一台即可正常关闭上一台、等待 PVE 原任务和实际 stopped 状态、启动目标,再等待 Sunshine 响应。不会为了快速切换强制断电。**退出串流并不立即关闭虚拟机;选择另一台时才正常关闭上一台,因此切换前须保存当前桌面的工作。**
|
||||
|
||||
准备任务需要该终端已有桌面授权。共享组锁、持久任务预约、会话占用检查阻止相互抢占;票据签发和消费再次查实际 PVE 电源状态,不能依赖旧缓存。正在使用或管理任务未完成时拒绝切换。已知 PVE 操作结果不明时保留占用,管理员仅核对原 UPID,不自动重复提交。终端不接收 PVE root 凭据。
|
||||
|
||||
准备接口:`POST /api/v1/terminal/desktop-prepare`、`GET /api/v1/terminal/desktop-prepare/:id`。已知任务核对:管理员 `POST /api/v1/tasks/:id/gpu-reconcile`。未知 UPID 须人工核对 PVE 与任务记录,不能凭“现在看起来已开机”重发电源操作。管理端对共用组的普通 start/reboot 入口拒绝执行,须从终端选择页准备;正常 shutdown 及规格、快照操作受同一组预约约束。
|
||||
|
||||
Ubuntu 为唯一 onboot=1 的桌面,Windows 与麒麟 onboot=0,避免宿主启动时争用显卡。该模式是整卡轮流直通,不是三会话同时使用。将来迁移算力服务器仍需提供真正可并发的 GPU/编码会话容量,不能只提高显卡算力或显存就默认支持多 VM 共享。
|
||||
|
||||
客户端新增受范围校验的 `VDI_MOONLIGHT_BITRATE_KBPS`;盒子 `~/.config/vdi-terminal/render.conf` 的 `bitrate_kbps=25000` 由启动脚本按允许字段读取,不执行配置内容。缺少配置时继续使用原分辨率对应默认码率;本轮最终实际命令行已核实 25000。25 Mbps 是客户端请求档位,不等于持续视频净码率;Ubuntu 本轮 Sunshine 记录的视频编码预算为 18,988,000 bit/s,不能将二者混同,也不能用启动探测时的 1 Mbps 当作实际串流档位。
|
||||
|
||||
## 测量口径
|
||||
|
||||
拖框使用同几何和逐帧序号的 GTK / WinForms 参考窗口;盒子通过 XTest 注入,XGetImage 观察首次解码回显。一次拖框发送 300 次移动并检查松键。读取画面本身会阻塞发送循环,不能称真正恒定 60 Hz,也不能把“观察到的新画面次数”当作 Moonlight 呈现 FPS。
|
||||
|
||||
悬停、点击、掩码输入各 100 次,实际控件触发后更新唯一标记。点击计时从按下开始,包含人为 40 ms 按住时间;`click_release` 字段不能误读为从松键起算。输入为合成字符,无真实密码;提交页没有后台认证,所以不代表真实网站登录耗时。结果不包含 USB、真实面板扫描和人眼感知,不能作为物理零延迟证明。
|
||||
|
||||
### 早期与中间结果(30 Mbps,非最终验收)
|
||||
|
||||
| 配置 / 证据 | 拖框 P50 | P95 | 说明 |
|
||||
| --- | ---: | ---: | --- |
|
||||
| Ubuntu GPU、60 FPS | 124.14 ms | 157.50 ms | `ubuntu-gpu-60-drag.json` |
|
||||
| Ubuntu GPU、45 FPS、源屏约 60 Hz | 126.60 ms | 159.28 ms | `ubuntu-gpu-45-drag.json` |
|
||||
| Ubuntu GPU、45 FPS、源屏约 120 Hz | 97.59 ms | 128.94 ms | `ubuntu-gpu-source120-drag.json`;源屏提高频率,传输仍 45 FPS |
|
||||
| 麒麟 GPU、60 FPS | 83.26 ms | 106.79 ms | `kylin-gpu-60-drag.json` |
|
||||
| 麒麟 GPU、45 FPS | 81.22 ms | 101.44 ms | `kylin-gpu-45-drag.json` |
|
||||
| Windows 旧参考 | 125.64 ms | 160.10 ms | `windows-baseline-drag.json`;测量时另一 VM 在驱动编译,不能用于宣称追平 |
|
||||
|
||||
`kylin-gpu-45-response.json` 的悬停 / 点击 / 掩码输入 P50 分别为 97.36 / 140.17 / 78.58 ms,P95 为 118.29 / 163.32 / 99.56 ms。`ubuntu-gpu-45-response.json` 为源屏 60 Hz 的中间结果,且网络延迟变化较大;不能与不同阶段网络条件混用。源屏 120 Hz 的一次 100 事件复测被 Wi-Fi 断开打断,该失败轮次不计入成功结果。
|
||||
|
||||
### 同档最终复测(45 FPS、客户端请求 25 Mbps)
|
||||
|
||||
各项为 P50 / P95,单位 ms。Windows 窗口实际由 WinForms 生成,Linux 为 GTK;JSON 中通用 method 文本仍写 GTK,应按这里解释。各系统顺序测量,无线环境并非严格恒定,因此只代表本轮观测,不能把所有差值归因于单一设置。
|
||||
|
||||
| 配置 | 拖框 | 悬停(100 次) | 点击(100 次) | 掩码字符(100 次) |
|
||||
| --- | ---: | ---: | ---: | ---: |
|
||||
| Windows | 84.88 / 121.39 | 63.63 / 101.82 | 141.37 / 153.49 | 90.05 / 105.07 |
|
||||
| 麒麟,保留 XRender | 80.61 / 100.55 | 98.34 / 116.50 | 139.13 / 159.49 | 80.01 / 104.13 |
|
||||
| Ubuntu,源屏约 120 Hz、定时捕获 | 91.38 / 117.43 | 118.43 / 151.82 | 174.60 / 211.69 | 88.02 / 120.11 |
|
||||
|
||||
原始证据分别为 `windows-final25-*`、`kylin-final25-*`、`ubuntu-final25-*`。拖框延迟已接近同档 Windows;麒麟悬停仍慢约 35 ms,Ubuntu 定时捕获时悬停慢约 55 ms、点击慢约 33 ms,不能宣称所有交互均已追平。Windows 悬停最大值还出现 845.91 ms 的孤立尖峰;P95 不能代替长稳验收,也不能隐去最大值。
|
||||
|
||||
麒麟额外测试 OpenGL 合成及 MaxFPS/RefreshRate=120:必须通过实际 D-Bus `compositingType=gl2` 才能生效,单改 Backend=OpenGL 会被系统恢复。实际 supportInformation 曾确认 NVIDIA OpenGL;其 Placeholder 源屏仍报告 60 Hz,不能声称变成真实 120 Hz 输出。拖框 97.07 / 109.11 ms,悬停 98.99 / 119.18 ms,点击 143.34 / 165.30 ms,未见收益,已恢复 `kwin-before-opengl120.conf`,不作为最终方案。证据保留为 `kylin-opengl120-25-*`。
|
||||
|
||||
Ubuntu 又测试仅在原生光标租约内启用 NvFBC `bPushModel=true`,由画面 damage 事件生成可采集帧,保留原 direct-capture 参数,不提高视频传输帧率。接口边界 14 情形通过、真实采集成功;拖框 81.42 / 99.50 ms,但悬停 119.14 / 156.67 ms、点击 172.05 / 250.00 ms、掩码输入 79.85 / 123.18 ms,未形成一致收益。测试期间还发生 AP 切换和断流,不能将拖框改善单独归因于 push。该实验的服务环境、适配器与 manifest 均已恢复,实验选项没有留在生产代码中;原始数据为 `ubuntu-push25-*`,不得将其当作当前保留配置的性能。回退后再次实际连接、核验 manifest、`nvfbc-v1`、2K/119.9 Hz 与硬件编码负载均通过。
|
||||
|
||||
### GPU 切换实测
|
||||
|
||||
已从选择页完成 Ubuntu→麒麟、麒麟→Windows、Windows→麒麟、麒麟→Ubuntu 的完整轮转。准备任务分别约 33、66、34、30 秒,含正常关机、开机和 Sunshine 就绪。最后一次 Ubuntu 冷启动后核对真实 2560×1440、约 119.9 Hz 源屏、NvFBC receipt 和 NVENC 编码负载均正常;桌面实际截图见 `ubuntu-final-desktop.jpg`,麒麟见 `kylin-final-desktop.png`。任务记录见 `gpu-switch-tasks.csv`,其中同一台重连的短任务不代表冷启动耗时。
|
||||
|
||||
实验重启 Sunshine 时另有一次准备任务在最终归属复核处失败,正常释放失败任务后,重新由用户界面准备成功;没有绕过复核或重复发送未知电源任务。不能把全部准备尝试描述为零失败。收尾仅 Ubuntu 运行,Windows、麒麟停止,盒子退出至选择页。
|
||||
|
||||
## 仍限制体验的部分
|
||||
|
||||
盒子是 RK3528,使用 RKMPP 硬解、DRM PRIME / NV12 帧和 EGL 呈现。60 FPS 串流实际接收/解码约 60,但呈现约 43,约 28% 帧被丢弃;盒子 GPU 曾达到 800 MHz 下约 90% 使用率。45 FPS 测试实际呈现约 43~44,排队和丢帧更少。客户端将部分“丢弃旧帧”记在 network jitter 栏,不能把这一栏全解释为 Wi-Fi 丢包。当前不构成稳定 2K60,也未完成直接 DRM scanout 绕开 GPU 合成的实现。
|
||||
|
||||
盒子当前走 5 GHz Wi-Fi,有线端口 NO-CARRIER。串流期间已发生 Wi-Fi 真正断开和重新关联,wpa_supplicant 原始记录含 reason=34 与关联拒绝;不是 Linux 编码器重启的推测。12:33、12:44 等记录还显示同 SSID 下尝试 2.4 GHz 接入失败,再关联 5 GHz;本轮没有修改路由器或锁定 BSSID。无线驱动为 `aicwf_sdio`,省电已关闭。网络延迟在不同测试从约 5 ms 上升到 16~40 ms,原生光标通道因此超时并正常结束串流。没有通过延长超时掩盖断网。证据见 `wifi-final.log`、`client-final.log`。提高服务器 GPU 算力不能消除盒子断网;下一步应优先让宿主与盒子稳定有线连接,再做同条件验收。
|
||||
|
||||
本轮核查宿主温度曾达 87~88°C,盒子约 76°C,需结合持续负载观察。存储 local 约 74.2%,local-lvm 约 93.8%,后者仅约 3.9 GiB 余量;未创建大快照或继续堆积大备份。迁移/扩容和稳定散热是长期运行条件,不能用持续写满测试验证性能。
|
||||
|
||||
收尾清理 Ubuntu 可再生成的 APT 安装缓存,约 772 MiB 降到 40 KiB,并执行根分区 fstrim。fstrim 报告的是发出的逻辑范围(约 28.4 GiB),不是宿主实际回收量。复查发现 Ubuntu 磁盘实际在 local 的 qcow2 文件中,local-lvm 实际使用率仍为 94.04%,不能宣称薄卷空间已释放。未删除系统、用户文件、回退备份或擅自扩大薄卷逻辑容量。
|
||||
|
||||
尚未完成 Word 文档提出的 10 分钟统一业务动态场景、每类 100 次真实拖窗/应用启动、物理相机延迟,以及 2 小时 / 8 小时长期验收。存在已捕获的 Wi-Fi 断流,故不得宣称已完成长稳或“全部操作与 Windows 完全相同”。
|
||||
|
||||
## 代码验证与回退
|
||||
|
||||
- 专用空测试数据库 `vdi_gpu_test_20261111`:共享组授权/占用、先关后开、缓存滞后票据、电源结果不明不重放、硬拒绝、原 UPID 核对和管理操作互斥。见 `exclusive-gpu-test.log`。该测试会清空自己的 fixture,严禁改为 live 数据库运行。
|
||||
- 实际盒子编译并运行 6 项 CTest,含关机桌面可点、准备成功前不签发票据、失败不连接和码率范围验证。见 `kiosk-tests.log`。
|
||||
- 麒麟实际 glibc 上,NvFBC ABI / 原参数不变 / 租约光标 / 整屏枚举 / 错版本拒绝等 10 情形通过。
|
||||
- 两台 Linux 分别通过 host 回归:显示管理器重启后的旧就绪标记清除、manifest 不完整时不触碰运行中的捕获服务;本地 4 项光标输入边界测试通过。
|
||||
- OpenAPI 与 TypeScript 类型已更新;控制台 typecheck 通过。Hardware、Snapshot、PowerBatch、DeviceIdentity、TerminalLifecycle 的专用数据库回归完整通过(344 秒),见 `maintenance-regressions.log`。
|
||||
|
||||
## 当前结论和下一步条件
|
||||
|
||||
### 后续修复:Ubuntu 双光标(2026-11-11)
|
||||
|
||||
用户反馈“一支鼠标拖着另一支”。现场核对:原生光标租约、适配器和 `nvfbc-v1` 均生效,但盒子根窗口截图仍能看到视频内箭头。原先仅确认 NvFBC 关闭光标参数和捕获就绪,未覆盖 PRIME 路径已将服务端软件光标画入画面的情形;这使本地即时光标与有视频延迟的光标叠加。
|
||||
|
||||
已在 Ubuntu 部署 guard 生命周期内的 XFixes 服务端光标隐藏,原生形状读取和盒子本地显示继续保留。配置标记是 `/home/test2/vdi-terminal/native-cursor-v1/hide-server-cursor`,未修改光标主题、移速、分辨率或编码档位。结束时先停视频生产者,再恢复服务端光标,显示连接断开也会释放隐藏状态。变更前 Python 文件备份在 `/var/backups/vdi-gpu-20261111/host-before-serverhide.py`。
|
||||
|
||||
Ubuntu 真实运行 3 项 host 回归全部通过,含捕获失败时停止/恢复顺序。盒子在三处纯桌面背景比较移动前后同一位置:超过 25 的通道变化像素数均为 0,最大通道差 0/1/0;同时本地原生光标保持 24×24、热点 (3,1)、254 个非透明像素,位置正确。见 `ubuntu-double-cursor-check.json`;该截图口径排除本地 X11 光标,因此用于检查视频中是否还有箭头,不冒充相机拍摄。随后 300 次拖框移动全部收到且松键成功,见 `ubuntu-cursorfix-drag.json`。退出后检查普通捕获已恢复、lease ready/drop-in 已清理;重新连接后重复三处检查仍通过,见 `ubuntu-double-cursor-reconnect.json` 和 `ubuntu-cursorfix-tests.log`。收尾保留 Ubuntu 串流供用户使用。这些检查用于验证重复光标和输入功能,不替代物理延迟或长稳验收。
|
||||
|
||||
已经实现三台轮流直通同一块 GTX 965M,Ubuntu、麒麟实际使用 GPU 渲染、NvFBC 捕获和 NVENC 编码;本轮不再依赖 4 核 CPU 承担 2K 软件编码。2K 画幅与 H.264 SDR 档位已对齐,拖框测得接近同档 Windows;当前保留的 Ubuntu 悬停、点击和麒麟悬停仍有可测差距,且反复出现无线断流,尚不满足“所有交互及长期稳定性与 Windows 一致”。分辨率相同也不等于已完成色彩或文字画质的客观一致性验收。
|
||||
|
||||
下一步应先给盒子接通稳定有线网络,宿主也保持有线;在固定网络、相同业务场景下重测并区分 GNOME/UKUI 重绘、显示复制与客户端呈现耗时,再决定是否重新试验事件触发捕获。若目标保持真 2K60,现有 RK3528 的 EGL 呈现路径还需继续减少复制/合成,或换实测可稳定 2K60 呈现的终端。当前 GTX 965M 已能完成单桌面硬编码,继续只加 VM CPU 核数不能解决无线断流和盒子呈现上限。
|
||||
|
||||
未来要求三个桌面同时运行时,需规划各 VM 可独立使用的物理 GPU,或硬件、驱动及授权均支持的 vGPU/编码方案,并按并发会话数验证;当前轮流直通方案不能直接变成同时共享。正式迁移前还应处理薄卷池余量与散热,再补齐 Word 中的长期及物理延迟验收。
|
||||
|
||||
PVE 变更前配置保存在 `/root/vdi-linux-gpu-20261111/{100,101,102}.conf.before`;Linux 备份在各自 `/var/backups/vdi-gpu-20261111/`。Ubuntu 的 headless 失败试验、PRIME 配置和提高源屏频率前脚本均有独立备份。回退显示配置时先退出串流,恢复对应 Xorg 与显示脚本,再正常重启显示管理器;必须目视确认桌面,不能只查服务 active。
|
||||
|
||||
平台部署前 API 镜像保留为 `vdi-cloud-live-api:before-gpu-20261111`,环境备份为工作站 `.local/live/env.before-gpu-20261111.bak`,不含于报告或仓库。盒子变更前文件在 `~/vdi-build/gpu-opt-20261111/`。回退共享组前先确认只有一台持有显卡,停用两项 group 环境变量并恢复 API/客户端;不要在 GPU 仍被别台使用时直接开机。
|
||||
|
||||
## 官方依据
|
||||
|
||||
- [Sunshine 配置](https://docs.lizardbyte.dev/projects/sunshine/latest/md_docs_2configuration.html)、[发行记录](https://github.com/LizardByte/Sunshine/releases)。实际使用选项按已装版本核验。
|
||||
- [NVIDIA Xorg 配置选项](https://download.nvidia.com/XFree86/Linux-x86_64/580.82.09/README/xconfigoptions.html)。
|
||||
- [Proxmox PCI 直通说明](https://github.com/proxmox/pve-docs/blob/master/qm-pci-passthrough.adoc)。
|
||||
|
||||
设备能枚举、编码测试能启动和完整交互桌面可用是不同证据;本报告按真实串流、GPU 编码负载和画面核验分别记录。
|
||||
|
||||
## 补充:Windows 硬编码故障与恢复(2026-11-11)
|
||||
|
||||
用户反馈 Windows 鼠标卡顿后,实际查到 GTX 965M 的设备管理器错误码为 43,`nvidia-smi` 无法连接驱动;Sunshine 13:38 的真实连接日志为 `Creating encoder [libx264]`,并非 NVENC。这是独立于 Ubuntu 双光标的故障,不能用鼠标移速或无线网络解释全部表现。
|
||||
|
||||
与原 PVE 备份比对,Windows 的 CPU、内存、PCI 直通和 QEMU 参数一致,只有 `onboot: 1→0`。公共客户端请求码率曾从 30 改为 25 Mbps,对 Windows 也有影响;45 FPS 在 11 月 9 日的客户端日志中已存在。Windows 内曾执行临时交互参考测试,相关计划任务已清理。本次排障还重启过显卡设备、Sunshine 服务,并在用户允许后正常关开机;不能描述为“Windows 内完全没有操作”。Ubuntu 隐藏服务端重复光标的补丁没有部署到 Windows。
|
||||
|
||||
显卡设备重启、Windows 正常关开机和宿主侧专用 PCI 总线复位均未恢复 NVENC;总线复位后宿主曾显示 D0,但 Windows 启动后又报 Code 43,物理设备显示 D3hot,尚不能据此单独确定驱动失败的根因。用户随后明确同意正常重启整台 Proxmox 宿主;执行前再次检查三台 VM 和容器列表、备份 Ubuntu 配置,将仍为 1 的 Ubuntu `onboot` 改为 0,避免宿主恢复时自动争用显卡。先正常关闭 Windows,确认三台全部停止后提交宿主重启。
|
||||
|
||||
当前排他切换只核验电源归属和 Sunshine `serverinfo`,不能证明 NVIDIA 驱动与硬件编码健康。此前完成过轮转不代表已证明长期可重复可靠;在恢复后完成跨系统重切和真实 NVENC 验证前,不应宣称该共享显卡方案已通过稳定性验收。禁止仅凭“连接服务已响应”报告硬编码恢复。
|
||||
|
||||
### Windows 恢复结果(13:44—13:47)
|
||||
|
||||
宿主启动 ID 已从 `f078a704-350d-4c7d-8839-c192ebe7c4b5` 变为 `df157c5a-ae91-4225-b4b7-f6ab8c0ed8c9`,确认实际完成宿主重启。随后从盒子启动 Windows,NVIDIA 设备错误码恢复为 0,`nvidia-smi` 正常返回 GTX 965M / 582.78。13:44:44 实际连接为 `Creating encoder [h264_nvenc]`,随后明确创建 H.264 P1 编码器;连续检查 GPU 编码负载约 10%—11%,Sunshine CPU 采样为 0%,不再是此前的软件编码状态。日志中的 HEVC 10-bit 探测失败不是当前流,当前流已核对为 H.264 SDR。
|
||||
|
||||
盒子日志确认实际串流为 2560×1440 / 45 FPS、RKMPP H.264 硬解;画面可用。完成 30 步桌面背景拖框,画面出现对应选框,finally 中释放鼠标按键,未重建 Windows 临时计划任务。证据为 `windows-recovery-nvenc.log` 和 `windows-recovery-desktop-drag.jpg`。这是短时功能与硬编码恢复核验,没有重新完成物理输入延迟或长期稳定性验收。
|
||||
|
||||
本次收尾状态取代前文“保留 Ubuntu”的旧状态:Windows 正在运行并连接,Ubuntu、麒麟关闭;三台 onboot 均为 0。Ubuntu 自动启动改动前备份为 `/root/vdi-linux-gpu-20261111/102.conf.before-windows-recovery`。未更换 Windows 显卡驱动,未修改其 CPU、内存、鼠标速度或直通参数。宿主重启前的 `power/control=on` 是临时状态,没有创建持久化规则。
|
||||
|
||||
本次恢复表明整机重新初始化后显卡可以重新供 Windows 使用,但没有证明跨系统切换失败的唯一根因,也没有修复自动切换的硬编码健康校验缺口。当前先保留 Windows 使用;不得将这次恢复表述为“共享 GPU 切换问题已彻底解决”。
|
||||
|
||||
## 后续修复:Windows→Ubuntu 一直“进入中”(2026-11-11 14:07)
|
||||
|
||||
13:49 的 Ubuntu 准备任务在 `service-waiting` 阶段等待 180 秒后失败。Windows 已正常关闭,Ubuntu 已开机,但 Linux NVIDIA 驱动从开机起报告 `fallen off the bus and is not responding to commands`,GNOME/Xorg 会话反复失败,Sunshine 未启动。Ubuntu 内停止桌面并卸载、重载 NVIDIA 模块仍返回 `No such device`。该现象不能解释成单纯页面动画或需要重复点击。
|
||||
|
||||
确认 VM100/101 关闭、VM102 正常关机、VFIO 组无人持有,且上游桥只有 GTX 965M 后,对 GPU 执行 sysfs `remove`、等待两秒、桥 `rescan`,核验同一 PCI 身份、vfio-pci 驱动和 D0,再启动 Ubuntu。此次无需重启宿主即恢复 GNOME、NvFBC 与 NVENC。首次恢复任务耗时 25.41 秒。该实验与前一轮只写 PCI `reset` 不同;不能将两者混称为已重复验证过的同一方法。
|
||||
|
||||
为使此步骤在后续开机时自动执行,增加 `tools/pve-shared-gpu-hook.py` 并部署为 `local:snippets/vdi-shared-gpu-reset.py`,绑定 VM100/101/102。实现仅适用于 starhe 的指定 GTX 965M、PCI 桥和 IOMMU 拓扑。每次 pre-start 必须确认三台全部停止、VFIO 组无人使用;使用 flock 和开机阶段预留,避免两次准备同时穿过检查。初始化失败保留 failed 预留,后续启动被阻止,不自动重放结果未明的操作;post-start 记录归属,post-stop 核验后释放。GPU 返回 D0 只代表开机前设备条件,仍不替代来宾驱动和真实硬编码核验。
|
||||
|
||||
部署前备份:`/root/vdi-linux-gpu-20261111/{100,101,102}.conf.before-gpu-hook` 和 `storage.cfg.before-gpu-hook`。local 存储内容类型保留原值并增加 snippets。Windows PVE 配置此次新增 hookscript,未修改 Windows 来宾鼠标、应用、驱动或硬件资源配置;不能再用此前“仅 onboot 不同”的历史对比描述当前配置。
|
||||
|
||||
验证结果:4 项本地回归通过,覆盖运行/占用拦截、连续启动预留、初始化失败不重放、错误 VM 不能认领。宿主实测在 Windows 运行时调用另一个 VM 的 pre-start,会拒绝操作并报告运行者,未重置正在使用的 GPU。部署后从盒子完成 Ubuntu→Windows(73.88 秒)和 Windows→Ubuntu(41.01 秒),均未重启宿主。Windows 设备错误码为 0,实际串流 H.264 NVENC,编码负载约 11%;最终 Ubuntu 实际连接确认 NvFBC、2560×1440、H.264 NVENC,编码负载约 29%,服务 active。1 Mbps 日志属于编码探测,最终会话实际视频预算为 18.988 Mbps,客户端请求档位仍为 25 Mbps。双光标隐藏标记保持存在。
|
||||
|
||||
当前仅 Ubuntu 运行并留在盒子桌面,Windows、麒麟停止,GPU 预留归属 VM102/running。本轮验证了一次双向轮转,未重新测试麒麟轮转,也未完成数十次循环或长期稳定性验收;不据此保证任意次数切换均无故障。平台当前仍以 serverinfo 判断服务就绪,硬编码健康尚需另行加强,不能把本钩子说成编码健康检查。
|
||||
|
||||
证据:`gpu-hook-unit-tests.log`、`gpu-hook-active-guard-test.log`、`gpu-hook-switch-tasks.csv`、`gpu-hook-windows-nvenc.log`、`gpu-hook-ubuntu-nvenc.log`、`gpu-hook-final-state.log` 及两台最终桌面截图。
|
||||
|
||||
回退时先退出串流,并逐台确认 hookscript 当前仍为本次路径,再执行 `qm set <VMID> --delete hookscript`;此操作只去掉本次钩子,不整份覆盖其他 VM 配置。保留 snippets 内容类型不会重置显卡。如出现 failed/prepared 预留,必须先核对所有 VM 实际电源、原启动任务、VFIO 占用及 PCI 设备状态,再由管理员处理 `/run/vdi-shared-gpu/reservation.json`;不要直接清空预留并反复开机。
|
||||
|
||||
## 补充验证:麒麟共享显卡切换(2026-11-11 14:30)
|
||||
|
||||
用户要求验证麒麟。开始检查时,用户已从 Ubuntu 切到麒麟,平台初次准备耗时 37.68 秒;同机重连的 0.49 秒任务不计为冷启动。NVIDIA 580.95.05 正常,OpenGL renderer 为 GTX 965M,源画面为 2560×1440,实际连接日志确认 NvFBC 与 H.264 NVENC,GPU 编码负载约 25%。现场看到软件商店正在安装更新,先等待并核对 aptdaemon 无活动事务、包管理锁释放、`dpkg --audit` 无异常后,才开始关机轮转,未中断或主动执行软件更新。
|
||||
|
||||
随后从盒子完成以下四次正常关机、共享 GPU 初始化、开机和连接服务准备:
|
||||
|
||||
| 方向 | 准备耗时 | 结果 |
|
||||
| --- | ---: | --- |
|
||||
| 麒麟→Windows | 79.31 秒 | 实际 H.264 NVENC,GPU 编码负载约 10% |
|
||||
| Windows→麒麟 | 40.75 秒 | NVIDIA OpenGL、NvFBC、实际 H.264 NVENC,编码负载约 22% |
|
||||
| 麒麟→Ubuntu | 36.82 秒 | 真 2560×1440、NvFBC、实际 H.264 NVENC,编码负载约 29% |
|
||||
| Ubuntu→麒麟 | 38.01 秒 | NVIDIA OpenGL、NvFBC、实际 H.264 NVENC,编码负载约 23% |
|
||||
|
||||
四次均成功,宿主启动 ID 始终为 `df157c5a-ae91-4225-b4b7-f6ab8c0ed8c9`,本轮没有重启宿主或修改三台 VM 的配置。耗时以平台数据库任务创建到完成计算,不包含人手退出、检查和再次点击的间隔;服务准备完成也不等于最终画面已经出现,因此另外核对实际 CLIENT CONNECTED、最终编码器、GPU 负载和桌面截图。
|
||||
|
||||
麒麟启动后显示过其自身锁屏,最终通过 logind 解锁当前测试会话,并核对实际桌面。未关闭锁屏策略或修改登录配置。麒麟开机早期来宾日志时间有八小时偏差,最终已核对 NTPSynchronized=yes、系统时间恢复;轮转顺序与耗时依据平台记录,日志按当前 boot 和实际 Sunshine PID 筛选,避免混入旧启动记录。未修改 RTC 或 NTP 配置。
|
||||
|
||||
最终盒子日志确认 2560×1440 / 45 FPS 串流、RKMPP H.264 硬解;45 是协商串流帧率,不代表重新实测了终端持续呈现 45 FPS。请求码率仍为 25 Mbps,最终视频预算为 18.988 Mbps,1 Mbps 记录属于编码器探测阶段。保留原有麒麟桌面与光标配置。
|
||||
|
||||
最后从盒子发送 30 步桌面背景拖框,实际解码画面显示对应选框,finally 中松开鼠标按键成功。此检查验证基本输入和视频回显,不是物理输入延迟、掉帧率或画质客观一致性测量。此次完成了麒麟与另外两台各一次双向切换,未据此宣称两小时/八小时长稳,或麒麟全部交互延迟已经与 Windows 完全一致。
|
||||
|
||||
收尾仅麒麟 VM101 运行并连接,GPU 预留为 VM101/running;Windows、Ubuntu 均停止。结果取代前文保留 Ubuntu 的收尾状态。
|
||||
|
||||
证据:`kylin-cycle-switch-tasks.csv`、`kylin-cycle-windows-nvenc.log`、`kylin-cycle-return-from-windows.log`、`kylin-cycle-ubuntu-nvenc.log`、`kylin-cycle-return-from-ubuntu.log`、`kylin-cycle-final-state.log`、`kylin-cycle-final-drag.jpg` 和 `kylin-cycle-final-desktop.jpg`。
|
||||
|
||||
## 补充优化:终端调度对照与无线扫描(2026-11-11 15:43)
|
||||
|
||||
本轮保持 2560×1440、45 FPS、客户端请求 25 Mbps、H.264 SDR。两台实际 NvFBC / NVENC 保持有效,未调整原生鼠标样式或移速。没有修改 Windows 来宾的驱动、鼠标、应用或资源配置;为测试按平台流程正常关闭 Windows 并切到 Linux。此次持久调整在共用盒子的网络配置中,因而也影响盒子连接 Windows 时的网络路径。
|
||||
|
||||
### 实际保留的调整
|
||||
|
||||
盒子三次无线断开记录中有 `reason=34`。15:22:58 断开后,反复尝试同名 2.4 GHz 热点并被拒绝,直到 15:23:25 才恢复 5 GHz。先仅设置 5 GHz,15:30:31 仍断开,15:30:44 恢复;说明限制频段不足以修复断开本身。
|
||||
|
||||
进一步将盒子现有 YXTech 配置固定到当前 5 GHz 接入点 `f8:ce:21:a7:b9:50`。NetworkManager 文档说明固定 BSSID 会禁用漫游及后台扫描;此前断开间隔约五分钟,扫描参与问题是推断,尚未证明是唯一根因。Wi-Fi 省电原本已关闭,本轮没有把它记为新增优化。
|
||||
|
||||
配置已通过 nmcli 写入 `/etc/netplan/90-NM-9212612f-4dd0-4cf0-a21b-85413c900acf.yaml`,核对 `band: 5GHz` 和 BSSID。每次试验前设置了 90 秒自动回退,重连和 SSH 验证成功后取消回退;没有留下活动回退定时器。配置备份位于盒子 `/var/backups/vdi-wifi-20261111/`,不是 PVE,备份不复制到仓库以免带入无线凭据。
|
||||
|
||||
15:32:29—15:43:09 的约 10 分 40 秒观察中,没有再次出现无线断开或关联拒绝,越过两个此前约五分钟的周期。期间主动切换麒麟、Ubuntu并重连,不是同一桌面连续串流十分钟,也不是长期稳定性验收。若移动盒子、更换接入点或该 AP 不可用,需解除 BSSID 限制;本轮没有改路由器。
|
||||
|
||||
### 未保留的调度试验
|
||||
|
||||
确认 SDL 渲染线程申请高优先级因权限失败。先由 root 仅把当前 Moonlight 的 PacerRender 线程从 nice 0 临时改为 -10,保持普通 TS 调度;未使用 SCHED_FIFO、文件 capabilities、全进程提权或更改用户权限上限。固定接入点后,两台分别在同一连接内顺序 A/B,每类 50 次。表内为 P50 / P95,单位 ms:
|
||||
|
||||
| 系统 | PacerRender nice | 悬停回显 | 点击回显(含40ms按住) | 掩码字符回显 |
|
||||
| --- | ---: | ---: | ---: | ---: |
|
||||
| Ubuntu | 0 | 122.5 / 141.6 | 173.0 / 195.6 | 83.7 / 120.5 |
|
||||
| Ubuntu | -10 | 121.7 / 151.0 | 172.8 / 213.7 | 79.1 / 105.9 |
|
||||
| 麒麟 | 0 | 103.1 / 127.6 | 147.0 / 165.5 | 81.9 / 103.6 |
|
||||
| 麒麟 | -10 | 101.3 / 121.3 | 146.5 / 172.8 | 86.1 / 99.6 |
|
||||
|
||||
悬停及点击中位数没有稳定收益,部分 P95 反而上升,因此两台试验均恢复 nice 0,没有持久化提权。Ubuntu 固定 AP 前另有两轮 A/B,同样没有一致收益;被断网打断的 A2、B2 与麒麟第一次 B 不计为完整结果。不能把警告消失或某一类输入的单轮改善解释为整体延迟降低。
|
||||
|
||||
### 功能与呈现复查
|
||||
|
||||
| 系统 | 拖动回显 P50 / P95(ms) | 观察到的新位置更新/秒 | 输入验证 |
|
||||
| --- | ---: | ---: | --- |
|
||||
| Ubuntu | 90.9 / 109.8 | 35.4 | 300 次末位置可见,松键成功 |
|
||||
| 麒麟 | 84.4 / 106.9 | 37.2 | 300 次末位置可见,松键成功 |
|
||||
|
||||
以上为 XTest 输入至首次观察到唯一解码标记,排除实体 USB 鼠标和屏幕扫描;更新/秒是 60 Hz 拖动下采样到的独特位置,不等于解码或显示帧率。GTK 的合成页面提交没有业务后端,不能代表真实密码认证或应用启动耗时。
|
||||
|
||||
Ubuntu 在来宾内部另测本地 X11 标记,悬停中位数约 21 ms、点击约 78 ms(含40ms按住)、掩码字符约 5 ms,每类30次。它与盒子端测量路径不同,只用于区分来宾处理与串流路径,不将差值当作可直接消除的延迟。
|
||||
|
||||
结束前的 Ubuntu 单会话统计:接收/解码约45.03 FPS、呈现44.18 FPS、平均网络6 ms(variance栏1 ms)、解码7.67 ms、排队4.62 ms。麒麟对应会话呈现43.85 FPS。无线条件不恒定,不能将这几次统计差异全归因于固定 AP。network jitter 栏还包含客户端丢弃旧帧,不能全当无线丢包。
|
||||
|
||||
Ubuntu 再次退出和重连后,三处背景检查均未发现视频内重复箭头,仍有24×24的本地原生光标。临时 GTK 参考窗口已停止,桌面实际截图核验通过。
|
||||
|
||||
### 深层显示链路和边界
|
||||
|
||||
盒子仍是 RKMPP 硬解、DRM PRIME / EGL 呈现。现场 GPU 约800 MHz、90%—93%负载,不能承诺真2K60。部署源码明确要求 DRM master 才能直接设置显示 plane;现有原生光标实现也显式要求 X11。改成 DRM 直出需要同时完成 VT/显示所有权、光标后端、退出恢复及快捷键验证。本轮没有停掉 X11 或把“Direct rendering disabled”当成一个可随意开启的选项;没有声称已实现新的直接扫描输出或完全零拷贝链路。
|
||||
|
||||
本轮主要消除已观察到的无效频段重试并测试固定 AP 的短期稳定性,尚未证明 Ubuntu/麒麟全部交互延迟与 Windows 相同。继续提高 CPU 核数不能解决盒子 GPU 呈现吞吐和无线驱动/AP层问题。两小时/八小时、物理相机延迟及统一真实业务场景验收仍未完成。
|
||||
|
||||
### 收尾与回退
|
||||
|
||||
仅 Ubuntu VM102 运行并留在盒子上,Windows、麒麟停止;宿主未重启,共享 GPU 钩子和三台 VM 配置未改。Ubuntu 双光标修复、麒麟原有合成设置均保留。PacerRender / InputSend / FFDecoder 最终均为 nice 0、TS。
|
||||
|
||||
在盒子上解除本轮网络限制(会短暂断网):
|
||||
|
||||
```sh
|
||||
sudo nmcli connection modify uuid 9212612f-4dd0-4cf0-a21b-85413c900acf 802-11-wireless.bssid '' 802-11-wireless.band ''
|
||||
sudo nmcli connection up uuid 9212612f-4dd0-4cf0-a21b-85413c900acf ifname wlan0
|
||||
```
|
||||
|
||||
证据:`wifi-before-5ghz.log`、`wifi-fixed-ap-final.log`、`*-sched-fixed-ap.jsonl`、`*-fixed-ap-drag.json`、`ubuntu-local-screen-response.raw`、`ubuntu-fixed-ap-client-stats.log`、`ubuntu-fixed-ap-double-cursor.json`、`optimization-host-final-state.log`。测量脚本为 `box-sched-pair.py`、`response-probe-50.py`、`guest-local-response.py`。
|
||||
|
||||
依据:[NetworkManager 无线配置](https://networkmanager.dev/docs/api/latest/settings-802-11-wireless.html)、[SDL Linux线程优先级实现](https://github.com/libsdl-org/SDL/blob/release-2.30.11/src/core/linux/SDL_threadprio.c),以及现场部署的 Moonlight DRM / 原生光标源码。
|
||||
@@ -0,0 +1,21 @@
|
||||
"""Sequential single-connection A/B experiment. Always restore normal nice."""
|
||||
import json
|
||||
import pathlib
|
||||
import subprocess
|
||||
import time
|
||||
pid = int(subprocess.check_output(['pgrep', '-x', 'moonlight']))
|
||||
tasks = pathlib.Path('/proc') / str(pid) / 'task'
|
||||
tids = [int(p.name) for p in tasks.iterdir() if (p / 'comm').read_text().strip() == 'PacerRender']
|
||||
assert len(tids) == 1
|
||||
tid = tids[0]
|
||||
results = []
|
||||
try:
|
||||
for label, priority in [('A', 0), ('B', -10)]:
|
||||
assert int(subprocess.check_output(['pgrep', '-x', 'moonlight'])) == pid
|
||||
subprocess.run(['sudo', '-n', 'renice', '-n', str(priority), '-p', str(tid)], check=True, stdout=subprocess.DEVNULL)
|
||||
begin = time.time()
|
||||
data = json.loads(subprocess.check_output(['python3', '/tmp/vdi-response-50.py'], timeout=150))
|
||||
results.append(dict(label=label, nice=priority, started=begin, ended=time.time(), data=data))
|
||||
print(json.dumps(results[-1]), flush=True)
|
||||
finally:
|
||||
subprocess.run(['sudo', '-n', 'renice', '-n', '0', '-p', str(tid)], stdout=subprocess.DEVNULL)
|
||||
@@ -0,0 +1,44 @@
|
||||
"""Run on the box with a focused, live Ubuntu stream and clear wallpaper."""
|
||||
import ctypes as C, json, subprocess, time, os
|
||||
os.environ.update(DISPLAY=':0',XAUTHORITY='/home/armbian/.Xauthority')
|
||||
import gi
|
||||
gi.require_version('Gdk','3.0')
|
||||
from gi.repository import Gdk
|
||||
x=C.CDLL('libX11.so.6'); f=C.CDLL('libXfixes.so.3')
|
||||
class Cursor(C.Structure):
|
||||
_fields_=[('x',C.c_short),('y',C.c_short),('w',C.c_ushort),('h',C.c_ushort),
|
||||
('hx',C.c_ushort),('hy',C.c_ushort),('serial',C.c_ulong),
|
||||
('pixels',C.POINTER(C.c_ulong)),('atom',C.c_ulong),('name',C.c_char_p)]
|
||||
x.XOpenDisplay.argtypes=[C.c_char_p]; x.XOpenDisplay.restype=C.c_void_p
|
||||
x.XFree.argtypes=[C.c_void_p]; x.XCloseDisplay.argtypes=[C.c_void_p]
|
||||
f.XFixesGetCursorImage.argtypes=[C.c_void_p];f.XFixesGetCursorImage.restype=C.POINTER(Cursor)
|
||||
display=x.XOpenDisplay(None); assert display
|
||||
pid=int(subprocess.check_output(['pgrep','-x','moonlight']).strip())
|
||||
def focused():
|
||||
assert int(subprocess.check_output(['xdotool','getwindowfocus','getwindowpid']).strip())==pid
|
||||
def move(px,py):
|
||||
subprocess.run(['xdotool','mousemove',str(px),str(py)],check=True)
|
||||
time.sleep(.5)
|
||||
def patch(px,py):
|
||||
p=Gdk.pixbuf_get_from_window(Gdk.get_default_root_window(),px-8,py-8,64,64)
|
||||
assert p and p.get_n_channels()==3
|
||||
return bytes(p.get_pixels())
|
||||
results=[]
|
||||
try:
|
||||
focused()
|
||||
for px,py in [(900,900),(1300,900),(1800,900)]:
|
||||
move(400,1100); before=patch(px,py)
|
||||
move(px,py); after=patch(px,py)
|
||||
diffs=[max(abs(a-b) for a,b in zip(before[i:i+3],after[i:i+3])) for i in range(0,len(before)-2,3)]
|
||||
ptr=f.XFixesGetCursorImage(display); assert ptr
|
||||
try:
|
||||
c=ptr.contents
|
||||
opaque=sum(((c.pixels[i]>>24)&255)>0 for i in range(c.w*c.h))
|
||||
assert opaque>0 and (c.x,c.y)==(px,py)
|
||||
results.append(dict(point=[px,py],video_pixels_changed_over_25=sum(v>25 for v in diffs),
|
||||
max_video_channel_difference=max(diffs),local_shape=[c.w,c.h,c.hx,c.hy],
|
||||
local_opaque_pixels=opaque))
|
||||
finally:x.XFree(ptr)
|
||||
focused()
|
||||
print(json.dumps(dict(method='XGetImage-style root capture excludes local X11 cursor; compare clear wallpaper at identical coordinates',pid=pid,points=results)))
|
||||
finally:x.XCloseDisplay(display)
|
||||
@@ -0,0 +1,5 @@
|
||||
target_name,status,message,created_at,updated_at,provider_ref
|
||||
Ubuntu,success,桌面已启动,连接服务已响应,2026-11-11 06:05:36.799346+00,2026-11-11 06:06:17.812001+00,"{""phase"":""completed"",""node"":""starhe"",""members"":[100,101,102],""terminal"":""term_8f55853c7c3b1454018c4b9e20f3fa49"",""vmid"":102,""upid"":""UPID:starhe:00002202:00021B5D:6AF405B8:qmstart:102:vdi-cloud@pve!console:""}"
|
||||
Windows 10,success,桌面已启动,连接服务已响应,2026-11-11 06:02:43.720719+00,2026-11-11 06:03:57.601456+00,"{""phase"":""completed"",""node"":""starhe"",""members"":[100,101,102],""terminal"":""term_8f55853c7c3b1454018c4b9e20f3fa49"",""vmid"":100,""upid"":""UPID:starhe:00001E19:0001D561:6AF40505:qmstart:100:vdi-cloud@pve!console:""}"
|
||||
Ubuntu,success,桌面已启动,连接服务已响应,2026-11-11 05:56:30.141686+00,2026-11-11 05:56:55.554019+00,"{""phase"":""completed"",""node"":""starhe"",""members"":[100,101,102],""terminal"":""term_8f55853c7c3b1454018c4b9e20f3fa49"",""vmid"":102,""upid"":""UPID:starhe:00001602:0001417C:6AF4038B:qmstart:102:vdi-cloud@pve!console:""}"
|
||||
Ubuntu,failed,桌面准备失败,请检查桌面授权、占用状态及 PVE,2026-11-11 05:52:35.605684+00,2026-11-11 05:55:35.920613+00,"{""phase"":""service-waiting"",""node"":""starhe"",""members"":[100,101,102],""terminal"":""term_8f55853c7c3b1454018c4b9e20f3fa49""}"
|
||||
|
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 57 KiB |
@@ -0,0 +1,19 @@
|
||||
target_name,status,created_at,updated_at,preparation_seconds
|
||||
Ubuntu,success,2026-11-11 03:34:20.35987+00,2026-11-11 03:34:21.14229+00,0.78
|
||||
Ubuntu,success,2026-11-11 03:36:59.766672+00,2026-11-11 03:37:06.633399+00,6.87
|
||||
Ubuntu,success,2026-11-11 03:38:47.341838+00,2026-11-11 03:38:51.653688+00,4.31
|
||||
Ubuntu,success,2026-11-11 03:47:14.234108+00,2026-11-11 03:47:14.895746+00,0.66
|
||||
Ubuntu,success,2026-11-11 03:49:34.251688+00,2026-11-11 03:49:34.916777+00,0.67
|
||||
麒麟,success,2026-11-11 03:54:05.573564+00,2026-11-11 03:54:38.369174+00,32.80
|
||||
麒麟,success,2026-11-11 03:55:39.205627+00,2026-11-11 03:55:39.683346+00,0.48
|
||||
麒麟,success,2026-11-11 03:57:28.883582+00,2026-11-11 03:57:29.518772+00,0.64
|
||||
Windows 10,success,2026-11-11 04:03:38.760355+00,2026-11-11 04:04:44.266771+00,65.51
|
||||
麒麟,success,2026-11-11 04:20:51.146116+00,2026-11-11 04:21:25.024756+00,33.88
|
||||
麒麟,success,2026-11-11 04:30:55.592276+00,2026-11-11 04:30:56.188834+00,0.60
|
||||
Ubuntu,success,2026-11-11 04:35:02.584931+00,2026-11-11 04:35:32.576797+00,29.99
|
||||
Ubuntu,success,2026-11-11 04:39:44.196344+00,2026-11-11 04:39:44.64925+00,0.45
|
||||
Ubuntu,failed,2026-11-11 04:43:00.674407+00,2026-11-11 04:43:15.965217+00,15.29
|
||||
Ubuntu,success,2026-11-11 04:43:37.274209+00,2026-11-11 04:43:37.695784+00,0.42
|
||||
Ubuntu,success,2026-11-11 04:45:13.187294+00,2026-11-11 04:45:14.066786+00,0.88
|
||||
Ubuntu,success,2026-11-11 04:49:09.862518+00,2026-11-11 04:49:10.780778+00,0.92
|
||||
Ubuntu,success,2026-11-11 04:50:10.359961+00,2026-11-11 04:50:11.386161+00,1.03
|
||||
|
@@ -0,0 +1,66 @@
|
||||
"""Run on box: XTest input to decoded marker. Excludes USB and scanout."""
|
||||
import ctypes as C
|
||||
import os
|
||||
import json
|
||||
import statistics
|
||||
import subprocess
|
||||
import time
|
||||
os.environ.setdefault('DISPLAY', ':0')
|
||||
x=C.CDLL('libX11.so.6'); t=C.CDLL('libXtst.so.6')
|
||||
x.XOpenDisplay.restype=C.c_void_p
|
||||
x.XDefaultRootWindow.argtypes=[C.c_void_p]; x.XDefaultRootWindow.restype=C.c_ulong
|
||||
x.XSync.argtypes=[C.c_void_p,C.c_int]
|
||||
x.XGetImage.argtypes=[C.c_void_p,C.c_ulong,C.c_int,C.c_int,C.c_uint,C.c_uint,C.c_ulong,C.c_int]; x.XGetImage.restype=C.c_void_p
|
||||
x.XGetPixel.argtypes=[C.c_void_p,C.c_int,C.c_int]; x.XGetPixel.restype=C.c_ulong
|
||||
x.XDestroyImage.argtypes=[C.c_void_p]
|
||||
x.XStringToKeysym.argtypes=[C.c_char_p]; x.XStringToKeysym.restype=C.c_ulong
|
||||
x.XKeysymToKeycode.argtypes=[C.c_void_p,C.c_ulong];x.XKeysymToKeycode.restype=C.c_uint
|
||||
t.XTestFakeMotionEvent.argtypes=[C.c_void_p,C.c_int,C.c_int,C.c_int,C.c_ulong]
|
||||
t.XTestFakeButtonEvent.argtypes=[C.c_void_p,C.c_uint,C.c_int,C.c_ulong]
|
||||
t.XTestFakeKeyEvent.argtypes=[C.c_void_p,C.c_uint,C.c_int,C.c_ulong]
|
||||
d=x.XOpenDisplay(None);assert d;root=x.XDefaultRootWindow(d)
|
||||
pid=os.getpid()
|
||||
|
||||
def key(name):
|
||||
code=x.XKeysymToKeycode(d,x.XStringToKeysym(name.encode()));assert code
|
||||
t.XTestFakeKeyEvent(d,code,1,0);t.XTestFakeKeyEvent(d,code,0,0);x.XSync(d,0)
|
||||
def move(px,py):
|
||||
t.XTestFakeMotionEvent(d,-1,px,py,0);x.XSync(d,0)
|
||||
def read():
|
||||
im=x.XGetImage(d,root,40,1380,1320,1,0xffffffff,2);assert im
|
||||
try:
|
||||
def val(offset,n):
|
||||
pixels=[x.XGetPixel(im,offset+20+i*40,0)&0xffffff for i in range(n)]
|
||||
if any(0x404040<v<0xc0c0c0 for v in pixels):return -1
|
||||
return sum((1<<i) for i,v in enumerate(pixels) if v>0xc0c0c0)
|
||||
return val(0,16),val(760,8),val(1120,4)
|
||||
finally:x.XDestroyImage(im)
|
||||
def await_marker(m,s):
|
||||
deadline=time.monotonic()+4
|
||||
while time.monotonic()<deadline:
|
||||
seen,magic,mode=read()
|
||||
if (seen,magic,mode)==(s,0x5a,m):return
|
||||
time.sleep(.002)
|
||||
raise AssertionError(('marker timeout',m,s,read()))
|
||||
def sample(m,s,action):
|
||||
start=time.monotonic();action();await_marker(m,s);return (time.monotonic()-start)*1000
|
||||
def stats(a):
|
||||
b=sorted(a);return dict(samples_ms=a,p50=statistics.median(b),p95=b[int(len(b)*.95)],maximum=max(b))
|
||||
|
||||
result={'pid':pid,'method':'Guest XTest to local X11 screen marker; actual buttons/masked entry; submit has no backend; no USB/scanout'}
|
||||
for m in [1,2,3]:
|
||||
move(300,300);time.sleep(.4);key('F'+str(m));await_marker(m,0)
|
||||
values=[]
|
||||
for i in range(1,31):
|
||||
px=750 if i%2 else 1750
|
||||
if m==1: action=lambda:move(px,550)
|
||||
elif m==2:
|
||||
move(px,550);time.sleep(.12)
|
||||
def action():
|
||||
t.XTestFakeButtonEvent(d,1,1,0);x.XSync(d,0);time.sleep(.04)
|
||||
t.XTestFakeButtonEvent(d,1,0,0);x.XSync(d,0)
|
||||
else:action=lambda:key('a')
|
||||
values.append(sample(m,i,action));time.sleep(.12)
|
||||
result[{1:'hover',2:'click_release',3:'masked_character'}[m]]=stats(values)
|
||||
if m==3:result['synthetic_submit_ms']=sample(m,1030,lambda:key('Return'))
|
||||
print(json.dumps(result))
|
||||
|
After Width: | Height: | Size: 173 KiB |
|
After Width: | Height: | Size: 165 KiB |
|
After Width: | Height: | Size: 44 KiB |
@@ -0,0 +1,5 @@
|
||||
id,target_name,status,message,created_at,updated_at,provider_ref
|
||||
task_4413c7c5f9ae12c1962baa0cc01d0def,Windows 10,success,桌面已启动,连接服务已响应,2026-11-11 06:18:03.365066+00,2026-11-11 06:19:22.675588+00,"{""phase"":""completed"",""node"":""starhe"",""members"":[100,101,102],""terminal"":""term_8f55853c7c3b1454018c4b9e20f3fa49"",""vmid"":100,""upid"":""UPID:starhe:000031D9:00033D71:6AF4089F:qmstart:100:vdi-cloud@pve!console:""}"
|
||||
task_931dd4228fa63682af8a983edd492f6c,麒麟,success,桌面已启动,连接服务已响应,2026-11-11 06:21:26.026028+00,2026-11-11 06:22:06.77583+00,"{""phase"":""completed"",""node"":""starhe"",""members"":[100,101,102],""terminal"":""term_8f55853c7c3b1454018c4b9e20f3fa49"",""vmid"":101,""upid"":""UPID:starhe:000035D0:00038DB3:6AF4096D:qmstart:101:vdi-cloud@pve!console:""}"
|
||||
task_00ef62c391c917bff472447d5f287b9c,Ubuntu,success,桌面已启动,连接服务已响应,2026-11-11 06:24:13.177068+00,2026-11-11 06:24:49.994688+00,"{""phase"":""completed"",""node"":""starhe"",""members"":[100,101,102],""terminal"":""term_8f55853c7c3b1454018c4b9e20f3fa49"",""vmid"":102,""upid"":""UPID:starhe:000039A6:0003CDD1:6AF40A11:qmstart:102:vdi-cloud@pve!console:""}"
|
||||
task_94ab84cc16a78268cc8fcf9c0771a014,麒麟,success,桌面已启动,连接服务已响应,2026-11-11 06:25:57.956284+00,2026-11-11 06:26:35.971051+00,"{""phase"":""completed"",""node"":""starhe"",""members"":[100,101,102],""terminal"":""term_8f55853c7c3b1454018c4b9e20f3fa49"",""vmid"":101,""upid"":""UPID:starhe:00003BF1:0003F6CE:6AF40A7A:qmstart:101:vdi-cloud@pve!console:""}"
|
||||
|
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 57 KiB |
|
After Width: | Height: | Size: 5.0 MiB |
@@ -0,0 +1 @@
|
||||
{"pid": 992309, "sent": 300, "elapsed": 7.083299948993954, "frames": [{"seq": 0, "t": 96067.229110928, "age_ms": null}, {"seq": 1, "t": 96067.294004533, "age_ms": 66.1280229978729}, {"seq": 2, "t": 96067.313168356, "age_ms": 51.013105010497384}, {"seq": 3, "t": 96067.346768634, "age_ms": 69.02826500299852}, {"seq": 4, "t": 96067.366134597, "age_ms": 70.88485300482716}, {"seq": 5, "t": 96067.387801092, "age_ms": 59.50848299835343}, {"seq": 6, "t": 96067.432348668, "age_ms": 70.67017098597717}, {"seq": 7, "t": 96067.454095378, "age_ms": 74.94629999564495}, {"seq": 8, "t": 96067.475747289, "age_ms": 80.56185400346294}, {"seq": 9, "t": 96067.497234397, "age_ms": 86.2246610049624}, {"seq": 10, "t": 96067.517303033, "age_ms": 71.57148300029803}, {"seq": 11, "t": 96067.545228544, "age_ms": 83.50059798976872}, {"seq": 12, "t": 96067.566523139, "age_ms": 88.741334999213}, {"seq": 13, "t": 96067.588773592, "age_ms": 77.14736799243838}, {"seq": 14, "t": 96067.611016169, "age_ms": 82.40297999873292}, {"seq": 15, "t": 96067.632855052, "age_ms": 71.13628600200173}, {"seq": 16, "t": 96067.654722229, "age_ms": 75.60871999885421}, {"seq": 18, "t": 96067.676727081, "age_ms": 64.60979398980271}, {"seq": 19, "t": 96067.719775386, "age_ms": 73.90264299465343}, {"seq": 20, "t": 96067.741812033, "age_ms": 79.22301099461038}, {"seq": 21, "t": 96067.763942602, "age_ms": 85.50740299688186}, {"seq": 22, "t": 96067.785481048, "age_ms": 73.2168890099274}, {"seq": 23, "t": 96067.807269177, "age_ms": 78.5813000111375}, {"seq": 24, "t": 96067.8292154, "age_ms": 84.81989699066617}, {"seq": 25, "t": 96067.851838045, "age_ms": 72.89690698962659}, {"seq": 27, "t": 96067.87370668, "age_ms": 62.59540499013383}, {"seq": 28, "t": 96067.916499468, "age_ms": 70.27901899709832}, {"seq": 29, "t": 96067.943252982, "age_ms": 81.56204799888656}, {"seq": 30, "t": 96067.964581704, "age_ms": 86.76719799404964}, {"seq": 31, "t": 96067.986240908, "age_ms": 74.4142629991984}, {"seq": 32, "t": 96068.008371477, "age_ms": 79.53132399416063}, {"seq": 33, "t": 96068.02977458, "age_ms": 85.29243001248688}, {"seq": 34, "t": 96068.052108164, "age_ms": 73.03195900749415}, {"seq": 35, "t": 96068.072991772, "age_ms": 76.85772300465032}, {"seq": 38, "t": 96068.142937101, "age_ms": 81.29602900589816}, {"seq": 39, "t": 96068.165238017, "age_ms": 87.2869860031642}, {"seq": 47, "t": 96068.184570144, "age_ms": 88.09700100391638}, {"seq": 49, "t": 96068.248013486, "age_ms": 103.52577798767015}, {"seq": 50, "t": 96068.269693984, "age_ms": 91.15213199402206}, {"seq": 54, "t": 96068.292184788, "age_ms": 88.35602200997528}, {"seq": 55, "t": 96068.313174571, "age_ms": 84.10293600172736}, {"seq": 57, "t": 96068.333641652, "age_ms": 55.16381100460421}, {"seq": 58, "t": 96068.393686843, "age_ms": 99.23214800073765}, {"seq": 59, "t": 96068.41603472, "age_ms": 87.64722199703101}, {"seq": 62, "t": 96068.438851047, "age_ms": 88.29739299835637}, {"seq": 63, "t": 96068.460583173, "age_ms": 80.90108999749646}, {"seq": 64, "t": 96068.482137079, "age_ms": 86.05081999849062}, {"seq": 65, "t": 96068.505580824, "age_ms": 77.0972019963665}, {"seq": 66, "t": 96068.529173037, "age_ms": 83.57089899072889}, {"seq": 67, "t": 96068.54921163, "age_ms": 87.60084399546031}, {"seq": 68, "t": 96068.577981576, "age_ms": 82.82388900988735}, {"seq": 69, "t": 96068.597587306, "age_ms": 85.25743198697455}, {"seq": 70, "t": 96068.619340142, "age_ms": 73.91606499732006}, {"seq": 71, "t": 96068.642292687, "age_ms": 80.24392000515945}, {"seq": 72, "t": 96068.664580477, "age_ms": 84.44945998780895}, {"seq": 73, "t": 96068.68721304, "age_ms": 75.2070710004773}, {"seq": 74, "t": 96068.709612838, "age_ms": 80.62952900945675}, {"seq": 75, "t": 96068.731251333, "age_ms": 86.76457799447235}, {"seq": 77, "t": 96068.775727156, "age_ms": 80.59481799136847}, {"seq": 78, "t": 96068.797177222, "age_ms": 85.74804999807384}, {"seq": 79, "t": 96068.843668601, "age_ms": 98.47842999442946}, {"seq": 80, "t": 96068.863950752, "age_ms": 101.69252600462642}, {"seq": 81, "t": 96068.890346076, "age_ms": 112.10808000760153}, {"seq": 82, "t": 96068.909531776, "age_ms": 97.59257599944249}, {"seq": 83, "t": 96068.955357234, "age_ms": 126.70204599271528}, {"seq": 85, "t": 96068.97643044, "age_ms": 97.86822000751272}, {"seq": 94, "t": 96069.024455217, "age_ms": 97.72237700235564}, {"seq": 96, "t": 96069.046867849, "age_ms": 114.25693599449005}, {"seq": 98, "t": 96069.067271925, "age_ms": 88.34464600658976}, {"seq": 100, "t": 96069.092646053, "age_ms": 64.71101200440899}, {"seq": 101, "t": 96069.135808119, "age_ms": 73.66696499229874}, {"seq": 103, "t": 96069.155692702, "age_ms": 61.04946900450159}, {"seq": 104, "t": 96069.206973289, "age_ms": 78.10673299536575}, {"seq": 106, "t": 96069.228615286, "age_ms": 67.35690800996963}, {"seq": 107, "t": 96069.250570554, "age_ms": 87.38879299198743}, {"seq": 108, "t": 96069.270971132, "age_ms": 74.97722700645681}, {"seq": 109, "t": 96069.297978124, "age_ms": 86.72637199924793}, {"seq": 110, "t": 96069.3189Line truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"pid": 992309, "method": "XTest to decoded unique GTK marker; actual buttons/masked entry; submit has no backend; no USB/scanout", "hover": {"samples_ms": [87.1113090106519, 102.87089900521096, 96.50190100364853, 108.63172699464485, 72.52722799603362, 85.02545600640588, 98.86107599595562, 100.82092399534304, 87.1536129998276, 97.57531699142419, 96.88722700229846, 104.92701399198268, 103.99390599923208, 109.76494300120976, 98.36491900205147, 73.20220400288235, 79.4314830127405, 103.4364949882729, 82.17859698925167, 79.94601999234874, 103.81190200860146, 110.54550900007598, 136.48703599756118, 106.79761599749327, 125.9253269963665, 98.79896399797872, 96.08101900084876, 109.67395300394855, 92.68694301135838, 84.92572199611459, 116.49623799894471, 100.4732549918117, 97.41899400250986, 96.09882000950165, 98.32381400337908, 100.45721600181423, 111.7297759919893, 108.82660999777727, 97.75590199569706, 105.75631000392605, 100.05790099967271, 78.97413498722017, 80.54487701156177, 81.65970600384753, 105.83069499989506, 95.72721899894532, 106.66842199862003, 100.05586800980382, 101.52218099392485, 80.98503699875437, 78.63811799325049, 104.90780200052541, 104.89992899238132, 92.74967899546027, 82.48752399231307, 104.4486879982287, 118.50308100110851, 98.12315399176441, 94.79266399284825, 72.79503700556234, 79.19641499756835, 81.32486400427297, 102.13561401178595, 76.83112300583161, 102.4570540030254, 106.38229599862825, 104.60621300444473, 99.12161000829656, 98.30371699354146, 78.30765000835527, 82.22706000378821, 76.31600899912883, 80.13740999740548, 66.9989199959673, 77.76102999923751, 85.79469700634945, 93.33715900720563, 105.40515500179026, 105.06213099870365, 95.37430599448271, 100.05210600502323, 101.07797200907953, 103.81517000496387, 108.07847800606396, 113.98719999124296, 121.13705200317781, 99.57607599790208, 98.3177349990001, 95.65404300519731, 102.52708499319851, 82.40092100459151, 75.12797799427062, 80.23980600410141, 106.1445989907952, 101.77599400049075, 112.86800500238314, 94.68302199093159, 97.40301099373028, 96.17063400219195, 106.07460199389607], "p50": 98.34436650271527, "p95": 116.49623799894471, "maximum": 136.48703599756118}, "click_release": {"samples_ms": [127.60758399963379, 145.76077400124632, 150.2157249924494, 156.89158799068537, 133.79953800176736, 161.30133099795785, 146.99345899862237, 143.52383599907625, 147.02817700162996, 114.89730200264603, 130.62569900648668, 144.6882629970787, 125.05650300590787, 136.80248700256925, 128.17873500171117, 158.4013959945878, 159.26800099259708, 161.86227400612552, 158.5848749964498, 142.51374700688757, 139.12317300855648, 140.18491699243896, 143.20184499956667, 149.1123229934601, 168.7099590053549, 159.49146100319922, 148.41023599728942, 140.70617499237414, 138.37209300254472, 154.04711100563873, 130.85763300477993, 134.86396700318437, 128.90332499227952, 127.60677699407097, 126.05674599763006, 150.15017898986116, 144.62852499855217, 150.20910000021104, 126.41699200321455, 148.3163419907214, 142.78302699676715, 146.12868799304124, 123.85743399499916, 123.07484001212288, 136.6254989989102, 126.70606700703502, 120.79588600317948, 131.11639200360514, 146.16487501189113, 122.72628300706856, 137.91885400132742, 157.55675699620042, 136.30232399736997, 150.22693399805576, 125.303648004774, 117.06316900381353, 136.13636400259566, 129.16035200760234, 128.00877199333627, 148.34701600193512, 154.81607399124186, 143.84394099761266, 142.5899739988381, 120.58152700774372, 139.13814201077912, 127.9066910065012, 145.02324600471184, 147.42267401015852, 151.29191800951958, 160.4693050030619, 152.86558000661898, 154.04400500119664, 157.05247600271832, 110.67902400100138, 121.40352399728727, 136.87087199650705, 134.37285899999551, 130.66696100577246, 132.13473600626457, 133.78511200426146, 151.62680301000364, 132.58102899999358, 121.09638898982666, 141.08053100062534, 130.46162801038008, 133.31287901382893, 148.30682300089393, 125.12986299407203, 141.18671500182245, 131.54729999951087, 153.9159940002719, 152.387550988351, 137.01295899227262, 131.8979140050942, 132.53204998909496, 129.04841698764358, 141.322659997968, 152.74809100083075, 132.7024009951856, 127.12970100983512], "p50": 139.1306575096678, "p95": 159.49146100319922, "maximum": 168.7099590053549}, "masked_character": {"samples_ms": [106.87107600097079, 60.395221997168846, 129.88790900271852, 81.40873699449003, 82.52940198872238, 78.23487700079568, 73.30126300803386, 74.75503800378647, 94.98682800040115, 87.79962999687996, 103.40087000804488, 104.13300999789499, 99.93590699741617, 87.83259299525525, 85.21673300128896, 68.77601699670777, 79.34446699800901, 80.91958401200827, 96.57157800393179, 104.11288699833676, 102.64832401298918, 100.73368200391997, 80.56197699625045, 75.79987400094979, 70.91701099125203, 94.71032100555021, 99.61739399295766, 91.05459200509358, 76.97158800147008, 78.9352349966066, 81.99767299811356, 77.3265750030987, 72.2535329987295, 77.20902499568183, 80.37442801287398, 78.1750999885844, 9Line truncated
|
||||
|
After Width: | Height: | Size: 172 KiB |
@@ -0,0 +1 @@
|
||||
{"pid": 1192725, "sent": 300, "elapsed": 7.524139223998645, "frames": [{"seq": 0, "t": 109109.676613549, "age_ms": null}, {"seq": 1, "t": 109109.747257562, "age_ms": 77.29586301138625}, {"seq": 2, "t": 109109.769030145, "age_ms": 82.04231000854634}, {"seq": 3, "t": 109109.790895183, "age_ms": 70.94908700673841}, {"seq": 4, "t": 109109.812767805, "age_ms": 75.52170599228702}, {"seq": 5, "t": 109109.834917502, "age_ms": 82.2730119980406}, {"seq": 6, "t": 109109.855947815, "age_ms": 85.83795100275893}, {"seq": 7, "t": 109109.875336091, "age_ms": 71.58898501074873}, {"seq": 8, "t": 109109.905362604, "age_ms": 85.62329100095667}, {"seq": 9, "t": 109109.927642089, "age_ms": 91.41037399240304}, {"seq": 10, "t": 109109.950237148, "age_ms": 80.13924000260886}, {"seq": 11, "t": 109109.972660129, "age_ms": 85.62183199683204}, {"seq": 12, "t": 109109.997210174, "age_ms": 77.17365799180698}, {"seq": 13, "t": 109110.016767612, "age_ms": 80.01674299885053}, {"seq": 14, "t": 109110.040466307, "age_ms": 87.66810699307825}, {"seq": 15, "t": 109110.063882967, "age_ms": 77.01674599957187}, {"seq": 16, "t": 109110.087882361, "age_ms": 84.4347829988692}, {"seq": 17, "t": 109110.115056456, "age_ms": 95.75987499556504}, {"seq": 18, "t": 109110.138091627, "age_ms": 83.73101099277847}, {"seq": 19, "t": 109110.164087423, "age_ms": 94.47687001375016}, {"seq": 20, "t": 109110.213589711, "age_ms": 108.76696099876426}, {"seq": 22, "t": 109110.240553521, "age_ms": 86.96492199669592}, {"seq": 23, "t": 109110.266036582, "age_ms": 96.02003800682724}, {"seq": 24, "t": 109110.287689877, "age_ms": 83.64643401000649}, {"seq": 25, "t": 109110.312530123, "age_ms": 91.71661900472827}, {"seq": 26, "t": 109110.338124889, "age_ms": 83.04299299197737}, {"seq": 27, "t": 109110.359621856, "age_ms": 89.91329600394238}, {"seq": 28, "t": 109110.38763651, "age_ms": 84.11162800621241}, {"seq": 29, "t": 109110.409038105, "age_ms": 88.06039100454655}, {"seq": 30, "t": 109110.43359515, "age_ms": 80.2897379908245}, {"seq": 31, "t": 109110.457923828, "age_ms": 87.78156599146314}, {"seq": 32, "t": 109110.47986149, "age_ms": 75.99740300793201}, {"seq": 33, "t": 109110.501125713, "age_ms": 80.50468999135774}, {"seq": 35, "t": 109110.551046823, "age_ms": 80.55077301105484}, {"seq": 36, "t": 109110.572806282, "age_ms": 86.194068993791}, {"seq": 38, "t": 109110.595672585, "age_ms": 90.81218700157478}, {"seq": 39, "t": 109110.617865156, "age_ms": 110.78757200448308}, {"seq": 41, "t": 109110.640004938, "age_ms": 87.40299299824983}, {"seq": 42, "t": 109110.683985551, "age_ms": 97.41270499944221}, {"seq": 44, "t": 109110.706069918, "age_ms": 86.39472999493591}, {"seq": 46, "t": 109110.750537601, "age_ms": 79.92924899735954}, {"seq": 47, "t": 109110.799899018, "age_ms": 113.81498500122689}, {"seq": 48, "t": 109110.821887429, "age_ms": 101.75987301045097}, {"seq": 50, "t": 109110.844030419, "age_ms": 91.46637600497343}, {"seq": 51, "t": 109110.888398646, "age_ms": 101.81616300542373}, {"seq": 52, "t": 109110.912002844, "age_ms": 108.15214799367823}, {"seq": 53, "t": 109110.934274455, "age_ms": 97.4827030004235}, {"seq": 55, "t": 109110.9774533, "age_ms": 107.82986499543767}, {"seq": 56, "t": 109110.999278382, "age_ms": 95.96433000115212}, {"seq": 58, "t": 109111.02062952, "age_ms": 84.52986700285692}, {"seq": 59, "t": 109111.065194325, "age_ms": 94.49670599133242}, {"seq": 60, "t": 109111.087178944, "age_ms": 99.93846599536482}, {"seq": 61, "t": 109111.109252228, "age_ms": 106.28903500037268}, {"seq": 62, "t": 109111.133034337, "age_ms": 96.38256800826639}, {"seq": 63, "t": 109111.154361267, "age_ms": 101.17976400943007}, {"seq": 65, "t": 109111.198051391, "age_ms": 94.4450849929126}, {"seq": 66, "t": 109111.220509081, "age_ms": 100.19221200491302}, {"seq": 67, "t": 109111.242965313, "age_ms": 106.770857993979}, {"seq": 68, "t": 109111.266654676, "age_ms": 96.72060499724466}, {"seq": 69, "t": 109111.295130735, "age_ms": 108.40822799946181}, {"seq": 70, "t": 109111.317757295, "age_ms": 115.2411989896791}, {"seq": 72, "t": 109111.336481175, "age_ms": 83.07478700589854}, {"seq": 75, "t": 109111.366233823, "age_ms": 62.60299800487701}, {"seq": 76, "t": 109111.388178194, "age_ms": 68.87948499934282}, {"seq": 77, "t": 109111.408492779, "age_ms": 54.69555799209047}, {"seq": 78, "t": 109111.433998299, "age_ms": 64.71956300083548}, {"seq": 79, "t": 109111.476993984, "age_ms": 73.61659999878611}, {"seq": 81, "t": 109111.500385563, "age_ms": 63.600469002267346}, {"seq": 82, "t": 109111.541699838, "age_ms": 71.34691398823634}, {"seq": 83, "t": 109111.571631273, "age_ms": 84.95627499360126}, {"seq": 84, "t": 109111.594858649, "age_ms": 92.20427599211689}, {"seq": 85, "t": 109111.616495321, "age_ms": 79.5576800010167}, {"seq": 86, "t": 109111.638547897, "age_ms": 85.05252200120594}, {"seq": 87, "t": 109111.663801132, "age_ms": 77.20224700460676}, {"seq": 88, "t": 109111.682138857, "age_ms": 77.87831099994946}, {"seq": 89, "t": 109111.703820153, "age_ms": 84.54532899486367}, {"seq": 90, "tLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"pid": 953865, "sent": 300, "elapsed": 7.319189985995763, "frames": [{"seq": 0, "t": 94358.472802896, "age_ms": null}, {"seq": 1, "t": 94358.53552988, "age_ms": 83.28451600391418}, {"seq": 2, "t": 94358.580303368, "age_ms": 94.20349900028668}, {"seq": 4, "t": 94358.602522256, "age_ms": 81.65320199623238}, {"seq": 5, "t": 94358.623950716, "age_ms": 87.12027700676117}, {"seq": 6, "t": 94358.647086908, "age_ms": 77.10022298851982}, {"seq": 7, "t": 94358.668776705, "age_ms": 83.21188999980222}, {"seq": 8, "t": 94358.712293967, "age_ms": 91.74442299990915}, {"seq": 10, "t": 94358.735776372, "age_ms": 83.36793300986756}, {"seq": 11, "t": 94358.757000955, "age_ms": 87.24569500191137}, {"seq": 13, "t": 94358.77889813, "age_ms": 59.182311000768095}, {"seq": 14, "t": 94358.823030817, "age_ms": 69.91637400642503}, {"seq": 16, "t": 94358.844720323, "age_ms": 57.29811800119933}, {"seq": 17, "t": 94358.866259618, "age_ms": 63.85691599280108}, {"seq": 19, "t": 94358.910305679, "age_ms": 57.354118005605415}, {"seq": 20, "t": 94358.930264994, "age_ms": 61.201545991934836}, {"seq": 22, "t": 94358.980826395, "age_ms": 61.07525299012195}, {"seq": 23, "t": 94359.002481192, "age_ms": 66.60970399389043}, {"seq": 24, "t": 94359.02434745, "age_ms": 86.54101900174282}, {"seq": 25, "t": 94359.046538045, "age_ms": 76.0114160075318}, {"seq": 26, "t": 94359.068795725, "age_ms": 83.11155500996392}, {"seq": 27, "t": 94359.089309798, "age_ms": 69.46720200357959}, {"seq": 28, "t": 94359.113318377, "age_ms": 76.26808699569665}, {"seq": 30, "t": 94359.135309469, "age_ms": 65.18139199761208}, {"seq": 31, "t": 94359.180451045, "age_ms": 76.83509300113656}, {"seq": 33, "t": 94359.202496388, "age_ms": 66.25794699357357}, {"seq": 34, "t": 94359.252085649, "age_ms": 81.69403299689293}, {"seq": 35, "t": 94359.276868029, "age_ms": 91.07299400784541}, {"seq": 36, "t": 94359.299706132, "age_ms": 80.02100900921505}, {"seq": 37, "t": 94359.321712975, "age_ms": 84.67024000128731}, {"seq": 39, "t": 94359.343381771, "age_ms": 87.70507300505415}, {"seq": 40, "t": 94359.36735914, "age_ms": 80.80064599926118}, {"seq": 41, "t": 94359.387642792, "age_ms": 84.83357600925956}, {"seq": 42, "t": 94359.411331991, "age_ms": 74.62160299473908}, {"seq": 43, "t": 94359.434819937, "age_ms": 81.20548499573488}, {"seq": 45, "t": 94359.477128223, "age_ms": 74.25993100332562}, {"seq": 46, "t": 94359.50165335, "age_ms": 81.74536700244062}, {"seq": 47, "t": 94359.521679748, "age_ms": 84.83415898808744}, {"seq": 48, "t": 94359.546005372, "age_ms": 76.20129099814221}, {"seq": 49, "t": 94359.567836045, "age_ms": 80.29867999721318}, {"seq": 50, "t": 94359.590263477, "age_ms": 87.10977400187403}, {"seq": 51, "t": 94359.614128553, "age_ms": 77.78535500983708}, {"seq": 52, "t": 94359.635944643, "age_ms": 82.8840489994036}, {"seq": 53, "t": 94359.658132612, "age_ms": 88.69646101084072}, {"seq": 55, "t": 94359.700865863, "age_ms": 81.53332199435681}, {"seq": 56, "t": 94359.724700022, "age_ms": 87.3673189926194}, {"seq": 58, "t": 94359.771153823, "age_ms": 84.65215600153897}, {"seq": 59, "t": 94359.791912607, "age_ms": 89.21913600352127}, {"seq": 60, "t": 94359.816619444, "age_ms": 80.09538600163069}, {"seq": 61, "t": 94359.838824039, "age_ms": 86.18371900229249}, {"seq": 63, "t": 94359.860314624, "age_ms": 56.547355008660816}, {"seq": 64, "t": 94359.881965337, "age_ms": 61.730343993986025}, {"seq": 65, "t": 94359.924834797, "age_ms": 71.22976399841718}, {"seq": 67, "t": 94359.955094169, "age_ms": 69.3277800019132}, {"seq": 68, "t": 94359.998721682, "age_ms": 79.10137200087775}, {"seq": 69, "t": 94360.020694399, "age_ms": 84.34444401063956}, {"seq": 70, "t": 94360.042012023, "age_ms": 71.60047799698077}, {"seq": 71, "t": 94360.063317689, "age_ms": 76.54837900190614}, {"seq": 72, "t": 94360.089008915, "age_ms": 86.33334600017406}, {"seq": 73, "t": 94360.110359499, "age_ms": 73.28896000399254}, {"seq": 74, "t": 94360.132210297, "age_ms": 79.17954000004102}, {"seq": 75, "t": 94360.154963524, "age_ms": 85.1617039879784}, {"seq": 76, "t": 94360.176429609, "age_ms": 72.74703499570023}, {"seq": 77, "t": 94360.198263198, "age_ms": 78.55711301090196}, {"seq": 78, "t": 94360.220895964, "age_ms": 84.99807499174494}, {"seq": 79, "t": 94360.242322965, "age_ms": 71.9006050057942}, {"seq": 80, "t": 94360.265077941, "age_ms": 78.76507300534286}, {"seq": 81, "t": 94360.286429982, "age_ms": 84.03381101379637}, {"seq": 82, "t": 94360.307926984, "age_ms": 70.53558599727694}, {"seq": 83, "t": 94360.327421083, "age_ms": 74.20713700412307}, {"seq": 85, "t": 94360.380293386, "age_ms": 76.55333400180098}, {"seq": 86, "t": 94360.402028974, "age_ms": 82.31762099603657}, {"seq": 88, "t": 94360.446102158, "age_ms": 75.77340700663626}, {"seq": 89, "t": 94360.466148098, "age_ms": 80.3398029966047}, {"seq": 91, "t": 94360.514563091, "age_ms": 77.33530399855226}, {"seq": 92, "t": 94360.536196302, "age_ms": 83.06779799750075}, {"seq": 94, "t": 94360.558434439, "age_ms": 86.90530899912119}, {"seq": 95, "t": 94360.580012Line truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"pid": 942073, "method": "XTest to decoded unique GTK marker; actual buttons/masked entry; submit has no backend; no USB/scanout", "hover": {"samples_ms": [90.11059300974011, 95.53625600528903, 73.85868301207665, 98.86247200483922, 109.5367560046725, 77.73236199864186, 83.69032500195317, 101.4592139981687, 97.9124939913163, 101.30783700151369, 100.07610599859618, 104.77434199128766, 104.50833800132386, 145.1978980039712, 127.00374699488748, 104.85658700054046, 90.47312599432189, 87.9230459977407, 94.1251350013772, 85.079249998671, 106.44648100424092, 125.42638400918804, 106.34439600107726, 99.78092000528704, 111.13012699934188, 96.09449100389611, 104.00314800790511, 98.36222999729216, 104.9916150077479, 86.80943401122931, 102.22103400155902, 87.81978199840523, 104.41030999936629, 103.47229699254967, 76.5090710046934, 98.80206199886743, 81.59260298998561, 95.73630499653518, 98.34063400921877, 82.5037790054921, 99.18239600665402, 106.11191000498366, 96.1239300086163, 109.06449300819077, 74.6840789943235, 105.70035999990068, 74.16431899764575, 104.63809099746868, 111.12339200917631, 74.96932899812236, 101.17945699312259, 78.61900400894228, 75.76617099402938, 80.68811599514447, 81.96155099722091, 80.12052500271238, 77.07081000262406, 98.14694500528276, 80.96461700915825, 82.01200699841138, 87.31078999699093, 71.95460901129991, 106.90114900353365, 97.5411409890512, 82.28471499751322, 100.31813400564715, 106.70776599727105, 108.35862300882582, 100.73084800387733, 118.29118100285996, 75.48031900660135, 82.52183499280363, 85.25858299981337, 72.98361700668465, 79.00457699724939, 81.12706099927891, 78.51602499431465, 109.03178899025079, 69.95927898969967, 86.00758700049482, 96.32689600402955, 105.30831399955787, 97.18557499581948, 103.56441501062363, 107.02333301014733, 75.43976599117741, 81.53685099387076, 81.2349720072234, 105.16859900963027, 121.74570100614801, 77.40824700158555, 105.10821799107362, 102.46130599989556, 100.57769299601205, 77.43391201074701, 83.43591200537048, 100.67715200420935, 117.70605499623343, 95.96462298941333, 74.43640800192952], "p50": 97.36335799243534, "p95": 118.29118100285996, "maximum": 145.1978980039712}, "click_release": {"samples_ms": [147.9692130087642, 121.90376900252886, 136.30617599119432, 129.2976139957318, 130.54304900288116, 139.1522859921679, 135.91678299417254, 130.60750099248253, 165.12234299443662, 152.0616229972802, 133.89374400139786, 147.21492399985436, 162.64342700014822, 157.0716340065701, 154.23076300066896, 135.9199659927981, 125.18123700283468, 144.28128699364606, 142.43238099152222, 145.00316500198096, 146.37925999704748, 145.25545400101691, 141.46461099153385, 138.59689900709782, 150.72864599642344, 128.70226200902835, 139.12452499789651, 148.8170299999183, 129.21092800388578, 139.35872999718413, 132.99272599397227, 132.46946499566548, 151.6774289921159, 146.81294100591913, 145.65180000499822, 148.03970300999936, 114.19483699137345, 144.59478000935633, 139.4024549954338, 140.64030500594527, 152.98350600642152, 163.31680300936569, 136.47203501022886, 146.64112000900786, 163.83713499817532, 139.70723400416318, 154.4257970090257, 163.07790899008978, 148.72684200236108, 121.86166099854745, 131.9651219964726, 122.9326690081507, 144.27040300506633, 114.35521900421008, 162.27141900162678, 140.86426900757942, 133.6235439957818, 130.7707170053618, 130.89641999977175, 161.5305610030191, 158.03489000245463, 127.84583399479743, 132.06951299798675, 124.45953499991447, 124.20928198844194, 142.97243701003026, 134.2010280059185, 129.50134299171623, 142.37887698982377, 146.16271400882397, 156.3201339886291, 127.68743399647065, 146.20529201056343, 146.3785379892215, 162.2903179959394, 141.6610609885538, 132.11643599788658, 130.89521299116313, 125.41559898818377, 143.30402700579725, 132.71231300313957, 138.17733300675172, 129.5844349951949, 151.37832700565923, 149.84413600177504, 134.5681979873916, 138.18607000575867, 154.97956798935775, 186.83957900793757, 152.72640899638645, 128.67557299614418, 131.32539099024143, 143.22495300439186, 137.6269230095204, 131.19588399422355, 158.45071399235167, 174.2236489953939, 131.43767300061882, 119.33656499604695, 135.80746999650728], "p50": 140.17376950505422, "p95": 163.31680300936569, "maximum": 186.83957900793757}, "masked_character": {"samples_ms": [89.01831900584511, 79.5498299994506, 79.79541599343065, 77.84851799078751, 82.06548499583732, 81.1522620060714, 77.32584200857673, 79.88028900581412, 74.87377000506967, 57.43860299116932, 61.930904994369484, 52.16520500835031, 63.32392200420145, 76.34728398988955, 58.247986002243124, 88.12579700315837, 77.24620899534784, 74.87784799013752, 80.0328249897575, 76.18977999663912, 92.64318000350613, 75.61606100352947, 76.82503300020471, 74.45842299785, 86.56885800883174, 76.79440500214696, 78.14746299118269, 59.172863999265246, 79.0306390117621, 57.37355200108141, 57.74834800104145, 81.23741199960932, 75.99901698995382, 88.65662400785368, 72.62176899530459, 78.13841699680779, 85.57366799504962, Line truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"pid": 927214, "sent": 300, "elapsed": 7.472922203989583, "frames": [{"seq": 0, "t": 92136.365663562, "age_ms": null}, {"seq": 1, "t": 92136.436387651, "age_ms": 83.4286930039525}, {"seq": 2, "t": 92136.458623772, "age_ms": 89.4368240115}, {"seq": 3, "t": 92136.483032841, "age_ms": 79.78455600095913}, {"seq": 4, "t": 92136.505498215, "age_ms": 85.48468200024217}, {"seq": 5, "t": 92136.531021176, "age_ms": 77.6600239914842}, {"seq": 7, "t": 92136.553035627, "age_ms": 67.25145400559995}, {"seq": 8, "t": 92136.598642469, "age_ms": 78.36032701015938}, {"seq": 9, "t": 92136.620093411, "age_ms": 84.27628899517003}, {"seq": 10, "t": 92136.666320637, "age_ms": 96.1793820024468}, {"seq": 11, "t": 92136.689076807, "age_ms": 102.00550999434199}, {"seq": 12, "t": 92136.711132383, "age_ms": 107.7730109973345}, {"seq": 13, "t": 92136.736310006, "age_ms": 99.76664300484117}, {"seq": 15, "t": 92136.758774214, "age_ms": 89.51790900027845}, {"seq": 16, "t": 92136.784340634, "age_ms": 81.16999299090821}, {"seq": 17, "t": 92136.805870911, "age_ms": 85.63868500641547}, {"seq": 18, "t": 92136.831589583, "age_ms": 78.50382900505792}, {"seq": 20, "t": 92136.853398697, "age_ms": 67.51512399932835}, {"seq": 21, "t": 92136.900460394, "age_ms": 80.42827399913222}, {"seq": 22, "t": 92136.924070868, "age_ms": 88.10038700175937}, {"seq": 23, "t": 92136.948382228, "age_ms": 78.44461900822353}, {"seq": 25, "t": 92136.970128341, "age_ms": 66.94169899856206}, {"seq": 26, "t": 92137.01634915, "age_ms": 79.61742799670901}, {"seq": 27, "t": 92137.039678746, "age_ms": 87.12795600877143}, {"seq": 28, "t": 92137.063626683, "age_ms": 76.7707189952489}, {"seq": 30, "t": 92137.086302061, "age_ms": 67.14324399945326}, {"seq": 31, "t": 92137.131005597, "age_ms": 77.76327600004151}, {"seq": 32, "t": 92137.154351526, "age_ms": 85.24171999306418}, {"seq": 33, "t": 92137.176440352, "age_ms": 73.12745600938797}, {"seq": 34, "t": 92137.223952677, "age_ms": 104.19566299242433}, {"seq": 36, "t": 92137.248492706, "age_ms": 78.25619599316269}, {"seq": 37, "t": 92137.269388889, "age_ms": 82.98184900195338}, {"seq": 38, "t": 92137.295340897, "age_ms": 92.0566080021672}, {"seq": 39, "t": 92137.319096914, "age_ms": 82.50467499601655}, {"seq": 40, "t": 92137.341451452, "age_ms": 88.78785099659581}, {"seq": 41, "t": 92137.362780766, "age_ms": 76.0129539994523}, {"seq": 42, "t": 92137.389681288, "age_ms": 86.4889009972103}, {"seq": 43, "t": 92137.415270457, "age_ms": 95.07977700559422}, {"seq": 44, "t": 92137.436607355, "age_ms": 83.09035100683104}, {"seq": 45, "t": 92137.458260132, "age_ms": 86.81323799828533}, {"seq": 46, "t": 92137.483234751, "age_ms": 79.97501299541909}, {"seq": 47, "t": 92137.505305784, "age_ms": 86.12139499746263}, {"seq": 49, "t": 92137.549462436, "age_ms": 78.7383279966889}, {"seq": 50, "t": 92137.597033971, "age_ms": 111.14384800021071}, {"seq": 53, "t": 92137.646018651, "age_ms": 93.32712600007653}, {"seq": 55, "t": 92137.691585823, "age_ms": 87.87812900845893}, {"seq": 56, "t": 92137.716611776, "age_ms": 79.96626300155185}, {"seq": 58, "t": 92137.739251859, "age_ms": 69.63060999987647}, {"seq": 60, "t": 92137.784985576, "age_ms": 65.75721999979578}, {"seq": 61, "t": 92137.831614138, "age_ms": 78.27573800750542}, {"seq": 63, "t": 92137.854654978, "age_ms": 68.3889670035569}, {"seq": 64, "t": 92137.899964021, "age_ms": 79.8128439928405}, {"seq": 65, "t": 92137.923209322, "age_ms": 87.33095400384627}, {"seq": 66, "t": 92137.947553056, "age_ms": 77.41793300374411}, {"seq": 68, "t": 92137.970501728, "age_ms": 67.92987701192033}, {"seq": 69, "t": 92138.01517522, "age_ms": 78.51140800630674}, {"seq": 70, "t": 92138.040105213, "age_ms": 87.35895500285551}, {"seq": 71, "t": 92138.064739451, "age_ms": 77.80993900087196}, {"seq": 72, "t": 92138.086507439, "age_ms": 83.26477000082377}, {"seq": 73, "t": 92138.111394556, "age_ms": 91.71360300388187}, {"seq": 74, "t": 92138.133192294, "age_ms": 79.95751300768461}, {"seq": 76, "t": 92138.181313918, "age_ms": 77.54072500392795}, {"seq": 77, "t": 92138.203833832, "age_ms": 84.05986099387519}, {"seq": 78, "t": 92138.226027659, "age_ms": 90.03561599820387}, {"seq": 79, "t": 92138.249618589, "age_ms": 79.44241800578311}, {"seq": 80, "t": 92138.274281118, "age_ms": 87.67016400815919}, {"seq": 81, "t": 92138.298936063, "age_ms": 78.8447829982033}, {"seq": 82, "t": 92138.321632147, "age_ms": 84.81178799411282}, {"seq": 83, "t": 92138.345499289, "age_ms": 92.45444199768826}, {"seq": 84, "t": 92138.36768174, "age_ms": 80.89027200185228}, {"seq": 85, "t": 92138.39140713, "age_ms": 88.81176299473736}, {"seq": 86, "t": 92138.41519873, "age_ms": 78.15614799619652}, {"seq": 87, "t": 92138.4347401, "age_ms": 81.34352799970657}, {"seq": 88, "t": 92138.458400156, "age_ms": 88.17737900244538}, {"seq": 89, "t": 92138.483817238, "age_ms": 80.32997199916281}, {"seq": 90, "t": 92138.505953314, "age_ms": 86.68694099469576}, {"seq": 91, "t": 92138.529366324, "age_ms": 92.65044500352815}, {"seq": 92, "t": 92138.553054089, "age_ms"Line truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"pid": 1024531, "sent": 300, "elapsed": 7.525341282002046, "frames": [{"seq": 0, "t": 98093.319173155, "age_ms": null}, {"seq": 1, "t": 98093.360985775, "age_ms": 65.78400199941825}, {"seq": 2, "t": 98093.407245652, "age_ms": 77.83108799776528}, {"seq": 4, "t": 98093.429203986, "age_ms": 66.96989899501204}, {"seq": 5, "t": 98093.474021888, "age_ms": 77.32738900813274}, {"seq": 6, "t": 98093.495807849, "age_ms": 84.13943900086451}, {"seq": 7, "t": 98093.517515645, "age_ms": 71.36698999966029}, {"seq": 8, "t": 98093.539524437, "age_ms": 76.24561600096058}, {"seq": 9, "t": 98093.561372814, "age_ms": 82.8949190035928}, {"seq": 11, "t": 98093.606268298, "age_ms": 76.81114799925126}, {"seq": 13, "t": 98093.628119008, "age_ms": 65.57896400045138}, {"seq": 14, "t": 98093.671019234, "age_ms": 75.00838598934934}, {"seq": 15, "t": 98093.694133131, "age_ms": 82.34134399390314}, {"seq": 16, "t": 98093.715791637, "age_ms": 86.65852100239135}, {"seq": 17, "t": 98093.737738304, "age_ms": 74.90892999339849}, {"seq": 19, "t": 98093.76015163, "age_ms": 64.95130799885374}, {"seq": 20, "t": 98093.804099213, "age_ms": 75.00226199044846}, {"seq": 21, "t": 98093.825446516, "age_ms": 79.66476600267924}, {"seq": 22, "t": 98093.847616887, "age_ms": 85.8523679926293}, {"seq": 23, "t": 98093.86940139, "age_ms": 73.24762499774806}, {"seq": 24, "t": 98093.891337849, "age_ms": 79.01436000247486}, {"seq": 25, "t": 98093.913888256, "age_ms": 85.43324998754542}, {"seq": 26, "t": 98093.93534289, "age_ms": 72.44468000135385}, {"seq": 28, "t": 98093.955917289, "age_ms": 60.908294006367214}, {"seq": 29, "t": 98094.005967602, "age_ms": 76.63848400989082}, {"seq": 31, "t": 98094.027864686, "age_ms": 65.97358199360315}, {"seq": 32, "t": 98094.072485133, "age_ms": 75.7847899949411}, {"seq": 33, "t": 98094.095194496, "age_ms": 82.78437900298741}, {"seq": 34, "t": 98094.116525173, "age_ms": 87.21676099230535}, {"seq": 35, "t": 98094.138000223, "age_ms": 75.1804669998819}, {"seq": 36, "t": 98094.160141429, "age_ms": 80.87049500318244}, {"seq": 37, "t": 98094.181294486, "age_ms": 68.31300200428814}, {"seq": 38, "t": 98094.204322635, "age_ms": 74.31423400703352}, {"seq": 39, "t": 98094.226642047, "age_ms": 80.85358199605253}, {"seq": 40, "t": 98094.247914102, "age_ms": 86.05799400538672}, {"seq": 41, "t": 98094.26946061, "age_ms": 73.09333900047932}, {"seq": 42, "t": 98094.291092866, "age_ms": 78.66466000268701}, {"seq": 43, "t": 98094.31350386, "age_ms": 85.17075800045859}, {"seq": 44, "t": 98094.335262989, "age_ms": 71.97773200459778}, {"seq": 45, "t": 98094.357802314, "age_ms": 78.3738739992259}, {"seq": 46, "t": 98094.379548902, "age_ms": 84.50781099963933}, {"seq": 47, "t": 98094.401070036, "age_ms": 71.68082198768388}, {"seq": 48, "t": 98094.420506955, "age_ms": 74.81180998729542}, {"seq": 49, "t": 98094.450681399, "age_ms": 88.78707099938765}, {"seq": 50, "t": 98094.473970878, "age_ms": 77.78850899194367}, {"seq": 51, "t": 98094.496765406, "age_ms": 84.15781700750813}, {"seq": 53, "t": 98094.518394746, "age_ms": 87.11118300561793}, {"seq": 54, "t": 98094.542130175, "age_ms": 79.14502700441517}, {"seq": 55, "t": 98094.564222091, "age_ms": 85.80191399960313}, {"seq": 56, "t": 98094.587404238, "age_ms": 74.0730310062645}, {"seq": 57, "t": 98094.610675342, "age_ms": 81.04841200110968}, {"seq": 58, "t": 98094.632477054, "age_ms": 87.24738999444526}, {"seq": 59, "t": 98094.654370931, "age_ms": 75.06555500731338}, {"seq": 60, "t": 98094.676831507, "age_ms": 80.49892098642886}, {"seq": 62, "t": 98094.725592968, "age_ms": 79.73884999228176}, {"seq": 63, "t": 98094.747431722, "age_ms": 84.35964700765908}, {"seq": 64, "t": 98094.769321224, "age_ms": 90.94828499655705}, {"seq": 66, "t": 98094.791920922, "age_ms": 79.21269300277345}, {"seq": 67, "t": 98094.813322475, "age_ms": 84.69797500583809}, {"seq": 69, "t": 98094.858018755, "age_ms": 78.85336499020923}, {"seq": 70, "t": 98094.87928556, "age_ms": 83.97931999934372}, {"seq": 71, "t": 98094.926089096, "age_ms": 96.82410099776462}, {"seq": 73, "t": 98094.947632105, "age_ms": 85.60125100484584}, {"seq": 74, "t": 98094.992775503, "age_ms": 96.50910699565429}, {"seq": 76, "t": 98095.014646047, "age_ms": 85.84158000303432}, {"seq": 77, "t": 98095.061367043, "age_ms": 98.89285800454672}, {"seq": 79, "t": 98095.105005758, "age_ms": 109.62367500178516}, {"seq": 80, "t": 98095.127861244, "age_ms": 98.56532199773937}, {"seq": 82, "t": 98095.15042536, "age_ms": 87.42180299304891}, {"seq": 83, "t": 98095.197050401, "age_ms": 101.10977999283932}, {"seq": 85, "t": 98095.217650468, "age_ms": 88.00950399017893}, {"seq": 86, "t": 98095.260126622, "age_ms": 97.2516820038436}, {"seq": 87, "t": 98095.282874777, "age_ms": 104.3941849929979}, {"seq": 88, "t": 98095.305237939, "age_ms": 91.89152299950365}, {"seq": 89, "t": 98095.326449037, "age_ms": 97.11810100998264}, {"seq": 91, "t": 98095.34851062, "age_ms": 86.62440298940055}, {"seq": 92, "t": 98095.395788109, "age_ms": 99.85038700688165}, {"seq": 94, "t": 98095.418243144, Line truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"pid": 1024531, "method": "XTest to decoded unique GTK marker; actual buttons/masked entry; submit has no backend; no USB/scanout", "hover": {"samples_ms": [65.64291699032765, 99.33425798953976, 102.32700299820863, 109.70868000003975, 98.7585209950339, 182.8706480009714, 84.80715801124461, 79.56978600122966, 100.00625500106253, 101.36598399549257, 98.92156400019303, 88.73351600777823, 99.66822199930903, 96.67314399848692, 114.77719199319836, 118.33255300007295, 76.0680960083846, 99.89368099195417, 104.53431600762997, 100.51579600258265, 103.89091000251938, 79.57504500518553, 80.37361499737017, 78.58251901052427, 78.22931600094307, 82.62145399930887, 83.47573599894531, 93.39633099443745, 84.92412998748478, 99.5512770023197, 113.75113901158329, 119.07980799151119, 107.71198599832132, 95.52313499443699, 103.37322000123095, 97.97397500369698, 98.92420998949092, 81.94976599770598, 75.7175300095696, 106.39630199875683, 97.528610000154, 84.75789200747386, 76.85559798846953, 93.30913399753626, 95.63776600407436, 114.1498560027685, 103.19998499471694, 104.384714999469, 83.18204400711693, 92.58319399668835, 121.73803499899805, 97.19845499785151, 97.12233200843912, 95.61006500734948, 107.15405500377528, 99.06509699067101, 106.83964300551452, 95.01653400366195, 96.8575089937076, 103.06816399679519, 105.5840420012828, 119.17666600493249, 112.65539401210845, 100.7535360113252, 89.39883598941378, 107.49822399520781, 111.605412006611, 100.29154700168874, 95.79324099468067, 105.78558799170423, 78.18326099368278, 109.37303499667905, 121.75759801175445, 85.44302800146397, 115.95847801072523, 110.91768000915181, 107.45215299539268, 102.83572399930563, 106.75712300871965, 115.87885800690856, 90.74107800552156, 98.9184119971469, 87.06176000123378, 93.04316800262313, 109.0971320081735, 140.9711519954726, 86.34573199378792, 97.33235600288026, 104.1557939897757, 98.79912799806334, 108.48260700004175, 95.31843199511059, 93.05163200770039, 92.64447199529968, 76.89733800361864, 100.17169499769807, 104.43492198828608, 101.38005200133193, 92.86088899534661, 92.68589499697555], "p50": 98.99465349008096, "p95": 119.17666600493249, "maximum": 182.8706480009714}, "click_release": {"samples_ms": [162.14847900846507, 130.30420799623244, 122.33716000628192, 132.2353080031462, 148.93822399608325, 133.39087800704874, 135.28580800630152, 145.82765099476092, 152.44576599798165, 164.6739990101196, 127.44885199936107, 143.2592829951318, 136.5945069992449, 137.2516270057531, 129.72411401278805, 151.44800298730843, 152.31861599022523, 164.368937999825, 146.63703899714164, 144.24482399772387, 148.93534399743658, 127.93827799032442, 142.3703159962315, 135.1729680027347, 137.68972200341523, 136.42799499211833, 154.37631600070745, 138.60058899444994, 149.04794000904076, 151.02424500219058, 150.99508399725892, 151.2418299971614, 132.15894300083164, 138.96051500341855, 125.18209099653177, 139.49688398861326, 135.75106600183062, 159.0178519982146, 190.11549001152162, 144.64298299571965, 132.51449599920306, 134.7337570041418, 140.63029599492438, 135.5291249928996, 128.49072700191755, 132.50342100218404, 127.07529299950693, 159.63853200082667, 159.87915800360497, 165.30437300389167, 147.45638299791608, 158.94905199820641, 131.43332301115151, 138.10277299489826, 160.68794899911154, 150.7288470020285, 153.25522801140323, 147.21139700850472, 176.91693699453026, 179.55327399249654, 143.5869169945363, 155.83061800862197, 158.66528599872254, 143.04530499794055, 138.76865699421614, 139.085406990489, 149.65117401152384, 153.58745100093074, 149.37089099839795, 130.96231799863745, 151.94656899257097, 146.19177499844227, 130.1538330008043, 131.35869600228034, 130.93724400096107, 142.7209999965271, 156.4128079917282, 158.22461601055693, 158.52707499288954, 155.85223800735548, 167.3545400117291, 125.4009170079371, 121.26455899851862, 134.5611690048827, 126.58186299086083, 141.17433098726906, 142.07731898932252, 144.85948899528012, 143.519887002185, 143.42859599855728, 140.82084500114433, 135.9754540026188, 117.04450700199232, 129.461464995984, 124.64932299917564, 154.55524699063972, 155.39144600916188, 145.3349170042202, 141.26972800295334, 149.77665300830267], "p50": 143.34393949684454, "p95": 165.30437300389167, "maximum": 190.11549001152162}, "masked_character": {"samples_ms": [90.392096011783, 91.82095099822618, 99.64830199896824, 82.61199500702787, 79.6026210009586, 70.33387200499419, 81.62880099553149, 73.21783300722018, 56.71322499983944, 81.47655600623693, 76.84262000839226, 89.10557800845709, 74.85493799322285, 78.6383869999554, 78.74192899907939, 85.72112600086257, 75.40530800179113, 80.67215401388239, 78.7477630074136, 76.83416600048076, 81.43777000077534, 61.22000399045646, 72.4466840038076, 61.07388000236824, 58.1735879968619, 55.65974699857179, 58.47604300652165, 62.22711601003539, 85.6135079957312, 75.25481800257694, 81.74752099148463, 76.60346599004697, 80.57678799377754, 78.19973598816432, 77.3148339940235, 83.13613099744543, 79.05635300267022, 76.813173Line truncated
|
||||
@@ -0,0 +1,2 @@
|
||||
{"label": "A", "nice": 0, "started": 1794382393.3894014, "ended": 1794382437.1806092, "data": {"pid": 1192725, "method": "XTest to decoded unique GTK marker; actual buttons/masked entry; submit has no backend; no USB/scanout", "hover": {"samples_ms": [89.68268800526857, 111.3346990023274, 105.59897900384385, 97.78258300502785, 106.23012800351717, 95.5260350019671, 99.48381698632147, 102.98341099405661, 119.49789100617636, 85.97340701089706, 74.17355799407233, 87.88871600700077, 112.72475100122392, 110.62686500372365, 99.00813500280492, 96.92308001103811, 115.37037500238512, 95.47209300217219, 95.02148399769794, 104.7082790028071, 103.33166000782512, 99.03468599077314, 100.16193900082726, 107.91884199716151, 143.35951600514818, 127.5665990106063, 75.7703940034844, 105.319602007512, 91.244536000886, 92.12213300634176, 91.25620799022727, 108.99185900052544, 101.48140299133956, 100.55947699584067, 104.95358299522195, 79.04979100567289, 105.70780800480861, 97.42796199861914, 107.62399299710523, 103.43522300536279, 106.2669189996086, 123.76457899517845, 101.49920500407461, 120.6199410080444, 108.47418299817946, 101.13434700178914, 103.23515100753866, 114.38023700611666, 132.36088599660434, 81.19406299374532], "p50": 103.10928100079764, "p95": 127.5665990106063, "maximum": 143.35951600514818}, "click_release": {"samples_ms": [146.7716589977499, 163.99312300200108, 158.79318000224885, 170.65369900956284, 163.7746850028634, 146.4978069998324, 127.41819499933627, 153.7276980088791, 138.99581399164163, 146.84430799388792, 133.57391899626236, 155.76696999778505, 133.5791750025237, 165.4671970027266, 152.3067640082445, 149.7953090001829, 131.25875798868947, 149.3324559996836, 131.23922400700394, 127.85921400063671, 148.84014701237902, 144.68811699771322, 164.60013198957313, 158.468625988462, 146.0918750090059, 170.1693310023984, 130.89392099936958, 155.40390899695922, 141.05788299639244, 140.75369099737145, 162.23802499007434, 162.85079601220787, 158.03204600524623, 140.56820499536116, 136.69617199047934, 160.67125799600035, 132.8255900007207, 147.12350199988578, 145.78304599854164, 147.19992400205228, 155.4138620122103, 149.37656000256538, 165.1759249944007, 120.10264999116771, 132.09122300031595, 141.37933499296196, 138.063776990748, 133.2566909986781, 128.58434299414512, 155.90795800380874], "p50": 146.98390499688685, "p95": 165.4671970027266, "maximum": 170.65369900956284}, "masked_character": {"samples_ms": [84.67040699906647, 87.9034269892145, 76.70904499536846, 83.735356995021, 100.68822200992145, 72.58821999130305, 83.92522799840663, 76.96016499539837, 77.23198899475392, 94.09881600004155, 101.72565099492203, 101.30246100015938, 92.1584250027081, 103.62959401390981, 81.94021400413476, 75.4012609977508, 77.49361298920121, 57.60842500603758, 92.96515300229657, 77.81764399260283, 89.1604839998763, 80.61434800038114, 80.60210000257939, 81.88830700237304, 86.31916400918271, 75.81075400230475, 78.13001600152347, 77.312792011071, 77.55486799578648, 82.14555299491622, 94.46544598904438, 97.70459600258619, 72.59990699822083, 73.66970599105116, 64.26200899295509, 78.41525999538135, 78.7112959951628, 77.4851690075593, 83.6843450088054, 76.20946000679396, 80.65606700256467, 78.03815499937627, 77.7365810063202, 92.22757301176898, 107.520622012089, 97.91372399195097, 95.50988901173696, 96.04478800611105, 106.27699999895412, 102.76748800242785], "p50": 81.9142605032539, "p95": 103.62959401390981, "maximum": 107.520622012089}, "synthetic_submit_ms": 79.7426069912035}}
|
||||
{"label": "B", "nice": -10, "started": 1794382437.3939807, "ended": 1794382481.2133698, "data": {"pid": 1192725, "method": "XTest to decoded unique GTK marker; actual buttons/masked entry; submit has no backend; no USB/scanout", "hover": {"samples_ms": [85.75775098870508, 112.70163800509181, 132.5947090081172, 96.10167400387581, 100.60982100549154, 121.30874299327843, 102.12760699505452, 128.57480799721088, 108.5889879905153, 85.22315199661534, 98.83159199671354, 119.34152200410608, 120.51923699618783, 107.4211970117176, 102.60330900200643, 81.0247469926253, 119.50835799507331, 92.98707899870351, 112.17142498935573, 110.95433900482021, 109.64334399614017, 96.84979300072882, 100.34938900207635, 93.86292900308035, 102.02058700087946, 81.75010999548249, 113.11961300089024, 105.7925959903514, 98.15933900245, 103.36250999534968, 93.63661099632736, 105.48490298970137, 91.04844399553258, 95.75462799693923, 83.91042400035076, 107.58046599221416, 83.59543498954736, 74.65905100980308, 116.7078849975951, 96.7701869958546, 117.91447699943092, 97.29633800452575, 83.84451300662477, 104.49328098911792, 81.74166700337082, 102.64679799729493, 96.86468899599276, 106.67925399320666, 98.22410899505485, 100.67228101252113], "p50": 101.34643400670029, "p95": 121.30874299327843, "maximum": 132.5947090081172}, "click_release": {"samples_ms": [130.12648299627472, 129.1631390049588, 159.59118500177283, 172.76710500300396, 146.17610900313593, 131.0102159914095, 131.41153700416908, 137.711636009044, 137.4858939961996, 131.4783330017235, 136.3595190050546, 147.43404700129759, 149.82330899510998, 132.25736099411733, 127.8851230017608, 123.22327500442043, 135.29760600067675, 130.0293959939154, 146.2161039962666, 149.34004899987485, 146.35873200313654, 137.34330399893224, 145.114813989494, 150.9374699962791, 141.73975599987898, 160.08794200024568, 182.81594499421772, 149.1014979983447, 179.90258400095627, 164.41906499676406, 148.80955600528978, 113.03162299736869, 133.23562699952163, 152.27183100068942, 166.7788820050191, 147.87159800471272, 149.88345200254116, 154.38694499607664, 148.85390699782874, 147.26116599922534, 153.9564650011016, 158.93652000522707, 147.32038301008288, 146.73240200500004, 161.0889660078101, 155.47951399639715, 136.10002599307336, 132.2691079985816, 129.36099000216927, 118.66619499051012], "p50": 146.5455670040683, "p95": 172.76710500300396, "maximum": 182.81594499421772}, "masked_character": {"samples_ms": [90.90475700213574, 77.9370700038271, 75.41423400107305, 82.78938400326297, 77.76966200617608, 89.15364700078499, 86.23561200511176, 97.04824301297776, 97.31977699266281, 90.69331199862063, 99.55154100316577, 80.40012899436988, 96.69417400436942, 82.94980200298596, 74.58709899219684, 88.08006301114801, 83.16125698911492, 77.01515300141182, 78.55510601075366, 76.67216399568133, 68.47687100525945, 99.36605900293216, 92.27352599555161, 68.35000299906824, 79.19617400330026, 89.77781000430696, 78.49561500188429, 85.37203099695034, 101.48204199504107, 98.42488401045557, 98.06002100231126, 98.03290000127163, 91.81971300859004, 98.8107520097401, 91.84333799930755, 71.00642898876686, 76.1203599977307, 72.89987399417441, 76.84425500337966, 92.7655639970908, 74.12950399157126, 73.69872900017072, 85.9918139904039, 86.60079599940218, 97.50179899856448, 80.43456700397655, 94.75847000430804, 83.89363100286573, 103.93810999812558, 98.74484899046365], "p50": 86.11371299775783, "p95": 99.55154100316577, "maximum": 103.93810999812558}, "synthetic_submit_ms": 91.19878899946343}}
|
||||
@@ -0,0 +1 @@
|
||||
{"label": "A", "nice": 0, "started": 1794382181.4190962, "ended": 1794382224.8817701, "data": {"pid": 1188195, "method": "XTest to decoded unique GTK marker; actual buttons/masked entry; submit has no backend; no USB/scanout", "hover": {"samples_ms": [87.28364900161978, 105.62444699462503, 78.74687400180846, 99.48829800123349, 78.00023700110614, 81.12183399498463, 98.6325779958861, 79.42702200671192, 87.93025999329984, 98.20064100495074, 81.95743200485595, 101.23357399425004, 132.98560700786766, 101.63810600352008, 119.82199500198476, 97.41171599307563, 78.29452899750322, 127.32281599892303, 103.97748500690795, 97.09673099860083, 101.4701160020195, 81.61883200227749, 96.20047701173462, 91.79092600243166, 98.03470299812034, 102.56354299781378, 95.02627400797792, 82.30568600993138, 78.64685899403412, 82.32085200143047, 113.57940699963365, 94.38317599415313, 92.31795799860265, 104.20732598868199, 112.02750500524417, 98.46432800986804, 101.4295959903393, 94.89095398748759, 103.21074099920224, 83.40086600219365, 100.27230900595896, 106.13955999724567, 95.88375699240714, 80.78996000404004, 100.0305310008116, 75.5372349958634, 118.21355299616698, 96.69660800136626, 109.34865899616852, 95.30366200488061], "p50": 97.25422349583823, "p95": 119.82199500198476, "maximum": 132.98560700786766}, "click_release": {"samples_ms": [122.13225800951477, 135.2331699890783, 141.6951080027502, 145.8325510029681, 133.38728300004732, 127.95343800098635, 142.88245399075095, 143.26248299039435, 148.52163700561505, 146.72795099613722, 146.34063400444575, 127.50021899410058, 157.9745199996978, 138.5461280005984, 152.76758599793538, 150.55362500424962, 158.31373201217502, 160.35182699852157, 155.3376769879833, 152.82039099838585, 164.69402400252875, 165.789485006826, 127.77935899794102, 129.79791800898965, 135.91074700525496, 126.67661700106692, 156.5107420028653, 127.48450599610806, 144.21596999454778, 141.96933999483008, 162.78808000788558, 159.97796900046524, 160.75494200049434, 144.76954699784983, 144.01678199646994, 139.47161399119068, 140.4364140034886, 135.29538399598096, 132.3872829962056, 158.34384100162424, 168.22692299319897, 160.96292399743106, 153.69834400189575, 150.46912898833398, 161.3496679929085, 130.30370700289495, 148.53691100142896, 137.99031799135264, 136.81232200178783, 165.66620199591853], "p50": 145.30104900040897, "p95": 165.66620199591853, "maximum": 168.22692299319897}, "masked_character": {"samples_ms": [115.71126300259493, 94.18350498890504, 84.76912300102413, 97.80675999354571, 76.8080660054693, 59.81119199714158, 95.63070999865886, 95.46767600113526, 65.66941099299584, 63.13608100754209, 91.0554959991714, 90.01428299234249, 85.98913199966773, 78.18265100650024, 72.30489500216208, 90.2729859953979, 75.73010999476537, 71.88724400475621, 86.39133200631477, 102.48611400311347, 98.44520999467932, 80.06442298938055, 83.63051399646793, 73.65906301129144, 62.69627099391073, 74.09625600848813, 80.27442000457086, 78.33548900089227, 126.38884800253436, 92.88886800641194, 78.67351999448147, 75.70503799070138, 71.88842199684586, 82.88475500012282, 79.7783190064365, 85.19205200718716, 75.52917300199624, 78.73302599182352, 76.84484000492375, 106.30450300232042, 77.32082300935872, 84.15317400067579, 97.21648300183006, 105.512367998017, 102.54855200764723, 72.67327600857243, 78.30750200082548, 57.39775799156632, 89.87373700074386, 76.83988800272346], "p50": 80.1694214969757, "p95": 106.30450300232042, "maximum": 126.38884800253436}, "synthetic_submit_ms": 72.00917800946627}}
|
||||