Udostępnij przez


Liczniki wydajności w programie SqlClient

Dotyczy: .NET Framework

Pobieranie ADO.NET

Możesz użyć liczników wydajności do monitorowania stanu aplikacji i zasobów połączenia, które wykorzystuje. Liczniki wydajności można monitorować przy użyciu monitor wydajności systemu Windows lub można uzyskać do tego dostępu programowo przy użyciu PerformanceCounter klasy w System.Diagnostics przestrzeni nazw.

Dostępne liczniki wydajności

Obecnie dostępnych jest 14 różnych liczników wydajności dla Microsoft.Data.SqlClient, jak opisano w poniższej tabeli.

Licznik wydajności Description
HardConnectsPerSecond Liczba połączeń na sekundę, które są wykonywane na serwerze bazy danych.
HardDisconnectsPerSecond Liczba rozłączeń na sekundę, które są wykonywane na serwerze bazy danych.
NumberOfActiveConnectionPoolGroups Liczba unikatowych grup puli połączeń, które są aktywne. Ten licznik jest kontrolowany przez liczbę unikatowych parametry połączenia znalezionych w domenie aplikacji.
NumberOfActiveConnectionPools Łączna liczba pul połączeń.
NumberOfActiveConnections Liczba aktywnych połączeń, które są obecnie używane. Uwaga: ten licznik wydajności nie jest domyślnie włączony. Aby włączyć ten licznik wydajności, zobacz Aktywowanie liczników wyłączonych domyślnie.
NumberOfFreeConnections Liczba połączeń dostępnych do użycia w pulach połączeń. Uwaga: ten licznik wydajności nie jest domyślnie włączony. Aby włączyć ten licznik wydajności, zobacz Aktywacja liczników domyślnie wyłączonych.
NumberOfInactiveConnectionPoolGroups Liczba unikatowych grup puli połączeń oznaczonych do oczyszczania. Ten licznik jest kontrolowany przez liczbę unikatowych parametry połączenia znalezionych w domenie aplikacji.
NumberOfInactiveConnectionPools Liczba nieaktywnych pul połączeń, które nie miały żadnych ostatnich działań i oczekują na likwidację.
NumberOfNonPooledConnections Liczba aktywnych połączeń, które nie są w puli.
NumberOfPooledConnections Liczba aktywnych połączeń zarządzanych przez infrastrukturę buforowania połączeń.
NumberOfReclaimedConnections Liczba połączeń, które zostały odzyskane za pośrednictwem odzyskiwania pamięci, gdzie Close lub Dispose nie została wywołana przez aplikację. Uwaga Nie zamykaj jawnie ani nie usuwaj połączeń, co szkodzi wydajności.
NumberOfStasisConnections Liczba połączeń oczekujących na ukończenie akcji i dlatego jest niedostępna do użycia przez aplikację.
SoftConnectsPerSecond Liczba aktywnych połączeń pobieranych z puli połączeń. Uwaga: ten licznik wydajności nie jest domyślnie włączony. Aby włączyć ten licznik wydajności, zobacz Aktywowanie domyślnie wyłączonych liczników.
SoftDisconnectsPerSecond Liczba aktywnych połączeń zwracanych do puli połączeń. Uwaga: ten licznik wydajności nie jest domyślnie włączony. Aby włączyć ten licznik wydajności, zobacz Aktywowanie liczników domyślnie wyłączonych.

Włączanie liczników domyślnie wyłączonych

Liczniki NumberOfFreeConnectionswydajności , NumberOfActiveConnections, SoftDisconnectsPerSecondi SoftConnectsPerSecond są domyślnie wyłączone. Dodaj następujące informacje do pliku konfiguracji aplikacji, aby je włączyć:

<system.diagnostics>  
  <switches>  
    <add name="ConnectionPoolPerformanceCounterDetail" value="4"/>  
    <!-- A value of 4 corresponds to System.Diagnostics.TraceLevel.Verbose -->
  </switches>  
</system.diagnostics>  

Pobieranie wartości licznika wydajności

Poniższa aplikacja konsolowa pokazuje, jak pobrać wartości liczników wydajności w aplikacji. Połączenia muszą być otwarte i aktywne, aby informacje zostały zwrócone dla wszystkich liczników wydajności dostarczanych przez dostawcę danych Microsoft SqlClient dla SQL Server.

Uwaga / Notatka

W tym przykładzie użyto przykładowej bazy danych AdventureWorks. Parametry połączenia podane w przykładowym kodzie zakładają, że baza danych jest zainstalowana i dostępna na komputerze lokalnym oraz że utworzono identyfikatory logowania zgodne z parametrami połączenia. Może być konieczne włączenie identyfikatorów logowania programu SQL Server, jeśli serwer jest skonfigurowany przy użyciu domyślnych ustawień zabezpieczeń, które zezwalają tylko na uwierzytelnianie systemu Windows. Zmodyfikuj parametry połączenia zgodnie z potrzebami w twoim środowisku.

Example

