共用方式為


效能計數器與同處理序並存應用程式

注意

本文專屬於 .NET Framework。 其不適用於較新的 .NET 實作,包括 .NET 6 和更新版本。

使用效能監視器 (Perfmon.exe),可以區分個別執行階段的效能計數器。 本主題描述啟用這項功能所需的登錄變更。

預設行為

根據預設,效能監視器會顯示個別應用程式的效能計數器。 不過,這在兩種案例下會發生問題:

  • 當您監視兩個同名的應用程式時。 例如,如果兩個應用程式的名稱都是 myapp.exe,則在 [執行個體] 資料行中,一個會顯示為 myapp,另一個則會顯示為 myapp#1。 在此情況下,很難符合特定應用程式的效能計數器。 不確定針對 myapp#1 所收集的資料指的是第一個 myapp.exe 還是第二個 myapp.exe。

  • 應用程式使用多個 Common Language Runtime 執行個體時。 .NET Framework 4 支援並行裝載案例;也就是說,單一進程或應用程式可以載入 Common Language Runtime 的多個執行個體。 如果名為 myapp.exe 的單一應用程式載入兩個執行階段執行個體,則會根據預設在 [執行個體] 資料行中將它們指定為 myappmyapp#1。 在此情況下,不確定 myappmyapp#1 指的是兩個同名的應用程式,還是含有兩個執行階段的相同應用程式。 如果多個同名的應用程式載入多個執行階段,則模稜兩可甚至會更高。

您可以設定登錄機碼,以消除這項模稜兩可。 對於使用 .NET Framework 4 開發的應用程式,此登錄變更會將後面接著執行階段執行個體識別碼的進程識別碼,新增至 Instance 資料行中的應用程式名稱。 應用程式現在在 Instance 資料行將識別為 application_pprocessID_rruntimeID,而非 applicationapplication#1。 如果應用程式是使用舊版的 Common Language Runtime 所開發,該執行個體會表示為 application_pprocessID,由於已安裝了 .NET Framework 4。

同處理序並存應用程式的效能計數器

若要處理單一應用程式中裝載之多個 Common Language Runtime 版本的效能計數器,您必須變更單一登錄機碼設定,如下表所示。

索引鍵 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\.NETFramework\Performance
Entry ProcessNameFormat
類型 REG_DWORD
2 (0x00000002)

ProcessNameFormat 值 0 指出已啟用預設行為;也就是說,Perfmon.exe 會顯示個別應用程式的效能計數器。 當您將此值設定為 2 時,Perfmon.exe 會釐清應用程式的多個版本,並在每一執行階段提供效能計數器。 ProcessNameFormat 登錄機碼設定的任何其他值都不受支援,並保留供未來使用。

在您更新 ProcessNameFormat 登錄機碼設定之後,必須重新啟動 Perfmon.exe 或效能計數器的任何其他消費者,讓新執行個體命名功能正確地運作。

下列範例示範如何以程式設計方式變更 ProcessNameFormat 值。

// Create or open registry key.
Microsoft.Win32.RegistryKey key;
key = Microsoft.Win32.Registry.LocalMachine.CreateSubKey(
          @"System\CurrentControlSet\Services\.NETFramework\Performance");
// Create or overwrite value.
key.SetValue("ProcessNameFormat", 1,
             Microsoft.Win32.RegistryValueKind.DWord);
key.Close();
' Create or open registry key.
Dim key As Microsoft.Win32.RegistryKey
key = Microsoft.Win32.Registry.LocalMachine.CreateSubKey( _
            "System\CurrentControlSet\Services\.NETFramework\Performance")
' Create or overwrite value.
key.SetValue("ProcessNameFormat", 1, _
             Microsoft.Win32.RegistryValueKind.DWord)
key.Close()

當您進行此登錄變更時,如果已安裝 .NET Framework 4 或更新版本,Perfmon.exe 會將應用程式的名稱顯示為 application_pprocessID,其中 application 是應用程式的名稱,而 processID 是應用程式的進程識別碼。 例如,如果名為 myapp.exe 的應用程式載入 Common Language Runtime 的兩個執行個體,Perfmon.exe 可能會將一個執行個體識別為 myapp_1416,第二個則會識別為 myapp_3160。

注意

如果兩個應用程式同名且使用舊版執行階段,則處理序識別碼可消除解析它們的模稜兩可。 舊版本不需要執行階段識別碼,因為舊版 Common Language Runtime 不支援並存案例。

如果 .NET Framework 4 或更新版本不存在或已卸載,設定登錄機碼將沒有任何作用。 這表示,兩個同名的應用程式將會繼續在 Perfmon.exe 中顯示為 applicationapplication#1 (例如,myappmyapp#1)。