You do not need a paid monitoring agent to know what is happening on your Windows VPS. Performance Monitor and Event Viewer have shipped with every Windows Server release for two decades, and together they answer the two questions that matter: what is the box doing right now, and what broke last night? This guide shows you the exact counters and event IDs to watch, plus how to log them automatically.
Monitoring matters most on budget VPS plans where CPU and RAM are capped or shared. Before you pick a provider, our comparison table shows the actual specs you are paying for — knowing your ceiling makes the counters below meaningful.
Step 1: Establish a Baseline
Before you can spot an anomaly you need to know what “normal” looks like. Run your real workload for a week and record idle and loaded values. Task Manager > Performance gives a quick look; Performance Monitor gives precision. The moment something is “off”, you compare against the baseline instead of guessing.
The Counters That Actually Matter
Open perfmon.msc, add these counters, and you cover 90% of VPS troubleshooting:
| Object | Counter | When to worry |
|---|---|---|
| Processor | % Processor Time | Sustained above 85% |
| System | Processor Queue Length | Above 2 per core for minutes at a time |
| Memory | Available MBytes | Below ~10% of total RAM |
| Memory | Pages/sec | Sustained above 20 means heavy paging |
| PhysicalDisk | Avg. Disk Queue Length | Above 2 per disk sustained |
| Network Interface | Bytes Total/sec | Consistently near the NIC limit |
Collect Data Automatically with Data Collector Sets
Clicking around PerfMon is fine for a one-off, but you want history. A Data Collector Set logs counters to disk on a schedule:
logman create counter VPSBaseline -c `
"\Processor(_Total)\% Processor Time" "\Memory\Available MBytes" `
"\PhysicalDisk(_Total)\Avg. Disk Queue Length" `
-f bin -si 60 -o C:\PerfLogs\baseline
logman start VPSBaseline
The set appends a sample every 60 seconds. Export a readable report any time with relog C:\PerfLogs\baseline_*.blg -f csv -o report.csv.
Event Viewer: Where Windows Admits What Broke
When something crashes, Windows writes it down. Filter the System and Application logs to Error and Critical and watch for these:
| Event ID | Source | Meaning |
|---|---|---|
| 41 | Kernel-Power | System rebooted without a clean shutdown (often hypervisor or network related) |
| 6008 | EventLog | Unexpected shutdown was recorded |
| 7000 / 7001 | Service Control Manager | A service failed to start |
| 7031 / 7034 | Service Control Manager | A service crashed, repeatedly in the 7034 case |
| 1001 | Windows Error Reporting | An application crashed and reported it |
Pull the last week of critical system events from PowerShell without opening the GUI:
Get-WinEvent -FilterHashtable @{ LogName='System'; Level=1,2;
StartTime=(Get-Date).AddDays(-7) } |
Select-Object TimeCreated, Id, ProviderName, Message |
Format-Table -AutoSize -Wrap
A Simple Health Script
One script captures the snapshot you want in a single append-only line:
$cpu = (Get-Counter '\Processor(_Total)\% Processor Time').CounterSamples[0].CookedValue
$mem = (Get-Counter '\Memory\Available MBytes').CounterSamples[0].CookedValue
$free = (Get-Volume C).SizeRemaining
'{0:yyyy-MM-dd HH:mm} CPU={1:N0}% RAM_free={2:N0}MB C_free={3:N2}GB' -f `
(Get-Date), $cpu, $mem, ($free/1GB) | Out-File C:\Scripts\perf.log -Append
Schedule it hourly with Task Scheduler and you have a lightweight performance history — no agents, no SaaS, no cost.
What to Do With the Findings
Counters identify the symptom; Get-Process identifies the culprit. When memory pressure is high, list the top consumers:
Get-Process | Sort-Object WS -Descending |
Select-Object -First 5 Name,
@{n='MemMB';e={[math]::Round($_.WS/1MB)}} |
Format-Table -AutoSize
A single process climbing steadily over days is a classic memory leak — restart its service or recycle it on a schedule. Sustained CPU on w3wp.exe points at a specific IIS site; drill into it by app pool. The goal is always the same: turn a vague “server feels slow” into a named process you can act on.
One-Command Health Report
For a broad, unattended snapshot, Performance Monitor can generate a full HTML report of system health, including the Reliability Monitor analysis:
perfmon /report
The report takes about a minute to collect and lands in C:\PerfLogs\System\Reports with a timestamp. It is not a substitute for your own counters, but it is an excellent artifact to grab before opening a ticket with your VPS provider — it shows exactly what the OS thinks is wrong. Read the “Diagnostic Results” section first: it flags failed counters outright and groups findings by subsystem, so you can paste the relevant section straight into a support ticket.
If the counters keep telling you the box is at its ceiling, the honest fix is more hardware. Vultr scales a Windows VPS up in minutes when the numbers say so.
Performance Monitor tells you what is happening now, Event Viewer tells you what already broke, and a scheduled script preserves the history. Together they cover most Windows VPS troubleshooting without spending a cent on monitoring tools. Before you upgrade hardware, compare plans side by side in our comparison table to see whether more RAM or more cores is the cheaper fix.



