MSSQL Server’da Performans Counter Değerlerini Kaydetme

Veritabanı yönetiminde sistemin sağlığını anlamak, sadece “çalışıyor mu?” sorusuna yanıt vermekten öte; darboğazları önceden tespit etmeyi gerektirir. SQL Server, performans sayaçları (Performance Counters) aracılığıyla bellek kullanımı ve işlem yoğunluğu hakkında hayati bilgiler sunar. Bu makalede, kritik performans göstergelerinin nasıl kayıt altına alındığını ve bu değerlerin ne ifade ettiğini inceleyeceğiz.

Performans izleme sürecinin ilk adımı, dinamik yönetim görünümlerinden (DMV) gelen verileri kalıcı dbo.OSCounters tablosuna kaydetmektedir.

USE [DBAMON]
GO

CREATE TABLE [dbo].[OSCounters](
	[counter_name] [varchar](128) NULL,
	[counter_value] [bigint] NULL,
	[counter_delta] [bigint] NULL,
	[CaptureDate] [datetime] NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[OSCounters] ADD  DEFAULT (getdate()) FOR [CaptureDate]
GO

İlgili veritabanı altında tablomuzu oluşturmuş olduk.

Sunucu üzerinde bulunan Performance Counter değerlerini aşağıdaki procedure yardımıyla toplayıp yukarıda oluşturduğumuz tabloya kaydetme işlemi yapılır.

USE [DBAMON]
GO

CREATE PROCEDURE [dbo].[CaptureOSCounters]
AS
DECLARE
	@cntr_name	varchar(128),
	@cntr_val	bigint,
	@log_date	datetime,
	@val_0		bigint	
BEGIN
	BEGIN TRY
		SELECT RTRIM([object_name]) + N':' + RTRIM([counter_name]) + N':' + RTRIM([instance_name]) cntr_name,
			   [cntr_value], GETDATE() log_date
			   into #tmp
		FROM   sys.dm_os_performance_counters
		WHERE  [counter_name] IN ( N'Page life expectancy',
								N'Buffer cache hit ratio',N'Buffer cache hit ratio base',
								N'Lazy writes/sec', N'Page reads/sec',
								N'Page writes/sec', N'Free Pages',
								N'Free list stalls/sec',
								N'User Connections',
								N'Lock Waits/sec',
								N'Number of Deadlocks/sec',
								N'Transactions/sec',
								N'Forwarded Records/sec',
								N'Index Searches/sec',
								N'Full Scans/sec',
								N'Batch Requests/sec',
								N'SQL Compilations/sec',
								N'SQL Re-Compilations/sec',
								N'Total Server Memory (KB)',
								N'Target Server Memory (KB)',
								N'Memory Grants Pending',
								N'Log write waits',
								N'Network IO waits',
								N'Page IO latch waits',
								N'Non-Page latch waits',
								N'Page latch waits',
								N'Wait for the worker',
								N'Page lookups/sec',
								N'Checkpoint pages/sec',
								N'Latch Waits/sec' );

		declare tmp cursor for select * from #tmp
		open tmp
		fetch next from tmp into @cntr_name, @cntr_val, @log_date
		while @@fetch_status=0
		begin
			select top 1 @val_0=isnull(counter_value,0)
			from DBAMon.dbo.OSCounters
			where counter_name = @cntr_name order by CaptureDate desc;
		
			insert into DBAMon.dbo.OSCounters values(@cntr_name, @cntr_val, @cntr_val - @val_0,@log_date);
			fetch next from tmp into @cntr_name, @cntr_val, @log_date;
		end;
	
		close tmp;
		deallocate tmp;
		drop table #tmp;
	END TRY
	begin catch
		declare 
			@error_message nvarchar(4000), 
			@error_number int, 
			@error_state int, 
			@error_severity int, 
			@error_procedure nvarchar(126), 
			@error_line int
		select	@error_number = error_number()
			,	@error_state = error_state()
			,	@error_severity = error_severity()
			,	@error_procedure = error_procedure()
			,	@error_line = error_line()
		set @error_message = left('CaptureCpuUsage Error Message: ' + error_message(), 4000)
		raiserror(700016, @error_severity, @error_state, @error_message)
		exec [dbo].[Capture_Error] @error_message, 
													@error_number, 
													@error_state, 
													@error_severity, 
													@error_procedure, 
													@error_line
	end catch
	
END

Veritabanı altında stored procedure oluşturuldu.

Oluşturulan procedure belirli aralıklarla performans değerlerini tabloya kaydetme işlemleri için bir job oluşturup belirli aralıklarla CaptureOSCounters procedure yapısının çalıştırılması gerekmektedir.

EXECUTE [DBAMON].[dbo].[CaptureOSCounters] ;

Job’ımız oluşturulup belirli aralıklarla çalıştırılır. Bu sayede procedure yapısında belirtilen tüm performans metriklerini kaydetmiş oluruz.

İkinci veri setinde odaklandığımız Transactions/sec metriği, sistemin gerçek zamanlı iş yükünü temsil eder. Özellikle “PasaportIslemleri” veya “KAMP” gibi spesifik veritabanları üzerinden alınan bu değerler, uygulama bazlı yoğunluk artışlarını ve veritabanı üzerindeki anlık baskıyı gözlemlememizi sağlar.

Performans sayaçlarını düzenli aralıklarla bir tabloya kaydetmek, sadece anlık sorunları çözmekle kalmaz; aynı zamanda geçmişe dönük trend analizi yapılmasına olanak tanır. Elde edilen counter_delta ve counter_value verileri, sistemin kapasite planlaması ve optimizasyon ihtiyaçları için en güvenilir rehberdir.

Başka makalede görüşmek dileğiyle..

İyilikler için karşılık beklemeyin. İnsan-9

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir