feat: GpuMemTool v1.1 + v2.0(显存监控与释放工具,DSH 会话归档)

This commit is contained in:
jbjf6666 committed 2026-10-29 15:37:18 +08:00
commit 5e186fd988
5 files changed
+3641

No files matched your search

+174
View File
@@ -0,0 +1,174 @@
# GpuMemTool — Windows 显存监控与释放工具
基于 `nvidia-smi` + Windows 性能计数器,列出每个进程占用多少显存,可一键结束进程释放显存,并带显存 / GPU 占用率实时曲线监测。零依赖:系统自带 Windows PowerShell 5.1 + WinForms 即可运行。
本仓库包含两个版本:
| 版本 | 文件 | 说明 |
| --- | --- | --- |
| v1.1 | `GpuMemTool.ps1` / `GpuMemTool.exe` | 稳定版,单文件 exe(约 180 KB),双击即用 |
| v2.0 | `new1022/GpuMemTool.ps1` | 性能优化版:采集单轮 2433ms → 约 420ms(GPU 空闲)/ 970ms(GPU 忙),并修复采集超时导致的背靠背采样问题 |
> v2.0 的详细改动见脚本头部注释。
---
## v1.1 版本说明(根目录文件)
一个面向 Windows 的轻量显存(VRAM)监测与释放工具:**列出每个进程占用了多少显存,并可直接结束进程回收显存**,同时提供显存 / GPU 占用率的实时曲线监测。
基于 `nvidia-smi` + Windows 性能计数器,**零依赖** —— 只用系统自带的 Windows PowerShell 5.1 + WinForms,不需要安装 Python、.NET SDK 或任何第三方库。
**交付形态:单个 `GpuMemTool.exe`(约 180 KB),双击即用,启动时自动请求管理员权限。**
脚本已内嵌在 exe 内部,不需要附带任何其他文件。
> 本文件属于显存工具,与同目录的奶蛙桌宠项目(`README.md` / `src/` / `dist/`)无关。
## 文件说明
| 文件 | 作用 |
| --- | --- |
| **`GpuMemTool.exe`** | **交付主程序:单文件、免安装、双击运行**(内嵌脚本 + 图标 + UAC 提权逻辑) |
| `GpuMemTool.ps1` | 源码(可读可改;运行效果与 exe 完全一致,也会自己请求 UAC) |
| `RunAsAdmin.bat` | 备选入口:双击提权运行 `GpuMemTool.ps1` |
| `GpuMemTool-README.md` | 本说明 |
> 只需要 `GpuMemTool.exe` 一个文件就能用,其余文件可以删除/保留随意。
## 使用方法
1. **双击 `GpuMemTool.exe`** → 弹出 UAC 窗口(标题为 `GpuMemTool.exe`)→ 点「是」→ 主界面出现。
- 点「否」也不会报错:程序会继续以普通权限运行,界面右上角显示红色提示,
可随时点「以管理员身份重启」再试(只是部分进程无法结束)。
2. 首次启动约 5~15 秒完成性能计数器初始化(界面有提示),随后进入实时刷新。
### exe 的运行细节(透明说明)
- 启动时会把内嵌脚本释放到 `%LOCALAPPDATA%\GpuMemTool\GpuMemTool.ps1`(每次校验内容,
一致则不重写),然后用系统自带的 Windows PowerShell 运行它;
- 启动诊断日志:`%LOCALAPPDATA%\GpuMemTool\launcher.log`(仅在启动异常时才有用);
- exe 是免安装的绿色程序,不写注册表、不建服务;删除 exe 即可卸载
(如需彻底清理,再删掉上面那个 `%LOCALAPPDATA%\GpuMemTool` 目录即可);
- exe 未做代码签名,从本机运行不会有 SmartScreen 提示;若通过网络/U盘拷贝过来可能被
标记为「来自 Internet」,此时右键 → 属性 → 勾选「解除锁定」即可。
## 界面说明
- **顶部工具栏**:刷新间隔(1/2/3/5/10 秒)、自动刷新、「只看显存 ≥ 50MB」过滤、
立即刷新(F5)、结束选中进程(Delete)、强制结束、导出监测数据;右上角显示占用最高的进程。
- **6 个指标卡片**:显存占用(已用/总量 + 进度条,≥70% 变黄、≥90% 变红)、GPU 核心利用率、
显存带宽利用率、GPU 温度、功耗、**进程显存合计**(并显示「未归属(驱动/系统)」的部分)。
- **进程列表**:PID、进程名、显存 (MB)、显存占比、GPU 占用 %、数据来源、窗口标题/命令行、
可执行文件路径。**点击任意表头即可排序**(默认按显存从大到小)。
- **实时曲线**:蓝色为显存占用(左轴 MB),紫色为 GPU 利用率(右轴 %),红色虚线为 90% 警戒线。
- **状态栏**:最近更新时间、进程数、采集异常提示、本次已释放的显存总量。
### 右键菜单 / 快捷键
| 操作 | 说明 |
| --- | --- |
| 结束进程 / `Delete` | 结束选中进程(默认**先尝试正常关闭窗口**,3 秒内没退出再终止) |
| 强制结束 | 直接 `Stop-Process -Force` |
| 复制 PID | 把选中进程的 PID 复制到剪贴板 |
| 打开文件所在位置 | 在资源管理器中定位该进程的可执行文件 |
| 查看详细信息 / 双击行 | 显示命令行 + `tasklist /V` 的完整信息 |
| `F5` | 立即刷新 |
支持 Ctrl / Shift 多选,可一次结束多个进程。
## 进程保护机制(安全设计)
结束进程前会依次检查,避免误杀:
1. **禁止结束**(`BlockNames`):`System`、`Idle`、`Registry`、`Memory Compression`、`csrss`、
`wininit`、`services`、`lsass`、`smss`、`winlogon`、`fontdrvhost`、`MsMpEng` 等 ——
结束它们会导致系统蓝屏或不可恢复。
2. **保护自身**:本工具自己的 PID,以及直接父进程(控制台宿主 `powershell.exe` / `cmd.exe` /
Windows Terminal,结束它会连带关掉本窗口)。
3. **二次确认**(`WarnNames`):`dwm`、`explorer`、`svchost`、`SearchHost`、
`StartMenuExperienceHost` 等系统外壳进程 —— 允许结束,但要连续确认两次,并提示桌面可能闪烁。
4. **PID 复用保护**:真正结束前会重新读取该 PID 的进程名,若与列表里的名字不一致
(说明 PID 已被系统复用给别的进程),则跳过,避免误杀。
5. 确认框会列出每个待结束进程的名字、PID、占用显存,以及预计可释放的总量。
## 结束进程的真实行为(重要)
`Stop-Process` 有个坑:**它可能"假成功"** —— 调用没报错,但进程被驱动/反作弊挡住而不退出
(典型是卡死的游戏进程:只剩 1 个线程、工作集接近 0,却仍占着 1.6 GB 显存)。旧版本信了它的返回值,
于是显示"已结束"、进程却纹丝不动,看起来就是"按钮不生效"。
现在的处理流程是**三步 + 结果校验**:
1. 先尝试正常关闭窗口,3 秒内没退出就 `Stop-Process`;
2. **轮询确认进程是否真的消失**(不看返回值,只看事实);
3. 没消失就自动回退到 **WMI `Win32_Process.Terminate`** —— 这条路径由 SYSTEM 权限的 WMI 服务执行,
能结束一部分 `Stop-Process` 杀不掉的进程(实测:一个卡死的 1.6 GB 游戏进程就是这样被清掉的);
4. 仍然杀不掉时**如实报告**,并给出建议:按 `Win + Ctrl + Shift + B` 重启显卡驱动,
或重启系统。
所以现在无论成功还是失败,都会弹出一个结果对话框告诉你**到底发生了什么**,不会再"点了没反应"。
### 权限说明
- 结束**自己启动的**普通进程:普通权限通常就够;
- 结束**以管理员身份运行**的进程(很多游戏、部分软件):必须让本工具以管理员身份运行,
否则会得到 `Access is denied`(错误码 5);
- 程序启动时自己会请求 UAC;若你点了「否」,界面右上角会显示红色提示,
确认框里也会提前警告"结束其他用户的进程会失败"。
## 命令行 / 自动化用法
exe 与 ps1 都支持同样的参数(命令行模式**不会**弹 UAC):
```powershell
# 无界面自检:采集一次并打印 GPU 指标 + 逐进程显存表格(便于排错)
GpuMemTool.exe -SelfTest
# 结束指定进程(仍受保护名单约束;系统外壳进程需显式加 -Force 才会结束)
GpuMemTool.exe -KillPid 1234,5678 -Force
# 用源码运行等价写法
powershell -NoProfile -ExecutionPolicy Bypass -File GpuMemTool.ps1 -SelfTest
```
> 在 cmd/PowerShell 里直接敲 `GpuMemTool.exe -SelfTest` 就能看到输出(exe 会自动接回当前控制台)。
## 技术说明(为什么不能只用 nvidia-smi)
Windows(WDDM 模式)下,`nvidia-smi --query-compute-apps=pid,used_gpu_memory` 的
`used_gpu_memory` **通常返回 `[N/A]`** —— 只有 TCC 模式或纯 CUDA 上下文才有效。实测本机
RTX 5060 Laptop 上所有进程该项都是 `[N/A]`,所以**单靠 nvidia-smi 无法回答「哪个进程占用了多少显存」**。
本工具采用双数据源合并:
| 数据 | 来源 |
| --- | --- |
| 显存总量/已用/空闲、GPU 利用率、显存带宽利用率、温度、功耗 | `nvidia-smi --query-gpu=...` |
| 逐进程显存占用 | Windows 性能计数器 `Win32_PerfFormattedData_GPUPerformanceCounters_GPUProcessMemory` 的 **Local Usage** |
| 逐进程 GPU 占用 % | 同计数器集的 `GPUEngine` 的 `UtilizationPercentage`(按 PID 汇总) |
| CUDA 进程显存(若有) | `nvidia-smi --query-compute-apps`,与计数器值取较大者;来源列标注 `CUDA` / `WDDM` / `CUDA+WDDM` |
实测校验:逐进程合计 ≈ nvidia-smi 报告的已用量(例:合计 2377 MB vs 已用 2491 MB,
差值约 114 MB 属驱动/系统保留);界面把差值单独显示为「未归属(驱动/系统)」。
**采集性能**:首次采集需初始化性能计数器,约 5~15 秒(界面有提示);之后每次约 0.1~0.8 秒。
采集在独立 Runspace 中异步执行,界面不会卡顿。
## 常见问题
- **刚打开时曲线是空的?** 正常,前几秒在初始化计数器,界面会提示;第一轮数据到达即出曲线。
- **某个进程的显存很小或为 0?** 它可能只是短暂使用 GPU,或占用的是共享显存(Shared)。
本工具显示的是专用显存(Local / Dedicated)。
- **结束进程后显存没立刻下降?** 显存由驱动异步回收,通常 1~2 秒内刷新;也可能该进程还有子进程在占用。
- **列表里没有某个进程?** 只有「显存 ≥ 1MB 或 GPU 占用 ≥ 0.5%」的进程会被列出;
取消勾选「只看显存 ≥ 50MB」可看到全部。
- **多 GPU 机器**:GPU 级指标取第一块 GPU;Windows 性能计数器无法把进程映射到具体某块显卡,
因此**进程级数据是多块 GPU 的合计**。
- **提示找不到 nvidia-smi?** 程序仍可用(仅性能计数器数据),但 GPU 级指标不可用。
请确认已装 NVIDIA 驱动,或 `nvidia-smi.exe` 位于 `C:\Windows\System32`。
## 注意事项
- 结束进程会**立即丢失该进程未保存的数据**,请确认后再操作。
- 结束 `dwm.exe` / `explorer.exe` 会导致桌面、任务栏短暂闪烁或重启(Windows 会自动恢复),
正在运行的全屏程序可能受影响。
- 本工具不会自动结束任何进程,只有你点了按钮并确认后才会执行。