Performance
Monitoring Objects
The most
commonly used objects are memory, process, processor, thread, and cache.
Each of these objects has many counters, although some objects don't have
instances. Most of us have single processor boxes, but for multiprocessor
systems there is one processor instance for each CPU. Because all processors
share the same memory on a Windows NT-based system, there is only one memory
instance.
You can get
information on any counter by selecting the counter in the Add to Chart
dialog box and then pressing the Explain>> button. You can bring up
the Add to Chart dialog box from the Edit menu. Unfortunately,
online Help is not available for objects—just for counters. You can browse
this dialog box to find all of the objects available on your system and the
instances and counters available for each object.

Figure 2. The Add to Chart dialog box
Important
Counters
Windows NT
Workstation comes with more than 15 objects. Windows NT Server has more.
Applications like Microsoft SQL Server™ install additional counters. Each
object has multiple instances and counters. So it's helpful to be able to
focus on the useful counters.
The Memory
object
The Memory
object is almost self-explanatory and perhaps the most important resource to
monitor. Because memory is more than a thousand times faster than disk,
adding more memory to prevent swapping can be a cheap way to boost system
performance. The memory counter "Pages/sec" is the number of pages read from
the disk or written to the disk to resolve memory references to pages that
were not in memory at the time of the reference. This is the primary counter
to observe to determine if your system needs more physical memory to prevent
paging for virtual memory.
The memory
counter "Committed Bytes" displays the size of virtual memory (in bytes)
that must have backup by disk or physical RAM. This counter can give you a
good idea of how much physical RAM your system can use to prevent excessive
paging.
The Process
object
The
Process object is probably the most useful to developers for monitoring
applications. The Process object and a few others support the pseudo
instance
"_Total",
which represents the total of all the instances. So
Process(_Total)\%Processor
Time is
the counter indicating the percentage of processor time taken by all the
processes on the system. The process counters I most frequently use are
"Private Bytes," "Handle Count," "% Processor Time," and "Working Set."
I've already
defined Private Bytes. Handle is the generic term for an opaque identifier
to a resource. Common handles include file handles, window handles, and
memory handles. Handles are an extremely precious resource, so leaking
handles is more virulent than leaking memory. % Processor Time is the amount
of CPU time a process is using. The Working Set is the amount of virtual
memory the OS is maintaining for a process. Because Windows NT caches memory
usage, freed memory for a process can stay in the process's working set.
Many factors can influence the Working Set of a process, including memory
requests of other processes, how the application was compiled (Visual C++
6.0 supports the linker option /WS: AGGRESSIVE—this tells the system to
aggressively trim the Working Set of the process when it is not active), and
memory usage patterns.
The User
object
The User object
represents a user of Windows NT. I use this object on a Windows NT Terminal
Server shared by our group. When the Terminal Server seems sluggish, I can
determine who is using all the processor time, memory (Private Bytes), or
causing all the page faults (with the Page Faults/sec counter). |