Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Область применения: .NET
.NET Standard
Внимание
Счетчики событий доступны для приложений, предназначенных для .NET Core 3.1 и более поздних версий или .NET Standard 2.1 и более поздних версий. Эта функция доступна начиная с Microsoft.Data.SqlClientверсии 3.0.0.
Счетчики производительности Microsoft.Data.SqlClient можно использовать для мониторинга состояния приложения и используемых им ресурсов подключения. Счетчики событий можно отслеживать с помощью .NET CLI global tools и perfView либо получать к ним доступ программным путем, используя класс EventListener в пространстве имен System.Diagnostics.Tracing.
Доступные счетчики событий
В настоящее время имеется 16 различных счетчиков событий, доступных для Microsoft.Data.SqlClient, как показано в приведенной ниже таблице.
| Имя. | отображаемое имя; | Description |
|---|---|---|
| active-hard-connections | Фактическое число активных подключений к серверам | Число открытых в настоящее время подключений к серверам баз данных. |
| hard-connects | Фактическая скорость подключения к серверам | Количество подключений к серверам баз данных, открываемых в секунду. |
| hard-disconnects | Фактическая скорость отключения от серверов | Количество разрывов соединений с серверами баз данных в секунду. |
| active-soft-connects | Активные подключения, полученные из пула подключений | Количество уже открытых подключений, используемых из пула подключений. |
| soft-connects | Скорость подключений, получаемых из пула подключений | Количество подключений, используемых из пула подключений, в секунду. |
| soft-disconnects | Скорость возврата подключений в пул подключений | Количество подключений, возвращаемых в пул подключений в секунду. |
| number-of-non-pooled-connections | Число подключений, не использующих пул подключений | Количество активных подключений, не помещаемых в пул. |
| number-of-pooled-connections | Число подключений, управляемых пулом подключений | Количество активных соединений, которые управляются инфраструктурой пулов соединений. |
| number-of-active-connection-pool-groups | Число уникальных активных строк подключения | Количество уникальных активных групп пулов соединений. Этот счетчик управляется числом уникальных строк соединения, найденных в домене приложения. |
| number-of-inactive-connection-pool-groups | Число уникальных строк подключения в очереди на удаление | Количество уникальных групп пулов соединений, отмеченных для усечения. Этот счетчик управляется числом уникальных строк соединения, найденных в домене приложения. |
| number-of-active-connection-pools | Число активных пулов подключений | Общее число пулов соединений. |
| number-of-inactive-connection-pools | Число неактивных пулов подключений | Количество неактивных пулов подключений, не участвовавших в последних операциях и ожидающих удаления. |
| number-of-active-connections | Число активных подключений. | Количество текущих активных соединений. |
| number-of-free-connections | Число готовых подключений в пуле подключений | Количество открытых подключений, доступных в пулах подключений. |
| number-of-stasis-connections | Число подключений, ожидающих подготовки | Число подключений, ожидающих завершения действия и недоступных для использования приложением. |
| number-of-reclaimed-connections | Число подключений, освобожденных в результате сборки мусора | Число подключений, которые были освобождены в результате сборки мусора без вызова Close или Dispose приложением.
Примечание. Если подключения не закрывать и не удалять явно, производительность может снижаться. |
Получение значений счетчиков событий
Счетчики событий можно использовать двумя основными способами — внутри и вне процессов. Дополнительные сведения см. в разделе Использование EventCounters.
Использование вне процессов
В Windows для сбора данных счетчиков событий можно использовать PerfView и Xperf. Дополнительные сведения см. в статье Включение трассировки событий в SqlClient. Для мониторинга и сбора данных счетчиков событий можно использовать dotnet-counters и dotnet-trace, которые являются межплатформенными средствами .NET.
Внепроцессный пример
Приведенная ниже команда запускает счетчики событий SqlClient и собирает их значения каждую секунду. Увеличив значение EventCounterIntervalSec=1, можно уменьшить размер трассировки, но уровень детализации данных счетчиков при этом снижается.
PerfView /onlyProviders=*Microsoft.Data.SqlClient.EventSource:EventCounterIntervalSec=1 run "<application-Path>"
Приведенная ниже команда собирает значения счетчиков событий SqlClient каждую секунду.
dotnet-trace collect --process-id <pid> --providers Microsoft.Data.SqlClient.EventSource:0:1:EventCounterIntervalSec=1
Приведенная ниже команда отслеживает значения счетчиков событий SqlClient каждые три секунды.
dotnet-counters monitor --counters Microsoft.Data.SqlClient.EventSource -p <process-id> --refresh-interval 3
Приведенная ниже команда отслеживает значения выбранных счетчиков событий SqlClient каждую секунду.
dotnet-counters monitor --counters Microsoft.Data.SqlClient.EventSource[hard-connects,hard-disconnects] -p <process-id>
Использование внутри процесса
Получать значения счетчиков можно с помощью API EventListener.
EventListener — это внутрипроцессный способ использования любого события, записанного экземплярами EventSource в приложении. Дополнительные сведения см. в статье EventListener.
Внутрипроцессный пример
В следующем примере кода события Microsoft.Data.SqlClient.EventSource записываются с помощью EventCounterIntervalSec=1. Имя счетчика и его значение Mean записываются при каждом обновлении счетчика событий.
Примечание.
При включении этого события необходимо указать значение свойства EventCounterIntervalSec.
using System;
using System.Collections.Generic;
using System.Diagnostics.Tracing;
using System.Linq;
// This listener class will listen for events from the SqlClientEventSource class.
// SqlClientEventSource is an implementation of the EventSource class which gives
// it the ability to create events.
public class EventCounterListener : EventListener
{
protected override void OnEventSourceCreated(EventSource eventSource)
{
// Only enable events from SqlClientEventSource.
if (eventSource.Name.Equals("Microsoft.Data.SqlClient.EventSource"))
{
var options = new Dictionary<string, string>();
// define time interval 1 second
// without defining this parameter event counters will not enabled
options.Add("EventCounterIntervalSec", "1");
// enable for the None keyword
EnableEvents(eventSource, EventLevel.Informational, EventKeywords.None, options);
}
}
// This callback runs whenever an event is written by SqlClientEventSource.
// Event data is accessed through the EventWrittenEventArgs parameter.
protected override void OnEventWritten(EventWrittenEventArgs eventData)
{
if (eventData.Payload.FirstOrDefault(p => p is IDictionary<string, object> x && x.ContainsKey("Name")) is IDictionary<string, object> counters)
{
if (counters.TryGetValue("DisplayName", out object name) && name is string cntName
&& counters.TryGetValue("Mean", out object value) && value is double cntValue)
{
// print event counter's name and mean value
Console.WriteLine($"{cntName}\t\t{cntValue}");
}
}
}
}
class Program
{
static void Main(string[] args)
{
// Create a new event listener
using (var listener = new EventCounterListener())
{
string connectionString = "Data Source=localhost; Integrated Security=true";
for (int i = 0; i < 50; i++)
{
// Open a connection
SqlConnection cnn = new SqlConnection(connectionString);
cnn.Open();
// wait for sampling interval happens
System.Threading.Thread.Sleep(500);
}
}
}
}
Actual active connections currently made to servers 0
Active connections retrieved from the connection pool 26
Number of connections not using connection pooling 0
Number of connections managed by the connection pool 26
Number of active unique connection strings 1
Number of unique connection strings waiting for pruning 0
Number of active connection pools 1
Number of inactive connection pools 0
Number of active connections 26
Number of ready connections in the connection pool 0
Number of connections currently waiting to be ready 0
...