How to Configure Windows Performance Monitor (perfmon) on Windows Server 2016
Windows Performance Monitor (perfmon) is a built-in diagnostic tool in Windows Server 2016 that provides real-time and historical visibility into hundreds of system performance counters. It can monitor CPU utilization, memory pressure, disk I/O, network throughput, and application-specific metrics from SQL Server, IIS, Active Directory, and others. Performance Monitor uses Data Collector Sets (DCS) to organize and schedule counter collection, and produces reports and logs that can be analyzed over time. This guide covers launching perfmon, creating Data Collector Sets, configuring counter alerts, and exporting data for analysis.
Step 1: Launch Windows Performance Monitor
Open Performance Monitor by pressing Win+R and typing perfmon, then pressing Enter. You can also launch it from Server Manager > Tools > Performance Monitor, or from PowerShell:
perfmon.exe
The left-hand panel shows three main sections: Monitoring Tools (for real-time viewing), Data Collector Sets (for scheduled collection), and Reports (for reviewing collected data).
Step 2: Add Counters to the Real-Time View
Click Performance Monitor under Monitoring Tools to open the real-time graph. Click the green plus (+) button in the toolbar to add counters. Select a performance object such as Processor, Memory, PhysicalDisk, or Network Interface. Select specific counters and instances, then click Add and OK.
Key counters to add for baseline monitoring:
Processor: % Processor Time (_Total) — overall CPU usage. Memory: Available MBytes — free physical memory. Memory: Pages/sec — excessive paging indicates memory pressure. PhysicalDisk: Avg. Disk Queue Length (_Total) — disk I/O backlog. Network Interface: Bytes Total/sec — network throughput. System: Processor Queue Length — threads waiting for CPU time.
Step 3: Create a Data Collector Set
Data Collector Sets automate counter collection on a schedule. Right-click Data Collector Sets > User Defined > New > Data Collector Set. Give it a name such as BaselineCollection. Select Create manually (Advanced) and click Next. Choose Performance counter and click Next.
Add the counters listed in Step 2 plus any application-specific ones. Set the sample interval to 15 or 60 seconds depending on desired granularity. Set a log file location such as D:PerfLogs. Click Finish.
Alternatively, create a DCS via PowerShell:
$counters = @(
"Processor(_Total)% Processor Time",
"MemoryAvailable MBytes",
"MemoryPages/sec",
"PhysicalDisk(_Total)Avg. Disk Queue Length",
"Network Interface(*)Bytes Total/sec"
)
New-Item -Path "HKLM:SYSTEMCurrentControlSetServicesSysmonLogLog QueriesBaselineCollection" -Force
logman create counter BaselineCollection -c $($counters -join " ") -si 15 -f csv -o "D:PerfLogsBaseline" --v
Step 4: Schedule the Data Collector Set
Right-click your DCS and select Properties. On the Schedule tab, click Add and configure start time, days of the week, and an optional stop condition (duration or max file size). Setting a stop condition prevents log files from growing indefinitely.
To start and stop via logman from the command line:
logman start BaselineCollection
logman stop BaselineCollection
Step 5: Configure Performance Alerts
Performance alerts trigger actions when a counter exceeds a threshold. Expand Data Collector Sets > User Defined, right-click New > Data Collector Set, name it PerformanceAlerts. Choose Create manually, select Performance Counter Alert, and click Next.
Add a counter such as Processor(_Total)% Processor Time with an alert threshold of 90 (above). On the Alert Action tab, configure the alert to log to Event Log and optionally start a Data Collector Set for deeper diagnostics when the threshold is breached.
Create an alert via logman:
logman create alert HighCPU -c "Processor(_Total)% Processor Time" -th "Processor(_Total)% Processor Time>90" -si 10 -a "eventlog"
Step 6: Analyze Collected Data
In the Performance Monitor Reports section, browse to your DCS name and double-click a report to open it. The report renders as a time-series graph. Right-click the graph to change from Line to Bar or Report view for easier comparison.
CSV log files saved by logman can be opened in Excel for trend analysis. Use the Time Range feature in perfmon to zoom into specific intervals where performance degraded.
Step 7: Use Built-In System Diagnostics
Windows Server 2016 includes the System Diagnostics report under Reports > System > System Diagnostics. Right-click System Diagnostics under Data Collector Sets > System and click Start to generate a one-minute performance snapshot with automatic analysis and recommendations. The resulting HTML report highlights top resource consumers and flags configuration issues.
Step 8: Remote Performance Monitoring
Performance Monitor can connect to remote servers. In the Performance Monitor snap-in, click Performance Monitor, then click the change icon in the toolbar to specify a remote computer name. Alternatively, use Get-Counter in PowerShell:
Get-Counter -ComputerName WS2016-REMOTE -Counter "Processor(_Total)% Processor Time" -SampleInterval 5 -MaxSamples 12
Best Practices
Establish a performance baseline on a healthy, lightly loaded server before troubleshooting begins. Store performance logs on a separate volume from the OS and application data to avoid I/O interference. Set DCS log file size limits and auto-restart to enable continuous collection without manual intervention. Combine perfmon data with Event Viewer timestamps to correlate performance spikes with specific application events. Export baselines to share across teams or to compare after hardware upgrades or configuration changes.