A real-time system monitoring application for Windows that tracks GPU, CPU, RAM, PCIe bandwidth, and encoder/decoder utilization with beautiful donut-style gauges - and, since v0.11.0, a localhost control API so benchmark harnesses can drive logging and inject phase markers.
Works with any GPU (v0.10.0): NVIDIA cards get the full metric set via NVML; Intel Arc, AMD, and everything else get load / VRAM / video-engine metrics via the Windows WDDM GPU counters (the same source as Task Manager), with temperatures via the optional LibreHardwareMonitor bridge.
- GPU: Load percentage, temperature, clock speed, fan speed
- VRAM: Occupancy (used / total); memory-controller utilization is logged separately (NVML)
- Decoder: Video decode engine utilization (NVDEC on NVIDIA; QSV / VCN via WDDM counters on Intel / AMD)
- Encoder: Video encode engine utilization (NVENC on NVIDIA; QSV / VCN via WDDM counters on Intel / AMD)
- PCIe Bandwidth (NVIDIA/NVML only): TX/RX rates in Gbit/s on the gauge (v0.11.0), rings as % of the link's maximum capability, with live link state (e.g.
PCIe 1.0 x8 (max 4.0 x8)when power management downtrains the link) - CPU: Load percentage, live clock speed; temperature and fan when a sensor source is available (see note below)
- RAM: Memory usage and percentage
- Python processes: Aggregate CPU and memory of all running
python*processes - Multi-GPU (v0.11.0): choose which NVML device to monitor (
--gpu Nor settings)
- Custom donut-style gauges with smooth animations
- Color-coded indicators:
- PCIe: Orange (TX) and Green (RX) dual rings
- Configurable polling intervals (0.1s to 5.0s)
- Export metrics to CSV format
- Logs go to the last-used folder (v0.11.0; first run:
Documents/nvGPUMonitor/) - Start/stop logging on demand - from the UI or the control API
- Recording status in the window title:
nvGPUMonitor - REC 00:14:32 • 872 rows - Every column documented in docs/METRICS_COLUMNS.md (sources, units, semantics)
- An empty CSV field always means "could not read"; a
0is always a real measured zero
A small HTTP API bound to localhost only (default http://localhost:47600/, shown in the app header) lets an external harness drive a run end to end:
curl -X POST "http://localhost:47600/log/start?file=D:\bench\run1.csv"
curl -X POST "http://localhost:47600/mark?label=vsr-pass-start"
curl -X POST "http://localhost:47600/mark?label=vsr-pass-end"
curl -X POST "http://localhost:47600/log/stop"
curl "http://localhost:47600/status"
POST /log/start?file=P&overwrite=1- emptyfile= auto-timestamped name in the remembered folder; an existing file is auto-uniquified (-1,-2, ...) unlessoverwrite=1. Never shows a dialog; the response carries the resolved path.POST /log/stop- idempotent.POST /interval?ms=N- set sampling interval (100-5000 ms).POST /mark?label=L- writesLinto themarkerCSV column of the next sample row, making benchmark logs self-segmenting: slice rows betweenX-start/X-endpairs and aggregate per phase - no wall-clock reconciliation between logs. Markers also show in the on-screen table as a suffix on the Time cell.GET /status- version, logging state, resolved file, row count, interval, GPU backend/name/index.
The port is unreachable from other machines by construction (loopback prefix only); there is no cross-machine mode.
- OS: Windows 10/11
- .NET: .NET 9.0 SDK or Runtime (the MSI installer is self-contained and needs neither)
- GPU: any WDDM GPU. NVIDIA cards with NVML get the full metric set (PCIe, memory-controller utilization, temp/clock/fan built in); Intel Arc / AMD get load, VRAM, and video-engine metrics out of the box. App still works with no GPU at all.
- CPU and non-NVIDIA GPU temperature/clock/fan (optional): most consumer desktops do not expose these via stock Windows WMI. Run LibreHardwareMonitor alongside nvGPUMonitor to populate them. Since v0.11.0 you can start it mid-run - the sensors come back within about a minute (previously a restart of nvGPUMonitor was required).
Quick start:
# Clone the repository
git clone https://github.com/mountlord/nvGPUMonitor.git
cd nvGPUMonitor
# Build
dotnet build nvGPUMonitor.Wpf.csproj -c Release
# Run
dotnet run --project nvGPUMonitor.Wpf.csproj -c ReleaseFor full build instructions, MSI packaging with WiX, the release checklist, and troubleshooting, see docs/BUILDING.md.
- Launch nvGPUMonitor
- Gauges update automatically at the configured polling interval
- View real-time metrics for all monitored components
- Click "Start Log" to begin recording metrics
- Data saves to the last-used folder (first run:
Documents/nvGPUMonitor/metrics-[timestamp].csv); the full resolved path is in the log box's tooltip while recording - Click "Stop Log" when done
Note: the CSV ts column is ISO-8601 UTC; the filename timestamp is local time.
nvGPUMonitor --gpu 1 # monitor NVML device index 1 (dual-GPU boxes)
nvGPUMonitor --port 47601 # bind the control API to another port
CLI flags apply to that launch only. Persistent defaults (interval, port, GPU index, last log folder, window position) live in %APPDATA%\nvGPUMonitor\settings.json and are managed automatically; delete the file to reset everything.
nvGPUMonitor/
├── Controls/ # Custom WPF controls
│ ├── DonutGauge.* # Single-metric gauge
│ └── DualDonutGauge.* # Dual-metric gauge (PCIe TX/RX)
├── Models/ # Data models
├── Services/ # Business logic (metrics, settings, control API)
├── Utils/ # Helper utilities (NVML bindings)
├── docs/ # Build guide, changelog, CSV column reference
├── MainWindow.* # Main UI
└── Installer/ # WiX installer project
- Framework: .NET 9.0, WPF (Windows Presentation Foundation)
- GPU Interface: NVIDIA NVML (Management Library), with a vendor-agnostic WDDM performance-counter fallback (
GPU Engine/GPU Adapter Memory) for Intel Arc / AMD - System Metrics: Windows performance counters and WMI (with optional LibreHardwareMonitor bridge)
- Control API:
HttpListener, loopback prefix only
nvGPUMonitor is released under the GNU General Public License v3.
THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED. USE AT YOUR OWN RISK. The authors and contributors shall not be liable for any damages arising from the use of this software, including but not limited to system instability, data loss, or hardware issues. See the LICENSE file for full terms.
If you find this software useful, consider donating to my favorite charity: Save The Children
v0.11.0 - Benchmark harness release: localhost control API (start/stop logging, interval, status), phase markers via a new marker CSV column (additive schema change - existing column positions unchanged), NVML GPU device selection, persisted settings (last log folder, interval, port, window position), sensor recovery when LibreHardwareMonitor is started mid-run, reorganized bottom bar, PCIe rates in Gbit/s, and a recording indicator in the title bar. Full history in docs/CHANGELOG.md.
