Files

10 KiB
Raw Permalink Blame History

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):

# 无界面自检:采集一次并打印 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 属驱动/系统保留);界面把差值单独显示为「未归属(驱动/系统)」。

采集性能:首次采集需初始化性能计数器,约 515 秒(界面有提示);之后每次约 0.10.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 会自动恢复), 正在运行的全屏程序可能受影响。
  • 本工具不会自动结束任何进程,只有你点了按钮并确认后才会执行。