using System;
using Microsoft.Data.SqlClient;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace PerformanceCounterTest
{
    class Program
    {
        PerformanceCounter[] PerfCounters = new PerformanceCounter[10];
        SqlConnection connection = new SqlConnection();

        static void Main()
        {
            Program prog = new Program();
            // Open a connection and create the performance counters.  
            prog.connection.ConnectionString =
               GetIntegratedSecurityConnectionString();
            prog.SetUpPerformanceCounters();
            Console.WriteLine("Available Performance Counters:");

            // Create the connections and display the results.  
            prog.CreateConnections();
            Console.WriteLine("Press Enter to finish.");
            Console.ReadLine();
        }

        private void CreateConnections()
        {
            // List the Performance counters.  
            WritePerformanceCounters();

            // Create 4 connections and display counter information.  
            SqlConnection connection1 = new SqlConnection(
                  GetIntegratedSecurityConnectionString());
            connection1.Open();
            Console.WriteLine("Opened the 1st Connection:");
            WritePerformanceCounters();

            SqlConnection connection2 = new SqlConnection(
                  GetSqlConnectionStringDifferent());
            connection2.Open();
            Console.WriteLine("Opened the 2nd Connection:");
            WritePerformanceCounters();

            SqlConnection connection3 = new SqlConnection(
                  GetSqlConnectionString());
            connection3.Open();
            Console.WriteLine("Opened the 3rd Connection:");
            WritePerformanceCounters();

            SqlConnection connection4 = new SqlConnection(
                  GetSqlConnectionString());
            connection4.Open();
            Console.WriteLine("Opened the 4th Connection:");
            WritePerformanceCounters();

            connection1.Close();
            Console.WriteLine("Closed the 1st Connection:");
            WritePerformanceCounters();

            connection2.Close();
            Console.WriteLine("Closed the 2nd Connection:");
            WritePerformanceCounters();

            connection3.Close();
            Console.WriteLine("Closed the 3rd Connection:");
            WritePerformanceCounters();

            connection4.Close();
            Console.WriteLine("Closed the 4th Connection:");
            WritePerformanceCounters();
        }

        private enum ADO_Net_Performance_Counters
        {
            NumberOfActiveConnectionPools,
            NumberOfReclaimedConnections,
            HardConnectsPerSecond,
            HardDisconnectsPerSecond,
            NumberOfActiveConnectionPoolGroups,
            NumberOfInactiveConnectionPoolGroups,
            NumberOfInactiveConnectionPools,
            NumberOfNonPooledConnections,
            NumberOfPooledConnections,
            NumberOfStasisConnections
            // The following performance counters are more expensive to track.  
            // Enable ConnectionPoolPerformanceCounterDetail in your config file.  
            //     SoftConnectsPerSecond  
            //     SoftDisconnectsPerSecond  
            //     NumberOfActiveConnections  
            //     NumberOfFreeConnections  
        }

        private void SetUpPerformanceCounters()
        {
            connection.Close();
            this.PerfCounters = new PerformanceCounter[10];
            string instanceName = GetInstanceName();
            Type apc = typeof(ADO_Net_Performance_Counters);
            int i = 0;
            foreach (string s in Enum.GetNames(apc))
            {
                this.PerfCounters[i] = new PerformanceCounter();
                this.PerfCounters[i].CategoryName = ".NET Data Provider for SqlServer";
                this.PerfCounters[i].CounterName = s;
                this.PerfCounters[i].InstanceName = instanceName;
                i++;
            }
        }

        [DllImport("kernel32.dll", SetLastError = true)]
        static extern int GetCurrentProcessId();

        private string GetInstanceName()
        {
            //This works for Winforms apps.  
            string instanceName =
                System.Reflection.Assembly.GetEntryAssembly().GetName().Name;

            // Must replace special characters like (, ), #, /, \\  
            string instanceName2 =
                AppDomain.CurrentDomain.FriendlyName.ToString().Replace('(', '[')
                .Replace(')', ']').Replace('#', '_').Replace('/', '_').Replace('\\', '_');

            // For ASP.NET applications your instanceName will be your CurrentDomain's
            // FriendlyName. Replace the line above that sets the instanceName with this:  
            // instanceName = AppDomain.CurrentDomain.FriendlyName.ToString().Replace('(','[')  
            // .Replace(')',']').Replace('#','_').Replace('/','_').Replace('\\','_');  

            string pid = GetCurrentProcessId().ToString();
            instanceName = instanceName + "[" + pid + "]";
            Console.WriteLine("Instance Name: {0}", instanceName);
            Console.WriteLine("---------------------------");
            return instanceName;
        }

        private void WritePerformanceCounters()
        {
            Console.WriteLine("---------------------------");
            foreach (PerformanceCounter p in this.PerfCounters)
            {
                Console.WriteLine("{0} = {1}", p.CounterName, p.NextValue());
            }
            Console.WriteLine("---------------------------");
        }

        private static string GetIntegratedSecurityConnectionString()
        {
            // To avoid storing the connection string in your code,  
            // you can retrieve it from a configuration file.  
            return @"Data Source=.;Integrated Security=True;" +
              "Initial Catalog=AdventureWorks";
        }
        private static string GetSqlConnectionString()
        {
            // To avoid storing the connection string in your code,  
            // you can retrieve it from a configuration file.  
            return @"Data Source=.;User Id=<myUserID>;Password=<myPassword>;" +
              "Initial Catalog=AdventureWorks";
        }

        private static string GetSqlConnectionStringDifferent()
        {
            // To avoid storing the connection string in your code,  
            // you can retrieve it from a configuration file.  
            return @"Initial Catalog=AdventureWorks;Data Source=.;" +
              "User Id=<myUserID>;Password=<myPassword>;";
        }
    }
}

Zobacz także