MSSQL Server’da Memory Kullanım Durumunu Tabloya Kaydetme

Veritabanı performans sorunlarının büyük bir çoğunluğu yetersiz bellek kaynaklarından veya belleğin yanlış yapılandırılmasından kaynaklanır. MSSQL Server, doğası gereği işletim sisteminden alabildiği kadar belleği rezerve etmeye çalışır. Ancak, sistemin genel sağlığını korumak için SQL Server’ın ne kadar harcadığını ve işletim sisteminde ne kadar boş yer kaldığını anlık değil, tarihsel (historical) olarak izlemek gerekir.

Anlık izleme araçları (Activity Monitor vb.) o anki durumu gösterir. Ancak dün gece saat 03:00’te sistem neden yavaşladı sorusuna cevap veremezler. Hazırladığımız MemoryUsage tablosu ve CaptureMemoryUsage prosedürü sayesinde:

  1. Trend Analizi: Bellek kullanımı zamanla artıyor mu?
  2. Darboğaz Tespiti: İşletim sisteminde RAM miktarı kritik seviyelere düşüyor mu?
  3. Kapasite Planlama: Mevcut donanım ne kadar süre daha yeterli olacak?

DBAMON veritabanı altında MemoryUsage tablosunu oluşturuyoruz:

USE [DBAMON]
GO

CREATE TABLE [dbo].[MemoryUsage](
	[captureDate] [datetime] NOT NULL,
	[sql_physical_memory_in_use_KB] [bigint] NULL,
	[sql_physical_memory_in_use_GB] [int] NULL,
	[system_total_physical_memory_KB] [bigint] NULL,
	[system_total_physical_memory_GB] [int] NULL,
	[system_available_physical_memory_KB] [bigint] NULL,
	[system_available_physical_memory_GB] [int] NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[MemoryUsage] ADD  DEFAULT (getdate()) FOR [captureDate]
GO

Aşağıdaki prosedür, her çalıştığında o anki memory kullanım metriklerini hesaplamaktadır

USE [DBAMON]
GO

Create procedure [dbo].[CaptureMemoryUsage]
as
begin
	BEGIN TRY
		INSERT INTO [dbo].[MemoryUsage](
            [sql_physical_memory_in_use_KB]
           ,[sql_physical_memory_in_use_GB]
           ,[system_total_physical_memory_KB]
           ,[system_total_physical_memory_GB]
           ,[system_available_physical_memory_KB]
           ,[system_available_physical_memory_GB])
	SELECT 
		pm.physical_memory_in_use_kb           AS sql_physical_memory_in_use_KB,  
		CEILING(pm.physical_memory_in_use_kb/1048576.0)           AS sql_physical_memory_in_use_GB, 
		sm.total_physical_memory_kb            AS system_total_physical_memory_KB,  
		CEILING(sm.total_physical_memory_kb/1048576.0)            AS system_total_physical_memory_GB,
		sm.available_physical_memory_kb         AS system_available_physical_memory_KB , 
		CEILING(sm.available_physical_memory_kb/1048576.0)        AS system_available_physical_memory_GB 
	FROM sys.dm_os_process_memory AS pm
	CROSS JOIN sys.dm_os_sys_memory AS sm ;
	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('CaptureMemoryUsage 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;

Verilerin anlamlı olması için bu prosedürü bir SQL Server Agent Job aracılığıyla örneğin her 1 veya 5 dakikada bir çalışacak şekilde zamanlamalısınız. Bu sayede gün içindeki dalgalanmaları ve anlık işlemleri yakalayabilirsiniz.

EXECUTE [DBAMON].[dbo].[CaptureMemoryUsage];

İlgili tablomuza select çektiğimizde sonuçların başarılı bir şekilde geldiği görüşmektedir.

Yukarıda bulunan kolonların ne işe yaradığını değinelim:

Kolon AdıAçıklama
captureDateVerinin kaydedildiği tarih ve saat. Analiz yaparken zaman eksenini oluşturur.
sql_physical_memory_in_use_KBSQL Server’ın o an kullandığı toplam fiziksel bellek miktarıdır (KB cinsinden).
sql_physical_memory_in_use_GBSQL Server’ın kullandığı belleğin GB’a yuvarlanmış halidir. (Örn: 1844 GB).
system_total_physical_memory_KBSunucuda takılı olan toplam fiziksel RAM miktarıdır (KB cinsinden).
system_total_physical_memory_GBSunucudaki toplam RAM’in GB cinsinden karşılığıdır. (Örn: 2048 GB yani 2TB).
system_available_physical_memory_KBİşletim sisteminde o an boşta duran, kullanılabilir bellek miktarıdır (KB).
system_available_physical_memory_GBİşletim sisteminde kalan boş yerin GB cinsinden karşılığıdır. (Örn: 157 GB).

MSSQL Server’da Memory Kullanım Durumunu Tabloya Kaydetme işlemiyle artık herhangi bir sorun anında memory üzerinde nelerin sıkıntı yarattığını görmüş olacağız.

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

Anne babaya kaba davranmayın İsra-23

Author: Yunus YÜCEL

Bir yanıt yazın

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