Penghitung peristiwa di SqlClient
Berlaku untuk: .NET Framework .NET Core .NET Standard
Penting
Penghitung peristiwa tersedia saat menargetkan .NET Core 3.1 dan yang lebih tinggi atau .NET Standard 2.1 dan yang lebih tinggi. Fitur ini tersedia dimulai dengan Microsoft.Data.SqlClient
versi 3.0.0.
Anda dapat menggunakan Microsoft.Data.SqlClient penghitung peristiwa untuk memantau status aplikasi Anda dan sumber daya koneksi yang digunakannya. Penghitung peristiwa dapat dipantau oleh .NET CLI global tools
dan perfView
atau dapat diakses secara terprogram menggunakan EventListener kelas di System.Diagnostics.Tracing namespace layanan.
Penghitung peristiwa yang tersedia
Saat ini ada 16 penghitung peristiwa berbeda yang tersedia untuk Microsoft.Data.SqlClient seperti yang dijelaskan dalam tabel berikut:
Nama | Nama tampilan | Deskripsi |
---|---|---|
active-hard-connections | Koneksi aktif aktual yang saat ini dibuat ke server | Jumlah koneksi yang saat ini terbuka untuk server database. |
hard-connects | Laju koneksi aktual ke server | Jumlah koneksi per detik yang sedang dibuka ke server database. |
hard-disconnects | Tingkat pemutusan aktual dari server | Jumlah pemutusan sambungan per detik yang sedang dibuat ke server database. |
active-soft-connects | Koneksi aktif yang diambil dari kumpulan koneksi | Jumlah koneksi yang sudah terbuka yang digunakan dari kumpulan koneksi. |
soft-connects | Laju koneksi yang diambil dari kumpulan koneksi | Jumlah koneksi per detik yang sedang digunakan dari kumpulan koneksi. |
pemutusan sambungan sementara | Laju koneksi yang dikembalikan ke kumpulan koneksi | Jumlah koneksi per detik yang dikembalikan ke kumpulan koneksi. |
number-of-non-pooled-connections | Jumlah koneksi yang tidak menggunakan pengumpulan koneksi | Jumlah koneksi aktif yang tidak dikumpulkan. |
jumlah koneksi terkumpul | Jumlah koneksi yang dikelola oleh kumpulan koneksi | Jumlah koneksi aktif yang dikelola oleh infrastruktur pengumpulan koneksi. |
number-of-active-connection-pool-groups | Jumlah string koneksi unik aktif | Jumlah grup kumpulan koneksi unik yang aktif. Penghitung ini dikendalikan oleh jumlah string koneksi unik yang ditemukan di AppDomain. |
number-of-inactive-connection-pool-groups | Jumlah string koneksi unik yang menunggu pemangkasan | Jumlah grup kumpulan koneksi unik yang ditandai untuk pemangkasan. Penghitung ini dikendalikan oleh jumlah string koneksi unik yang ditemukan di AppDomain. |
number-of-active-connection-pools | Jumlah kumpulan koneksi aktif | Jumlah total kumpulan koneksi. |
number-of-inactive-connection-pools | Jumlah kumpulan koneksi yang tidak aktif | Jumlah kumpulan koneksi tidak aktif yang belum memiliki aktivitas terbaru dan menunggu untuk dibuang. |
number-of-active-connections | Jumlah koneksi aktif | Jumlah koneksi aktif yang saat ini sedang digunakan. |
jumlah koneksi bebas | Jumlah koneksi siap di kumpulan koneksi | Jumlah koneksi terbuka yang tersedia untuk digunakan dalam kumpulan koneksi. |
number-of-stasis-connections | Jumlah koneksi yang saat ini menunggu untuk siap | Jumlah koneksi yang saat ini menunggu penyelesaian tindakan dan yang tidak tersedia untuk digunakan oleh aplikasi. |
jumlah koneksi yang diklaim kembali | Jumlah koneksi yang diklaim kembali dari GC | Jumlah koneksi yang telah direklamasi melalui pengumpulan sampah di mana Close atau Dispose tidak dipanggil oleh aplikasi. Catatan Tidak secara eksplisit menutup atau membuang koneksi menyakiti performa. |
Mengambil nilai penghitung peristiwa
Ada dua cara utama untuk mengonsumsi EventCounters, baik secara in-proc, atau out-of-proc. Untuk informasi selengkapnya, lihat Menggunakan EventCounters.
Mengonsumsi out-of-proc
Di Windows, Anda dapat menggunakan PerfView dan Xperf untuk mengumpulkan data penghitung peristiwa. Untuk informasi selengkapnya, lihat Mengaktifkan pelacakan peristiwa di SqlClient. Anda dapat menggunakan penghitung dotnet dan dotnet-trace, yang merupakan alat .NET lintas platform untuk memantau dan mengumpulkan data penghitung peristiwa.
Contoh di luar proc
Perintah berikut menjalankan dan mengumpulkan nilai penghitung peristiwa SqlClient sekali setiap detik. Mengganti EventCounterIntervalSec=1
dengan nilai yang lebih tinggi memungkinkan pengumpulan jejak yang lebih kecil dengan granularitas yang lebih sedikit dalam data penghitung.
PerfView /onlyProviders=*Microsoft.Data.SqlClient.EventSource:EventCounterIntervalSec=1 run "<application-Path>"
Perintah berikut mengumpulkan nilai penghitung peristiwa SqlClient sekali setiap detik.
dotnet-trace collect --process-id <pid> --providers Microsoft.Data.SqlClient.EventSource:0:1:EventCounterIntervalSec=1
Perintah berikut memantau nilai penghitung peristiwa SqlClient setiap tiga detik sekali.
dotnet-counters monitor Microsoft.Data.SqlClient.EventSource -p <process-id> --refresh-interval 3
Perintah berikut memantau nilai penghitung peristiwa SqlClient yang dipilih setiap detik sekali.
dotnet-counters monitor Microsoft.Data.SqlClient.EventSource[hard-connects,hard-disconnects] -p <process-id>
Mengonsumsi dalam proc
Anda dapat menggunakan nilai penghitung melalui API EventListener . EventListener
Adalah cara in-proc untuk mengonsumsi peristiwa apa pun yang ditulis oleh instans EventSource di aplikasi Anda. Untuk informasi selengkapnya, lihat EventListener.
Contoh dalam proc
Kode sampel berikut mengambil Microsoft.Data.SqlClient.EventSource
peristiwa menggunakan EventCounterIntervalSec=1
. Ini menulis nama penghitung dan nilainya Mean
pada setiap pembaruan penghitung peristiwa.
Catatan
Diperlukan untuk menentukan EventCounterIntervalSec
nilai properti saat mengaktifkan peristiwa ini.
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
...