gpu-test — GPU 功能性测试插件(Rust)
给用户/产线操作员看的说明见 README-用户版.md。 给客户看的方案说明(含改善前后对比与效益)见 README-客户版.md。
面向产线测试工位的 GPU 功能性检测插件,兼容所有显卡(核显 / NVIDIA / 其他独显),
当前先完成 NVIDIA 深度检测。检测显卡是否被系统识别、驱动是否正常加载、
nvidia-smi 是否稳定(连续采样防"概率性丢失"),对不良显卡自动拦截;
支持 GUI 弹窗人工确认与 --no-gui 自动化两种模式,可接入 e-autotest 测试平台
(R<{json}>R 标准输出 + 退出码 + e-log 文件/stdout 双日志)。
参与开发
-
构建:
just build-win(Windows)/just build-linux(Linux 交叉编译,glibc 2.27 基线) -
测试:
just test;新增检测逻辑请同步补充src/detect.rs中的单元测试 -
架构:
src/detect.rs检测核心(Windows WMI / Linux lspci 枚举 + nvidia-smi 功能检测)、src/gui.rsegui 界面、src/logger.rse-log 日志、src/main.rsCLI/GUI 入口 -
欢迎提交 PR:修复、新显卡厂商支持、新检测项等
-
语言:Rust(egui 弹窗 +
--no-guiCLI 模式) -
平台:Windows 10/11、Linux(Ubuntu 18.04+ / 银河麒麟 V10 / 统信 UOS V20,x86_64)
-
接入方式:e-autotest 插件标准(独立可执行程序 +
R<json>R输出 + 退出码)
一、检测逻辑
| # | 检测项 | 判定 | 对应不良现象 |
|---|---|---|---|
| 1 | 枚举显卡控制器(Windows Win32_VideoController / Linux lspci -nn VGA·3D·Display) |
检测不到任何显卡 → FAIL(枚举异常) | 显卡完全不识别 |
| 2 | NVIDIA 显卡存在时,检查 nvidia-smi 可用性 |
nvidia-smi 不可用或输出为空 → FAIL(Windows 附驱动状态异常明细,Linux 附内核模块未加载明细) |
驱动未装/加载失败 |
| 3 | 功能自检:利用率/功耗/温度/时钟是否有响应 | 无响应/查询失败 → FAIL(GPU 功能不存活) | GPU 功能异常、传感器无读数 |
| 4 | nvidia-smi -L 连续采样 N 次(默认 3) |
任一次失败 → FAIL(概率性丢失) | nvidia-smi 概率丢失、概率性不识别 |
| — | 仅核显 / 无 NVIDIA 独显 | PASS,content 记录"仅核显",不做驱动拦截(不误杀核显机型) | — |
判定规则:有 NVIDIA 独显时,驱动/smi 任一异常即拦截并报明细; 无独显(核显 only) 不算 FAIL,只记录。采样次数可用
--samples调整。
二、构建与自测
Windows 构建需 Visual Studio(MSVC 工具链,GNU dlltool 有缺陷);Linux 交叉编译需
cargo-zigbuild + zig。构建命令统一走 justfile,无独立脚本。
三、部署步骤(接入 e-autotest 平台)
1. 放置插件文件
# 假设 e-autotest 安装在 /opt/e-autotest(Windows 为安装根目录)
# Windows 版:拷贝 gpu-test.exe 到 plugins\gpu-test\
2. 平台注册 APP(extend_app 配置)
在 e-autotest 配置界面"APP 配置"新增一条,或在数据库 extend_app 表插入:
| 字段 | 值 | 说明 |
|---|---|---|
tag |
GPU_TEST |
APP 标识(流程中引用) |
app_type |
读 APP / 读写在读 APP(按工站用途选) | — |
description |
显卡功能性测试(镭晨) |
界面显示名 |
fileinfo.fname |
gpu-test.exe(Windows)/ gpu-test(Linux) |
程序名 |
fileinfo.cwd |
plugins/gpu-test |
工作目录(相对 e-autotest 根,正斜杠) |
fileinfo.exe_type |
WindowsExe / LinuxExe |
原生可执行文件 |
fileinfo.architecture |
X86_64 |
兆芯/海光均为 x86_64 |
fileinfo.platform |
Windows / Linux |
按工站系统选 |
args |
--sn --station --mode --samples 3 --no-gui |
自动化跑批;想去掉弹窗确认用 --no-gui,人工确认工站可省略 |
filter |
留空(插件自行判定) | 插件在 content 中自带 PASS/FAIL 与明细 |
timeout |
30(秒) | 采样 3 次 × smi 约 1s + 余量(GUI 人工确认模式需放宽) |
is_check |
true | 需要解析 R<...>R 结果 |
fileinfoJSON 参考(Linux):
3. 流程挂载(extend_task)
在测试流程(任务配置)中将该 APP 挂到显卡检测工站,on_fail 动作设为拦截
(重测 / 上报 MES NG),实现不良显卡拦截。
4. 验证
# Linux 真机(自动化模式)
# 预期输出一行 R<json>R,content 含显卡明细;退出码 0 = 通过,非 0 = 失败
四、命令行参数
| 参数 | 说明 | 默认 |
|---|---|---|
--sn |
序列号(平台自动传入,手动可省略,仅写日志) | 空 |
--station |
工站(平台自动传入,手动可省略,仅写日志) | 空 |
--mode |
模式(平台自动传入,手动可省略,仅写日志) | 空 |
--samples |
nvidia-smi 稳定性采样次数 | 3 |
--info |
只输出一键同步标识(GPU: 型号 [10de:xxxx] 显存),供平台 filter 比对 |
关 |
--no-gui |
不弹窗,命令行直接输出(自动化/调试) | 关 |
--auto |
GUI 检测完成后倒计时自动关闭 | 关(需人工点确认) |
--close SECS |
自动关闭倒计时秒数 | 5 |
--res PATH |
额外把 R<json>R 写入文件(平台 res_url 方式) |
空 |
四-1、首件基准与量产比对(型号一致性)
功能性检测(驱动/nvidia-smi/稳定性采样)走 GUI 或正常模式拦截;
型号标识单独走 --info 接口,供平台按"首件基准 vs 量产逐台"比对:
- 首件采集:首件运行
gpu-test --info,返回一键同步标识:R<{"content":"GPU 0: NVIDIA GeForce RTX 3060 [10de:2487] 驱动:610.62 显存:12288 MiB VBIOS:94.04.71.00.c2 WMI驱动:32.0.16.1062\nGPU 1: OrayIddDriver Device 驱动:17.50.19.949","status":true,"opts":{...}}>R--info保留字段:型号 + PCI 设备 ID + 驱动版本(nvidia-smi/WMI)+ 显存 + VBIOS; PCI 总线位置、GPU UUID 量产中会变化,不参与一键同步比对。 - 一键同步:在 e-autotest APP 配置中把该 APP 的"校验筛选"填为基准值并保存
(
*10de:2487*按 PCI ID 精确比对,或*RTX 3060*按型号名):UPDATE extend_app SET filter='*10de:2487*' WHERE tag='GPU_TEST_INFO'; - 量产比对:每台执行
--info,平台 filter 自动校验,返回型号与基准不一致 即判 FAIL/NG 拦截;一致则 PASS。
建议注册两个独立 APP:GPU_TEST(功能检测,GUI/--no-gui)与
GPU_TEST_INFO(型号标识,args: --info),职责分离、互不干扰。
五、输出格式(e-autotest 插件标准)
- 单行
R<{json}>R,主程序取最后一个R<...>R标签解析; - JSON:
{"content": "...", "status": true|false, "opts": {...}}; - 退出码:
0= PASS,非0= FAIL(与status一致); - UTF-8 编码,输出后强制 flush;
- stdout 同步输出详细运行日志(e-log 格式,含时间戳),末尾再输出裸
R<...>R供平台解析; - 失败时
content含多行明细(显卡列表 / smi 状态 / 采样失败次数),便于界面与日志定位。
六、注意事项
- Windows 单版本
gpu-test.exe:release 为 GUI 子系统(双击运行只出图形界面、不弹命令行窗口),启动时通过e-log的reattach_windows_terminal()挂父控制台(与 heg-os-active2 同款)——从 cmd/PowerShell 运行也能看到 stdout 日志与R<...>R结果;cmd 对 GUI 程序不等待,如需等待可加start /wait或用平台管道调用。 - 日志框架统一用
e-log(与 e-autotest/etest 生态一致),同时输出到文件logs/gpu-test.log与 stdout(均为 e-log 格式,便于后续按格式筛选数据);显卡功能性测试全流程分步记录(运行开始 → 硬件枚举逐卡 → 驱动/nvidia-smi → 功能自检 → 稳定性每次采样 → 最终判定),每条带时间戳,文件末尾附一行R<...>R平台格式输出,stdout 末尾另附裸R<...>R供平台解析。 - Linux 真机需
lspci(pciutils,Ubuntu 默认已装)与nvidia-smi(随 NVIDIA 驱动安装)。 - 无独显机型(核显 only)默认 PASS,仅记录;若产线要求"必须独显",可自行调整
detect.rs判定。 - 采样次数越多拦截越严(防概率性丢失),但耗时线性增加:
--samples 3约 3~5s。 - GUI 模式在无显示器/远程会话下自动关闭会被系统重绘节流拖慢,自动化场景请用
--no-gui。 - 不良显卡明细(17 块盈通,2026/1–8)见
docs/images.png,作为检测项设计依据。