PerfMon for a Windows web server: the counters that explain a slow site
Use Performance Monitor and data collector sets to watch CPU, memory, disk, IIS app pools and connections, and read the result without superstition.
- Build
- 26100.33650
- Edition
- Standard / Datacenter
- Architecture
- x64
- Support
- Documentation (E1)
- Evidence
- E1Official documentation
- Verified
- 2026-10-29
- Page type
- Task
The short answer
Section titled “The short answer”Four resources decide most web-server performance:
- CPU — steal vs. your app.
- Memory — working set, paging, app-pool private bytes.
- Disk — queue length and latency on the data/log volume.
- Network/connections — current connections, requests/sec, queue.
Watch the app pool and the whole host; a healthy host can still have one bad pool.
Counters
Section titled “Counters”Processor(_Total)\% Processor TimeMemory\Available MBytesMemory\Pages/secPhysicalDisk(_Total)\Avg. Disk sec/ReadPhysicalDisk(_Total)\Avg. Disk sec/WritePhysicalDisk(_Total)\Current Disk Queue LengthWeb Service(_Total)\Current ConnectionsWeb Service(_Total)\Get Requests/secAPP_POOL_WAS(*)\Current Application Pool StateProcess(*)\Private BytesProcess(*)\% Processor TimeAdd HTTP Service Request Queues(*)\CurrentQueueSize when requests queue before the app.
Collect
Section titled “Collect”Interactive: perfmon → Performance Monitor → add counters.
Data collector set (better for incidents): create a User Defined set, log to a file, run for 24h, restart on schedule. Keep the .blg off the system drive.
PowerShell snapshot:
Get-Counter -Counter '\Processor(_Total)\% Processor Time','\Memory\Available MBytes' -SampleInterval 2 -MaxSamples 5Get-CimInstance Win32_PerfFormattedData_PerfProc_Process | Sort-Object PercentProcessorTime -Descending | Select-Object -First 10 Name,PercentProcessorTime,WorkingSetPrivateRead it correctly
Section titled “Read it correctly”- CPU 100% — is it
w3wp,php-cgi,node, or antivirus? Look at the process, not just the total. - Available MBytes low + Pages/sec high — real memory pressure; find the leaking pool.
- Disk queue > 2 × spindles (or high latency) — storage bottleneck; check logging/AV scans on the data volume.
- Current Connections high + low CPU — slow clients or keep-alive exhaustion; check timeouts.
- Queue growing — app can’t keep up; scale/optimize or the pool is recycling.
Baseline
Section titled “Baseline”Record a normal-week baseline: CPU/memory/disk/connections per site. Without a baseline, “high CPU” is an opinion.
Lab boundary
Section titled “Lab boundary”E1. The lab served IIS/Nginx but did not run a PerfMon collector or load test. Counters and the reading guide are the production method for Server 2025.