High CPU or memory usage on a Windows Server causes slow performance, timeouts, and — if left unresolved — crashes. Knowing how to quickly identify what is consuming resources and how to interpret the numbers is an essential server admin skill. Here is how to monitor CPU and memory on Windows Server.
Task Manager — Quick Check
For an immediate overview: open Task Manager (Ctrl + Shift + Esc) and go to the Performance tab. This shows real-time CPU and memory usage with a graph. Click CPU or Memory to see the current load.
Switch to the Processes tab and click the CPU or Memory column header to sort by highest usage. The process at the top is your primary resource consumer.
Key things to note in Task Manager:
- CPU usage sustained at 90%+: a process is consuming the CPU. Identify it from the Processes tab.
- Memory: In Use vs Available: if Available memory is below 500MB on a busy server, the OS may start using page file (virtual memory) which significantly degrades performance
- Committed memory vs physical RAM: if Committed memory exceeds physical RAM, the system is paging — this is a sign you need more RAM
Resource Monitor — More Detail
Resource Monitor gives more granular detail than Task Manager. Open it from Task Manager → Performance tab → Open Resource Monitor, or search for “resmon” in Start.
Resource Monitor shows:
- CPU tab: per-process CPU usage, services consuming CPU, and average CPU per service
- Memory tab: per-process memory usage broken into Working Set (physical RAM in use), Private (memory unique to that process), and Shareable. The Physical Memory panel at the bottom shows In Use, Modified, Standby, and Free — Standby memory is cached and can be released quickly if needed.
- Disk and Network tabs: identify I/O-bound processes that may be affecting performance indirectly
PowerShell — CPU and Memory from Command Line
# CPU usage (average over 2 seconds)
Get-WmiObject Win32_Processor | Measure-Object -Property LoadPercentage -Average | Select-Object Average
# Total and available memory in GB
$os = Get-CimInstance Win32_OperatingSystem
[PSCustomObject]@{
Total_GB = [math]::Round($os.TotalVisibleMemorySize/1MB, 2)
Free_GB = [math]::Round($os.FreePhysicalMemory/1MB, 2)
Used_GB = [math]::Round(($os.TotalVisibleMemorySize - $os.FreePhysicalMemory)/1MB, 2)
}
# Top 10 processes by CPU
Get-Process | Sort-Object CPU -Descending | Select-Object -First 10 Name, CPU, WorkingSet
# Top 10 processes by memory (MB)
Get-Process | Sort-Object WorkingSet -Descending | Select-Object -First 10 Name, @{N='Memory_MB';E={[math]::Round($_.WorkingSet/1MB,1)}}
Performance Monitor — Historical Data and Counters
For longer-term monitoring and capturing performance data over time, use Performance Monitor (perfmon.msc):
- Open perfmon and expand Monitoring Tools → Performance Monitor
- Click the green + to add counters
- Key counters to add:
- Processor → % Processor Time → _Total — overall CPU %
- Memory → Available MBytes — free physical RAM
- Memory → Pages/sec — paging activity; consistent values above 20 indicate memory pressure
- Process → % Processor Time — per-process CPU (select individual processes)
Use Data Collector Sets in Performance Monitor to record counters over time to a log file — valuable for diagnosing intermittent issues that occur overnight or outside business hours.
Common Causes of High CPU on Windows Server
- SQL Server (sqlservr.exe): a poorly optimised query, missing index, or lock contention — check SQL Server’s Activity Monitor for blocking queries
- svchost.exe: a Windows service hosted in svchost is consuming CPU — hover over it in Task Manager to see which service, or check Resource Monitor’s Services view
- Windows Update: TiWorker.exe or TrustedInstaller.exe spike during update installation — usually temporary
- Antivirus (MsMpEng.exe): Defender or third-party AV scanning a large number of files — check scan schedules or exclusions if this is persistent
- IIS worker process (w3wp.exe): a web application request is hanging or looping
Common Causes of High Memory
- Memory leak in an application: a process’s working set grows continuously over hours or days — restart the process as a short-term fix, investigate the root cause
- SQL Server buffer pool: SQL Server aggressively uses available RAM for its buffer pool by design. Set a Maximum Server Memory limit in SQL Server properties so it does not consume all RAM on a shared server.
- Too many active RDP sessions: each user session consumes RAM, especially if running heavy applications