Argus
文档目录 · v0.3.4 文档首页

使用指南

界面与操作硬件数据的来源与限制常驻、托盘与快捷键设置

开发指南

环境与命令构建与缓存多语言性能基线与测量提交与发布依赖与安全维护Windows 代码签名

架构

架构管理员启动采集层 argus-core前端Tauri 宿主特权服务系统任务管理器替换技术栈

设计

设计原则曲线动画全局快捷键窗口外观

项目

已知问题路线图
搜索文档

采集层 argus-core

crates/argus-core 负责采集系统数据和执行操作,不依赖任何 UI,所有数据结构都可以序列化。

模块

模块 职责
diagnostics.rs 诊断字段:保留原始数值错误码、固定错误类别和直接参与失败的路径;路径限长并转义,不复制任意异常文本。重复失败按原因限频;无文件日志的服务与提权助手使用有界缓冲区,交由宿主回收
collector.rs 把系统与进程采样合成一份快照,并给每个进程附上 GPU 占用和是否拥有任务栏窗口
app_windows.rs 用 EnumWindows 找出拥有任务栏窗口的进程(可见、无所有者、不是工具窗口,排除桌面与任务栏本身),界面据此判断是否归入“应用”。打包应用的外框窗口归到其中核心窗口所属的进程;被 DWM 隐藏的窗口不算,但其他虚拟桌面上的窗口算。每次约 0.3–0.7 ms
process.rs 一次 NtQuerySystemInformation(SystemProcessInformation) 拿到全部进程与线程,按周期计数差量计算 CPU、按字节差量计算 I/O 速率;复用进程表,每个实例缓存一个查询句柄,用于效率模式与退出后的最终周期读数,并校验创建时间防止 PID 复用
paths.rs 用 SystemProcessIdInformation 取映像路径:不需要打开进程、没有访问检查,非管理员也能拿到受保护进程和其他用户进程的路径,再把 NT 路径映射回 DOS 路径
meta.rs 在后台线程解析文件描述、公司名和图标(PNG),按路径缓存;结合系统组件目录与版本资源识别 Windows 组件,不在采样线程重复读取文件
webview.rs 按进程实例缓存 WebView2 的宿主与角色;仅对 WebView2 查询启动参数,成功后不再读取,暂不可用时最多尝试三次。结合父进程、创建时间、会话与运行时路径确定浏览器进程组,复用已验证宿主的文件元数据;快照只携带宿主名称、图标和角色,不携带完整命令行
system.rs 总 CPU(含内核时间)、每个逻辑处理器的 CPU、内存、提交、缓存。以标准权限查询 SystemMemoryListInformation,取得已修改页、各优先级的备用页、空闲与已清零页;内存组成按互不重叠的页列表显示,已缓存为备用与已修改之和。查询不可用时保留原有总量,组成明细留空
cpu.rs 按处理器组读取独立空闲计数与周期计数,校验处理器时钟与原生计数的单位、连续性和分母;异常时重新建立基线或回退时间计数
details.rs 按需查询单个进程:命令行、用户、完整性级别、架构、优先级、版本
services.rs 通过服务控制管理器(SCM):一次 EnumServicesStatusExW 取得全部服务状态;启动类型、路径、描述每个服务要三次 RPC,所以缓存起来偶尔刷新;名称与描述按界面语言从 MUI 读取;启停服务、修改启动类型
startup.rs、startup/packaged.rs 注册表 Run 键、启动文件夹(解析 .lnk)与当前账户的应用包启动任务;传统项目使用 StartupApproved,应用包结合 AppModel 注册状态、首次激活与用户授权标记判断是否启用,并记录禁用时间。显示程序名称和应用包本地化名称,保留原始项目标识;包清单与名称按包版本、位置和清单修改时间缓存,状态每次重新读取
connections.rs TCP / UDP(IPv4 / IPv6)端点与所属进程(netstat -ano 显示的内容);断开 IPv4 TCP 连接
filelock.rs 文件占用:通过 Restart Manager 找出打开文件或加载 DLL 的进程,不需要管理员;整批查询被拒时二分重试,隔离出无法检查的文件
handles.rs 按需枚举系统 File 句柄,复制后用 NtQueryObject 查询类型与名称,以文件 ID 匹配文件(含硬链接)、以路径边界匹配目录及其后代。只在辅助进程运行,流式报告进度与匹配项
actions.rs 结束进程 / 进程树、设置优先级、开关效率模式(EcoQoS 加低优先级,与系统任务管理器相同):都先校验 PID 与启动时间,防止 PID 被复用;结束时拦截关键系统进程
gpu_process.rs 每进程 GPU:每次采样一个 PDH 查询,读出各引擎占用和专用 / 共享 GPU 内存,拒绝无效百分比;除最忙引擎外保留非零节点贡献及完整 LUID、物理适配器和节点身份,供应用与分类汇总使用,避免相加独立引擎
disk_process.rs 优先复用普通进程信息中的磁盘计数尾部,旧系统回退完整进程信息的扩展记录,按 PID、创建时间和来源采样时间换算速率;逐条检查扩展线程数组与磁盘记录边界,不读取字符串及账户数据。Windows 10 的完整记录尾部按 UTF-16 对齐,下一条记录不保证 8 字节对齐,数值按字节解码。普通尾部需同时通过系统版本、返回长度及图像名称边界校验;完整信息查询由管理员宿主的后台读取器或特权服务执行
net_process.rs 每进程网络:以实时 ETW 会话接收 Microsoft-Windows-Kernel-Network 的 TCP / UDP 收发事件,按 PID 累计字节数;本地采集按次换算速率,服务通过 take_bytes 维护多读者的累计计数。启动会话需要相应权限;GUI 与服务使用独立、按构建区分的会话名,并清理各自残留会话
rules.rs 规则引擎:按程序名匹配,新进程出现时套用一次;apply_with 允许宿主后台线程选择本地或服务执行器,规则或权限来源改变时重新检查。分别统计已应用、权限不足和其他执行失败的次数
history.rs 历史记录:把采样按 5 秒一帧汇总(CPU 平均值与最高值、内存、磁盘与网络吞吐量、最忙的 GPU、电池电量与充放电功率,以及 CPU、内存、I/O、GPU、网络各自最高的几个进程),没有采样的 5 秒不写帧(后台刷新间隔长于 5 秒时帧随之变稀),追加写入每天(UTC)一个的二进制文件,保留 7 天。每帧整块写入并刷新,重新打开时截掉崩溃留下的半帧;进程名在文件内只写一次。读取侧按时间范围分桶汇总(空桶不输出,曲线上留出断档),或取离某一时刻最近的一帧;另有占用统计、清除和过期清理。每次采样约 30 µs,每帧约 460 字节
pdh.rs PDH 查询的薄封装,sensors.rs 与 gpu_process.rs 共用
privilege.rs Argus 自身的提权状态、启用 SeDebugPrivilege、提高自身优先级
theme.rs 系统个性化颜色(强调色)
i18n.rs 原生层的文案:编译时嵌入 locales/*/native.json,tr! 按当前语言查找;进程级语言默认取父进程通过 ARGUS_LOCALE 传入的值,否则为 Windows 显示语言,宿主再按设置覆盖
nt.rs windows crate 没有(完整)提供的原生结构,布局按 phnt 头文件的 x64 版本

CPU 占用

整体与各逻辑处理器的占用使用 SystemProcessorIdleInformation 的独立空闲时间,以及 SystemProcessorPerformanceInformation 的总时间差量。部分系统的旧 IdleTime 会把短时运行也计入空闲,不能单独依赖该值。处理器按 (group, processor) 配对;整体占用先合计原始时间再换算,避免将各核量化误差截断后累加。来源缺失时只使用同一来源的成对读数,计数重置或分组变化时重新建立基线。内核占用保留 Windows 时间计数器实际报告的内核运行量,不把新旧空闲时间的差额归为内核工作。

独立空闲查询成功但计数不变、旧空闲计数仍增长时,该处理器在当前区间回退到旧空闲差量;两者均不增长时仍按满载计算。独立计数恢复增长后自动恢复使用,回退区间不参与进程 CPU 的精确空闲比例校验。

进程占用使用 SystemProcessInformation.CycleTime 差量,分母为经过校验的处理器时钟增量乘以全机逻辑处理器数。仅在 Windows 选择无内核切换的 QPC 时基、周期单位与独立空闲计数或完整原生周期总量相符时使用;同时检查时钟速率、计数单调性、采样间隔和处理器数量。该分母覆盖采样间隔内创建并退出的进程,不能用本轮可见进程的周期之和替代。无法确认时基或某条进程计数失效时回退原有时间差量;累计 CPU 时间继续使用 Windows 的用户态与内核态时间,不从占用率反算。上述采集不需要管理员权限或内核驱动。

hardware/

性能页的设备数据。数据来源与限制的用户向说明见硬件数据的来源与限制。

模块 职责
cpu.rs 型号、拓扑(每个逻辑处理器属于哪个核心、是性能核还是能效核)、缓存、虚拟化
sensors.rs 每次采样一个 PDH 查询:整体与每个逻辑处理器的实际频率、ACPI 热区温度、RAPL 功耗(封装 / 核心 / 核显)。都不需要驱动或管理员;机器上没有的计数器直接缺省
battery.rs 电池类驱动 IOCTL:电量、充放电功率、电压、设计 / 完全充电容量、循环次数。标准用户可以只读打开电池设备
memory.rs 解析 SMBIOS(类型 17)中的内存条:速度、插槽、外形规格、DDR 代数
disk.rs 物理磁盘:存储 IOCTL 取型号、容量、SSD、所含的卷和温度,IOCTL_DISK_PERFORMANCE 取活动时间、速率、响应时间。用到的 IOCTL 都是 FILE_ANY_ACCESS,不需要提权
net.rs 网络适配器:接口表(GetIfTable2)取吞吐量,GetAdaptersAddresses 取地址
gpu.rs D3DKMT 节点计时、显存与性能数据,无需额外驱动。各节点分别维护有效基线,零值有效,查询失败或计数重置后重新建立基线;有效进程引擎读数可校正整体及对应引擎的下限。总占用还结合 NVIDIA 核心利用率,并保留实际来源;PCI 地址用于对应 NVML 设备
vendor_gpu/ AMD ADL2 PMLog / Overdrive 与 Intel IGCL 电源域,独立线程加载 System32 库、读取遥测;容量为 1 的请求队列,最短 500 ms 采集间隔,过期缓存不进入快照。ControlLib.dll 加载后固定在进程中直至退出:它注册的 ETW 提供程序不随 ctlClose 和卸载注销,卸载后一旦有跟踪会话启用该提供程序,系统就会调用已卸载的回调,进程崩溃
kernel_sensors.rs 与特权服务共享的固定 CPU 传感器快照;枚举定义的功耗、电压、电流、时钟和限制,每个物理核心的读数、SMU 状态及主板风扇、电源轨和温度;温度类型、VID、设定电压与实测电压分开,宿主按开关异步补充
nvml.rs NVIDIA 板卡功耗、功耗上限及可选的 GPU 核心利用率:只从 System32 加载驱动附带的 nvml.dll,按 PCI 位置匹配,不支持或无效的读数不参与补充。核心利用率用于覆盖部分驱动原生节点计时遗漏的 CUDA 等负载,不替代单独的 Windows 引擎曲线

示例

examples/ 下的示例直接打印采集结果(dump、hardware、m3、lockers、gpu_processes、gpu_diagnostics、history);gpu_compute 提供有界的 CUDA 测试负载。用法见环境与命令。

在 GitHub 查看此页