Contadores de desempenho do SqlClient
Aplica-se a: .NET Framework .NET Core .NET Standard
Use os contadores de desempenho do Microsoft.Data.SqlClient para monitorar o status do seu aplicativo e os recursos de conexão usados por ele. Os contadores de desempenho podem ser monitorados por meio do Monitor de Desempenho do Windows ou acessados de modo programático pela classe PerformanceCounter no namespace System.Diagnostics.
Contadores de desempenho disponíveis
Atualmente, há 14 contadores de desempenho diferentes disponíveis para o Microsoft.Data.SqlClient, conforme descrito na tabela a seguir.
Contador de desempenho | Descrição |
---|---|
HardConnectsPerSecond |
O número de conexões por segundo que estão sendo feitas com um servidor de banco de dados. |
HardDisconnectsPerSecond |
O número de desconexões por segundo que estão sendo feitas com um servidor de banco de dados. |
NumberOfActiveConnectionPoolGroups |
O número de grupos de pools de conexão exclusivos que estão ativos. Esse contador é controlado pelo número de cadeias de conexão exclusivas encontradas no AppDomain. |
NumberOfActiveConnectionPools |
O número total de pools de conexão. |
NumberOfActiveConnections |
O número de conexões ativas que estão atualmente em uso. Observação: esse contador de desempenho não está habilitado por padrão. Para habilitá-lo, confira Ativar contadores desativados por padrão. |
NumberOfFreeConnections |
O número de conexões disponíveis para uso nos pools de conexão. Observação: esse contador de desempenho não está habilitado por padrão. Para habilitá-lo, confira Ativar contadores desativados por padrão. |
NumberOfInactiveConnectionPoolGroups |
O número de grupos de pools de conexão exclusivos que estão marcados para remoção. Esse contador é controlado pelo número de cadeias de conexão exclusivas encontradas no AppDomain. |
NumberOfInactiveConnectionPools |
O número de pools de conexão inativos que não tiveram nenhuma atividade recente e que estão aguardando para serem descartados. |
NumberOfNonPooledConnections |
O número de conexões ativas que não estão em pool. |
NumberOfPooledConnections |
O número de conexões ativas que estão sendo gerenciadas pela infraestrutura de pooling de conexão. |
NumberOfReclaimedConnections |
O número de conexões que foram recuperadas por meio da coleta de lixo, em que Close ou Dispose não foi chamado pelo aplicativo. Observação O não fechamento ou o não descarte explícitos das conexões afeta o desempenho. |
NumberOfStasisConnections |
O número de conexões que estão aguardando a conclusão de uma ação e que, portanto, não estão disponíveis para uso pelo seu aplicativo. |
SoftConnectsPerSecond |
O número de conexões ativas extraídas do pool de conexão. Observação: esse contador de desempenho não está habilitado por padrão. Para habilitá-lo, confira Ativar contadores desativados por padrão. |
SoftDisconnectsPerSecond |
O número de conexões ativas que estão sendo retornadas para o pool de conexão. Observação: esse contador de desempenho não está habilitado por padrão. Para habilitá-lo, confira Ativar contadores desativados por padrão. |
Ativar contadores desativados por padrão
Os contadores de desempenho NumberOfFreeConnections
, NumberOfActiveConnections
, SoftDisconnectsPerSecond
e SoftConnectsPerSecond
estão desativados por padrão. Adicione as seguintes informações ao arquivo de configuração do aplicativo para habilitá-las:
<system.diagnostics>
<switches>
<add name="ConnectionPoolPerformanceCounterDetail" value="4"/>
<!-- A value of 4 corresponds to System.Diagnostics.TraceLevel.Verbose -->
</switches>
</system.diagnostics>
Recuperar valores de contador de desempenho
O aplicativo de console a seguir mostra como recuperar valores de contador de desempenho no seu aplicativo. As conexões precisam estar abertas e ativas de modo que as informações sejam retornadas para todos os contadores de desempenho do Provedor de Dados do Microsoft SqlClient para o SQL Server.
Observação
Este exemplo usa o banco de dados de exemplo AdventureWorks. As cadeias de conexão fornecidas no código de exemplo pressupõem que o banco de dados esteja instalado e disponível no computador local e que você tenha criado logons que correspondam àqueles fornecidos nas cadeias de conexão. Talvez seja necessário habilitar os logons do SQL Server se o servidor está definido por meio das configurações de segurança padrão que permitem apenas a Autenticação do Windows. Modifique as cadeias de conexão, conforme necessário, de acordo com o seu ambiente.
Exemplo
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>;";
}
}
}