Common Performance Monitor counter thresholds
This article lists some common perfmon counters with descriptions and thresholds. The threshold values listed here are meant for use as a general rule of thumb and each should be interpreted in context of the specific performance issue currently at hand.
When using these values, keep the following in mind:
- The threshold values provided below are averages, not min/max and are only useful when looked at within a meaningful time period as the following points help to clarify.
- What is the time range captured in the perfmon data set?
- Extreme highs and lows within the time range of the capture can result in less useful averages. In these cases, try to narrow the time range and then look at counter values around the time(s) when you observed poor performance.
- In general, to be considered a genuine bottleneck, a given counter's threshold must be exceeded either on average, or on a frequent basis, during the time period being analyzed.
- This is not meant to be a comprehensive nor definitive reference.
Object | Counter | Description | Normal range | Threshold |
---|---|---|---|---|
.NET CLR Memory | % Time in GC.<InstanceName> | % Time in GC is the percentage of elapsed time that was spent in performing a garbage collection (GC) since the last GC cycle. This counter is usually an indicator of the work done by the Garbage Collector on behalf of the application to collect and compact memory. This counter is updated only at the end of every GC and the counter value reflects the last observed value; its not an average. | < 30% | >= 30% |
 |  |  |  |  |
Memory | Free System Page Table Entries | The number of page table entries not currently in used by the system. This counter displays the last observed value only; it is not an average. | > 8,000 | < 8,000 |
 | Pages/sec | The rate at which pages are read from or written to disk to resolve hard page faults. This counter is a primary indicator of the kinds of faults that cause system-wide delays. | 0 - 15 | > 20 |
 |  |  |  |  |
Physical Disk | Avg. Disk Queue Length | The average number of both read and write requests that were queued for the selected disk during the sample interval. | <= (2 x Total Number of Disks) | > (2 x Total Number of Disks) |
 | Avg. Disk sec/Read | The average time, in seconds, of a read of data from the disk. | 4 - 8ms | > 15ms |
 | Avg. Disk sec/Write | The average time, in seconds, of a write of data to the disk. | <= 10ms | > 50ms |
Process | %Processor Time.<InstanceName> | % Processor Time is the percentage of elapsed time that all of process threads used the processor to execution instructions. | <= (50 x Total Number of Cores) | > (50 x Total Number of Cores) |
 | PrivateBytes.w3wp.exe | The current size, in bytes, of memory that this process has allocated that cannot be shared with other processes. | Without /3GB switch: | Without /3GB switch: |
 |  |  |  |  |
Processor | % Processor Time._Total | Percentage of elapsed time that the processor spends to execute a non-Idle thread. | < 80 | > 80 |
 |  |  |  |  |
SQLServer: | Buffer cache hit ratio | Percentage of pages found in the buffer cache without having to read from disk. Because reading from the cache is much less expensive than reading from disk, you want this ratio to be high. | > 98 | < 90 |
 | Free Pages | Total number of pages on all free lists. | >= 640 | < 640 |
 | Page Life Expectancy | Number of seconds a page will stay in the buffer pool without references. | >= 300 | < 300 |