Multiple CLR performance counters appear that have names that resemble "W3wp#1"

When multiple ASP.NET worker processes are running, Common Language Runtime (CLR) performance counters will have names that resemble “W3wp#1” or “W3sp#2″and so on. This was remedied in .NET Framework 2.0 to include a counter named Process ID in the .NET CLR Memory performance object. This counter displays the process ID for an instance. You can use this counter to determine the CLR performance counter that is associated with a process.

If you cannot see a counter named Process ID under the .NET CLR Memory object, the performance counter symbols may not be installed correctly. To resolve this issue, follow these steps:

1. Click Start, click Run, type cmd, and then click OK.
2. At the command prompt, type unlodctr .NetFramework, and then press ENTER.
3. Use the cd command to change to the Microsoft.NetFrameworkv2.0.50727 folder.
4. At the command prompt, type lodctr corperfmonsymbols.ini, and then press ENTER.

You then need to run the iisapp.vbs command to get the PID of each App Pool. Once you have the PID, run perfmon and add the .Net CLR Memory/Process ID for each instance of w3wp, w3wp#1, w3wp#2, etc…

The corresponding PID will be the only value that perfmon displays for the counter.

As you can see below, I added application pools w3wp#1 and w3wp#2 to perfmon. I have selected w3wp#2, and it shows a constant value of 6892-which corresponds exactly to the PID of the App Pool.

.Net request flow

The browser sends an http request to the server for a file with an .aspx extension. This request gets handled by the httpd.sys kernel process, which maps the .aspx extension into IIS via the aspnet_isapi.dll ISAPI filter. This filter subsequently calls the .Net runtime worker process aspnet_wp.exe, which compiles the page into a DLL and stores it in the filesystem cache at C:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET Files.