Monitoring Application Performance on the .NET Compact Framework Part V - Version 2 performance counters (Part III: Locks and Threads counters)

This is the third part in the series describing .NET Compact Framework v2 performance counters.   A complete listing of this series, to date, is included below.

Pre-requisite:
Monitoring Application Performance on the .NET Compact Framework Part I - Enabling performance counters
.NET Compact Framework Version 1:
Monitoring Application Performance on the .NET Compact Framework Part II - Version 1 performance counters
.NET Compact Framework Version 2:
Monitoring Application Performance on the .NET Compact Framework Part III - Version 2 performance counters (Part I: Loader counters)
Monitoring Application Performance on the .NET Compact Framework Part IV - Version 2 performance counters (Part II: Generics counters)

The following table lists all of the performance counters available in version 2 of the .NET Compact Framework.  The counters highlighted, in yellow, are the ones I will be talking about today.

Loader
  Total Program Run Time (ms)
  App Domains Created
  App Domains Unloaded
  Assemblies Loaded
  Classes Loaded
  Methods Loaded
Generics
  Closed Types Loaded
  Closed Types Loaded per Definition
  Open Types Loaded
  Closed Methods Loaded
  Closed Methods Loaded per Definition
  Open Methods Loaded
Locks and Threads
  Threads in Thread Pool
  Pending Timers
  Scheduled Timers
  Timers Delayed by Thread Pool Limit
  Work Items Queued
  Uncontested Monitor.Enter Calls
  Contested Monitor.Enter Calls
Garbage Collector
  Peak Bytes Allocated (native + managed)
  Managed Objects Allocated
  Managed Bytes Allocated
  Managed String Objects Allocated
  Bytes of String Objects Allocated
  Garbage Collections (GC)
  Bytes Collected By GC
  Managed Bytes In Use After GC
  Total Bytes In Use After GC
  GC Compactions
  Code Pitchings
  Calls to GC.Collect
  GC Latency Time (ms)
  Pinned Objects
  Objects Moved by Compactor
  Objects Not Moved by Compactor
  Objects Finalized
  Boxed Value Types
  Process Heap
  Short Term Heap
  JIT Heap
  App Domain Heap
  GC Heap
JIT Compiler
  Native Bytes Jitted
  Methods Jitted
  Bytes Pitched
  Methods Pitched
  Method Pitch Latency Time (ms)
Exceptions
  Exceptions Thrown
Interop
  Platform Invoke Calls
  COM Calls Using a vtable
  COM Calls Using IDispatch
  Complex Marshaling
  Runtime Callable Wrappers
Networking
  Socket Bytes Sent
  Socket Bytes Received
Windows.Forms
  Controls Created
  Brushes Created
  Pens Created
  Bitmaps Created
  Regions Created
  Fonts Created
  Graphics Created (FromImage)
  Graphics Created (CreateGraphics)

The statistics file includes running totals, the most recent value (last datum), count (n), average (mean), minimum and maximum values for the counters. I've included an example file at the end of this post. For counters where a given column is not relevant, a hyphen (-) is logged.

I will use the following format to describe each counter.
Counter name
Brief description of the counter
Discussion of the contents of relevant columns (total, last datum, n, mean, min, max)
Any additional comments relating to the counter

Locks and Threads Counters
Writing well performing multi-threaded applications is one of the more challenging aspects of software development.  Along with the performance considerations of single-threaded applications (memory usage, etc), thread scheduling and data access synchronization can impact how well your application performs.  The counters described below can help identify threading related performance issues by providing data regarding thread, timer and lock usage during the run time of your application.

Threads in Thread Pool
The number of threads currently in the thread pool.
last datum: The current number of threads in the thread pool
n: The number of threads created in the thread pool
mean: The average number of threads in the thread pool during the run time of the application
min: The smallest number of threads in the thread pool during the run time of the application
max: The largest number of threads in the thread pool during the run time of the application
Please note: the Threads in Thread Pool counter does not count threads started using the Thread.Start method.  Threads counted by this counter are those started via ThreadPool.QueueUserWorkItem.

Pending Timers
The number of timers currently waiting to fire.
last datum: The current number of pending timers
n: The number of timer events which have been queued
mean: The average number of timers pending during the run time of the application
min: The fewest number of timers pending during the run time of the application
max: The largest number of timers pending during the run time of the application

