用途与实际影响
这项功能怎样使用
为什么需要它
平均帧率可能掩盖两秒卡顿,桌面壁纸帧也不能当游戏成绩;一次高温还可能是传感器读错。TimeAudit 先核对这段记录是否完整,再把同一时刻的硬件、画面和程序变化放在一起解释。
举个实际例子
我问:“没开游戏,为什么还显示帧率,显卡温度也高得奇怪?”系统先查帧来自游戏还是桌面;明显不合理的温度改从其他真实来源核对,仍没有可靠值就留空。
最后我会得到什么
先知道这段时间记录是否足够,再看温度、帧率、磁盘和网络是否同一时刻变化;值得深查时打开详细图。给电脑配置项目的只是“是否建议再查一次”的线索,不会直接宣称硬件配置改变。
正常时
取得新鲜可靠的硬件与帧记录时显示实际变化;没开游戏但记录正常时显示等待。
发现问题时
画面确在渲染却没有对应帧、传感器读数越界或记录过期时说明具体问题,不给一个假零。
入口不可用或证据不足时
帧来源或必要数据库不可用时保留空白;不会为看网页而启动游戏或重型采集。
从哪里开始
在 TimeAudit Grafana 的性能大盘选具体时间窗;要查异常原因可在已接入诊断的 AI 对话中说明症状。
需要准备什么
- 卡顿发生时间
- 游戏或桌面场景
- 想比较的硬件指标
从开始到拿到结果
- 1
先核对样本
诊断入口检查时间窗覆盖和最新数据,不用一条孤立数值下判断。
- 2
对齐负载与帧
大盘把显卡、温度、磁盘、网络和 FPS 放在同一时段,注明帧源是否为游戏或桌面。
- 3
解释异常和未知
交回可能相关的变化;越界传感器或缺帧状态明确标记,不把 0 帧和一次高温说成硬件故障。
技术实现与依据
这里保留实现、关键条件、精确入口、历史记录和验证结果。
e5459ce已拒收NVML坏值并真实换代;180/180新GPU样本有效,133个正帧全被拒绝,游戏E2E(端到端验证)仍未验收关键规则与设计选择
先看 1% Low 与帧时,再看平均 FPS。
先确认帧源及采集状态,再解释数值;RTSS 可读但没有唯一有效帧是正常等待,启动后仍收不到帧则是另一种需要排查的状态。
先用 summary 确认窗口覆盖、有效游戏帧和方向;只有问题需要具体时刻、进程或跨曲线关系时才进 Grafana。
只认 NVIDIA 独显,隔离核显与虚拟显示器。
功耗墙、温度墙、空闲降频分开解释。
只在相似负载下判断散热趋势。
TimeAudit 拥有异常阈值和聚合语义;PCConfig 只消费有界 digest,不能绕过 Provider 读取原始行或自行解释阈值。
只有 digest 明确建议时才值得做一次 PCConfig live stable projection recheck;摘要既不进入投影,也不等于配置已经改变。
本模块用到的名词
- 1% Low
- 最差 1% 时段帧率,揭示偶发卡顿。
- frametime(帧时)
- 渲染一帧的毫秒数;尖刺会影响手感。
- RTSS(RivaTuner Statistics Server 帧率工具)
- TimeAudit 当前首选的只读共享内存帧源;选中桌面渲染器时,其 FPS 不自动等于游戏性能。
- LUID(图形设备标识)
- Windows 本机设备身份,用来锁目标独显。
- anomaly digest(异常摘要)
- 给 PCConfig 的有界聚合接口:说明窗口覆盖、异常种类和是否建议重查稳定机器事实,不提供原始时序,也不签发配置变化结论。
专业定义
硬件真值与 RTSS 优先帧链对齐到同一时间轴;PresentMon 仅作后备,并明确区分正常等待、启动中、有负载无帧与采集故障。
解决什么
解决平均值遮蔽卡顿、GPU 混淆、探针故障级联、FPS 归属错误和伪老化趋势。
当前怎样实现
- e5459ce的hardware_worker组合NVML、PDH、LHM与RTSS优先帧链。NVML核心利用率0—100%、核心温度0—120°C、板功率0—2000W、核心/显存时钟0—100000MHz之外或非有限值均拒收;显存温度仅接受0—150°C。这些是宽泛有效性边界,不是正常负载推荐值。失败后清NVML句柄并走既有重初始化;当拍仅合并真实LHM后备,否则NULL。LHM仍只读18085,不另建进程恢复路径。
- `_read_rtss_fps_snapshot` 只读 `RTSSSharedMemoryV2`:先精确 Windows 前台 PID,再 RTSS 最近前台 PID,再已启用的 wallpaper32.exe / wallpaper64.exe 桌面渲染候选,最后只接受一个唯一新鲜来源;布局与关键字段双读不一致、帧龄超过 2000 ms 或候选仍多解时拒绝该帧,不按最高 FPS 猜归属。
- RTSS 映射可用即抑制 PresentMon 启动;映射不可用时,`_presentmon_needed` 还检查真实渲染门与最近 RTSS 帧的 3 秒抑制窗。后备由项目内单 owner 管理 `TimeAuditPresentMon` 会话,RTSS 本身只读、不由 TimeAudit 启停。
- `_resolve_fps_capture_state` 把 active、gated_idle、starting、waiting_frames、source_unavailable、error 六种状态及原因写进 `fact_system_hardware.fps_capture_status / fps_capture_detail`。RTSS 有帧写 rtss_shared_memory_frame、可读无帧写 rtss_no_active_frame;PresentMon 启动宽限 10 秒,过后仍无匹配帧写 waiting_frames。
- `_auto_prepare_lhm_async` 在项目 exe 缺失时仍可下载并解压组件文件;这是文件准备,不是运行实例 ownership(所有权)或第二条恢复路径。
- 独立 `LibreHardwareMonitor` 计划任务是唯一运行 owner,`telemetry_watchdog.ps1` 是登记的唯一自动恢复路径;任务现场分别指向项目 exe 与隐藏 Watchdog launcher。
- 8 月 31 日的运行回读证明当时 hardware_worker blob 与 001cee0 一致,main.py 在该文件落盘后启动;现场 1 个 LHM 活实例与 3 个零线程残影被正确区分。该历史证据不替代9月8日e5459ce的进程换代与新窗口验收。
- activity_worker 用 NVIDIA vendor id 锁独显 LUID。
- Grafana 对齐 FPS、帧时、瓶颈与前台焦点。
- pcconfig_anomaly_digest.py 通过现有 audit-postgres 容器的本地 PostgreSQL socket 对 fact_system_hardware 做索引聚合,窗口固定为 `(after_utc, until_utc]` 且最长 168 小时。
- timeaudit.pcconfig-anomaly-digest.v1 返回 Owner/Profile、next cursor、coverage、聚合异常与 `projection_recheck_recommended`;成功的空窗口也可推进,缺 Docker/PostgreSQL 或非法输出则有界 unavailable。
- 数据库会话锁定 Asia/Shanghai 本地日界。
- CPU封装温度/功率与GPU hotspot只接受真实新鲜传感器或NULL,不以ACPI区域、负载公式、显存温度或核心偏移代替。RTSS current_fps是最近帧倒数,窗口均值另存;历史无来源RTSS行走明确兼容路线,合理极低帧不直接丢弃。缺磁盘/换页/频率计数留NULL,真实0仍保留。
执行流程
- 1
用 timeaudit-diagnostics 对最短够用窗口做一次有界 summary,先核对 coverage、样本数、最新年龄与最大 gap。
- 2
若需要细节,再识别物理 GPU 和传感器并打开对应 Grafana 时间窗。
- 3
先按 RTSS 候选优先级选择新鲜一致帧;映射不可用才允许按渲染门启用 PresentMon 后备,并将来源原因与采集状态一并保存。
- 4
读取时把数据年龄与六种采集状态共同解释:gated_idle 正常等待,starting 暂等,waiting_frames / error / source_unavailable 与状态缺失单独报告。
- 5
每秒采硬件、FPS、网络与系统压力,隔离单个探针失败。
- 6
按时间桶对齐前台、卡顿、温度、磁盘与网络曲线。
- 7
当 PCConfig 提供 exclusive after 与 inclusive until 时,只运行 aggregate filters(聚合筛选),生成不含 raw payload 的 digest;窗口超过 168 小时直接拒绝。
- 8
digest 只把异常信号和重查建议交还 PCConfig;后者若决定重查,必须由自己的 live stable provider 独立裁定 no_change 或 published。
- 9
把 summary 的相关信号与大盘细节、Windows 事件、驱动或 PCConfig 现场交叉判断,不由一条阈值直接给根因。
边界
- 阈值按当前个人工作站调校,不是通用标准。
- 能耗/电源轨含估算,不是外部仪器值。
- 空值不插成传感器真值。
- 数据库为兼容可把缺帧数值保存成 0,消费者必须同时读取采集状态和原因;缺少状态的零值不是健康证明,no_game_frames 摘要也不能替代采集诊断。
- RTSS 可返回用户已启用的 Wallpaper 桌面帧;没有对应游戏与负载证据时,不用正值、历史坏例或截图推导游戏成绩。
- 异常摘要不返回原始遥测行、温度/负载曲线、进程活动、窗口标题、网络标识、凭据或机器标识。
- scheduler jitter(调度抖动)是有界用户态信号,不冒充真实内核 DPC latency,也不建议稳定配置重查。
失败与恢复
- LHM 连续不可达
- hardware worker 只留 CPU/GPU 对应真值字段为空;外部 telemetry_watchdog 先宽限 15 秒,再通过独立 LHM 任务做一次有界端点恢复。
- NVML调用异常或核心指标越界
- 显存温度、降频原因、PCIe等非核心读取失败局部隔离;核心利用率、温度、功率或时钟失败/越界时source_available=false并重新初始化,整组转用真实LHM或NULL,不把坏值清零伪装正常。
- 样本新鲜且 RTSS 映射可读、没有有效帧,或后备明确处于渲染门空闲
- 显示 gated_idle / 正常等待;不启动第二个帧源、不造游戏负载。
- 后备已检测渲染但 10 秒启动宽限后仍没有匹配帧
- 报告 waiting_frames 与 no_fresh_foreground_frame;这是收帧问题,不冒充正常桌面空闲。
- 帧状态缺失、采样陈旧、source_unavailable 或 error
- 分别报告合同缺失、新鲜度、来源或具体采集错误;保留其他有效硬件字段,不以零 FPS 掩盖。
- PCConfig 请求窗口超过 168 小时、时间边界非法或 Provider 输出不合约
- 返回有界 unavailable;不查询原始行、不重启 Docker/PostgreSQL,也不提供可推进的成功窗口。
- 摘要命中异常但现场稳定事实没有变化
- 保留异常作为时序信号;PCConfig 的独立重查返回 no_change,摘要不写入 stable_machine_projection。
真实入口
E:\Projects\Tools\TimeAudit\hardware_worker.py硬件、RTSS 共享内存候选/新鲜度、PresentMon 后备与六态入库
E:\Projects\Tools\TimeAudit\activity_worker.py独显与进程 GPU
E:\Projects\Tools\TimeAudit\grafana_dashboard_contract.py大盘恢复合同
E:\Projects\Tools\TimeAudit\grafana_dashboards\b7d809e5-d072-4d24-ae23-c573bfcabc56__🖥️ 整机硬件能效与系统资源大盘.json硬件大盘 JSON
E:\Projects\Tools\TimeAudit\grafana_dashboards\addmc8x__🚀 前台交互与流畅度诊断舱.json流畅度大盘 JSON
E:\Projects\Tools\TimeAudit\timeaudit_diagnostic_summary.py一次查询的硬件、有效游戏帧、覆盖与信号聚合
E:\Projects\Tools\TimeAudit\TIMEAUDIT_DIAGNOSTIC_SUMMARY_CONTRACT.md诊断摘要 schema(数据结构)、时间窗和因果边界
E:\Projects\Tools\TimeAudit\pcconfig_anomaly_digest.py给 PCConfig 的最长 168 小时只读聚合异常 Provider
E:\Projects\Tools\TimeAudit\PCCONFIG_ANOMALY_DIGEST_CONTRACT.md窗口、coverage、异常、隐私和稳定配置重查边界
E:\Projects\Tools\TimeAudit\telemetry_watchdog.ps1LHM 端点宽限、任务恢复和 crash ghost 过滤
E:\Projects\Tools\TimeAudit\test_runtime_hardening.pyLHM 单 owner 与外部恢复断言
E:\Projects\Tools\TimeAudit\test_presentmon_fps_selection.pyFPS 选择回归
E:\Projects\Tools\TimeAudit\test_fps_capture_contract.pyRTSS 二进制解析、过期帧、前台候选、桌面精确匹配、映射可读无帧与状态入库合同
E:\Projects\Tools\TimeAudit\test_health_presentmon_gate.py明确空闲、缺状态、waiting_frames 与陈旧数据不能互相冒充
E:\Projects\Tools\TimeAudit\test_grafana_dashboard_contract.py大盘合同回归
如何验证
- 2026-09-08的e5459ce已发布并生效;39项相关回归覆盖坏值、非有限/越界、真实LHM后备、无源NULL、恢复有效读数,以及既有RTSS选择/状态和官方诊断摘要。
- 001cee0 的 182 项 + 11 个子测试完整回归通过;LHM/Watchdog 定向断言另为 10/10。
- 8月31日现场健康21/21:当时的单一LHM、18085、GPU电压与120/120条GPU/Vcore真值通过,不等于本批重验全链。
- 8月31日3660样本与9月8日修复后三分钟180样本、133正帧全拒绝均保留原日期。2026-09-14另读一小时:3599硬件样本,2369有效帧、1229拒绝正帧;帧源与拒绝原因分项未返回,不能声称真实游戏或确定故障。
- test_pcconfig_anomaly_digest.py 覆盖窗口、聚合规则、privacy flags(载荷省略标记)与 unavailable;本页本轮没有把该单测冒充 PCConfig consumer(使用方) 或 live projection E2E(端到端验证)。
- Grafana 容器运行,授权截图显示真实界面。
- 本轮未结束 LHM 或阻断 18085,不能把健康现场冒充恢复故障注入;也未启动游戏,FPS E2E(端到端验证) 未形成。
与其他模块的关系
读取采集时间轴并与进程资源对齐;timeaudit-diagnostics 先消费它的有界诊断聚合,必要时再进入 Grafana 深读;PCConfig 只消费另一份零原始载荷的 anomaly digest,并独立决定是否重查稳定事实。可靠性模块防止探针或 Provider 失败扩散。