Scheduled Timers
The number of timers that are currently running for scheduled to run.
total: Running total of timers that have been scheduled during your application's run time

Timers Delayed by Thread Pool Limit
The count of timers that have been delayed by the thread pool limit.
total: Running total of timers that were waiting for a thread pool thread

Work Items Queued
The count of items queued to the thread pool.
total: Running total of all managed work items that have been queued to the thread pool.

Uncontested Monitor.Enter Calls
Count of calls made to Monitor.Enter that are not contested.
total: Running total of uncontested calls to Monitor.Enter

Contested Monitor.Enter Calls
Count of calls made to Monitor.Enter with lock contention.
total: Running total of contested calls to Monitor.Enter
In multi-threaded applications, if Thread1 is holding a lock and Thread2 needs to access code that is guarded by the lock (currently held by Thread1) the Contested Monitor.Enter Calls counter is incremented.

Example statistics file
I have highlighted the counters discussed here with a yellow background.

counter total last datum n mean min max
Total Program Run Time (ms) 2956837 - - - - -
App Domains Created 1 - - - - -
App Domains Unloaded 1 - - - - -
Assemblies Loaded 8 - - - - -
Classes Loaded 975 - - - - -
Methods Loaded 3015 - - - - -
Closed Types Loaded 75 - - - - -
Closed Types Loaded per Definition 75 3 22 3 1 10
Open Types Loaded 13 - - - - -
Closed Methods Loaded 3 - - - - -
Closed Methods Loaded per Definition 3 1 3 1 1 1
Open Methods Loaded 0 - - - - -
Threads in Thread Pool - 0 2 0 0 1
Pending Timers - 0 4 0 0 1
Scheduled Timers 2 - - - - -
Timers Delayed by Thread Pool Limit 0 - - - - -
Work Items Queued 2 - - - - -
Uncontested Monitor.Enter Calls 664 - - - - -
Contested Monitor.Enter Calls 0 - - - - -
Peak Bytes Allocated (native + managed) 2789048 - - - - -
Managed Objects Allocated 25883 - - - - -
Managed Bytes Allocated 1366120 24 25883 52 8 135796
Managed String Objects Allocated 5360 - - - - -
Bytes of String Objects Allocated 124412 - - - - -
Garbage Collections (GC) 1 - - - - -
Bytes Collected By GC 897140 897140 1 897140 897140 897140
Managed Bytes In Use After GC - 147292 1 147292 147292 147292
Total Bytes In Use After GC - 2621848 1 2621848 2621848 2621848
GC Compactions 0 - - - - -
Code Pitchings 0 - - - - -
Calls to GC.Collect 0 - - - - -
GC Latency Time (ms) 46 46 1 46 46 46
Pinned Objects 0 - - - - -
Objects Moved by Compactor 0 - - - - -
Objects Not Moved by Compactor 0 - - - - -
Objects Finalized 82 - - - - -
Boxed Value Types 3273 - - - - -
Process Heap - 1280 7484 198308 72 330016
Short Term Heap - 0 6382 963 0 42136
JIT Heap - 0 6402 421097 0 876976
App Domain Heap - 0 18679 324926 0 523240
GC Heap - 0 30 527974 0 1060864
Native Bytes Jitted 844928 208 1963 430 84 9684
Methods Jitted 1963 - - - - -
Bytes Pitched 0 0 0 0 0 0
Methods Pitched 0 - - - - -
Method Pitch Latency Time (ms) 0 0 0 0 0 0
Exceptions Thrown 4 - - - - -
Platform Invoke Calls 0 - - - - -
COM Calls Using a vtable 0 - - - - -
COM Calls Using IDispatch 0 - - - - -
Complex Marshaling 367 - - - - -
Runtime Callable Wrappers 0 - - - - -
Socket Bytes Sent 0 - - - - -
Socket Bytes Received 0 - - - - -
Controls Created 13 - - - - -
Brushes Created 23 - - - - -
Pens Created 8 - - - - -
Bitmaps Created 16 - - - - -
Regions Created 0 - - - - -
Fonts Created 7 - - - - -
Graphics Created (FromImage) 0 - - - - -
Graphics Created (CreateGraphics) 0 - - - - -

Take care,
-- DK

[Edit: update counter table to fix errors]
[Edit: post titles]

Disclaimer(s):
This posting is provided "AS IS" with no warranties, and confers no rights.