Bu yazımızda DMV ve DMF serisinin 3.’süne bakıyor olacağız. Konuya İlişkin daha detaylı bilgiye sahip olmak isterseniz ya da önceki serileri okumak isterseniz. SQL Server DMV ve DMF – I ve SQL Server DMV – II makalelerine göz gezdirilebilirsiniz.
Bu yazımızda SQL Server üzerinde yoğun olarak kullandığımız ve SQL Operating system ile ilişkili bilgilere erişmek istediğimizde ihtiyacımız olan DMV ve DMF’lere göz gezdireceğiz. Bildiğiniz gibi DMV ve DMF’ler problem teşhisinde kullanıldığı gibi monitoring etmek içinde çokça kullanılmaktadır. Özellikle Operating system ile ilgili kullanmak istediğimizd sys.dm_os ile başlayanları kullanabiliriz.
Peki biz hangi DMV’leri ne için ve nasıl okuyoruz?
SQL Server’ın üzerinde koştuğu Windows’un bilgilerine ulaşmak için;
SELECT * FROM sys.dm_os_windows_info;
Görsel – 1
Windows_sku: Stock Keeping Unit
Stock Keeping Unit değeri Windows_release sonucunun hexadecimal çıktısıdır.
Görsel – 2
48 = 0x30 olduğunu biliyoruz. Bu değeri hesaplamak için Hexadecimal değeri Binary değere convert ederek elde edebilirsiniz.
SQL Server ve üzerinde koştuğu Windows’un kaynak bilgisine sahip olmak istediğimizde;
sys.dm_os_sys_info
DMV’si sql server’ın kullandığı CPU ve Memory kaynaklarına ilişkin detaylı olarak bilgilendirme yapacaktır.
Aynı zamanda Windows ve sql server’ın ne zaman restart olduğu bilgisine erişebilirim.
SELECT DATEADD(s,((-1)*(OSI.[ms_ticks]/1000)),GETDATE()) AS last_WindowsServer_restart, OSI.sqlserver_start_time, (DATEDIFF(s, DATEADD(s,((-1)*(OSI.[ms_ticks]/1000)),GETDATE()), OSI.sqlserver_start_time)) AS recovery_time_seconds FROM sys.[dm_os_sys_info] OSI;
Görsel – 3
Server’ın ne kadar süre önce restart olduğu bilgisine erişmek istediğimizde;
SELECT [ms_ticks] AS ms_since_restart, [ms_ticks]/1000 AS seconds_since_restart, CAST([ms_ticks]/1000/60.0 AS DECIMAL(15,2)) AS minutes_since_restart, CAST([ms_ticks]/1000/60/60.0 AS DECIMAL(15,2)) AS hours_since_restart, CAST([ms_ticks]/1000/60/60/24.0 AS DECIMAL(15,2)) AS days_since_restart, DATEADD(s,((-1)*([ms_ticks]/1000)),GETDATE()) AS time_of_last_restart FROM sys.[dm_os_sys_info];
Görsel – 4
CPU hakkında bilgilere erişmek istediğimde;
DECLARE @xp_msver TABLE ( [idx] [int] NULL ,[c_name] [varchar](100) NULL ,[int_val] [float] NULL ,[c_val] [varchar](128) NULL ) INSERT INTO @xp_msver EXEC ('[master]..[xp_msver]');; WITH [ProcessorInfo] AS ( SELECT ([cpu_count] / [hyperthread_ratio]) AS [number_of_physical_cpus] ,CASE WHEN hyperthread_ratio = cpu_count THEN cpu_count ELSE (([cpu_count] - [hyperthread_ratio]) / ([cpu_count] / [hyperthread_ratio])) END AS [number_of_cores_per_cpu] ,CASE WHEN hyperthread_ratio = cpu_count THEN cpu_count ELSE ([cpu_count] / [hyperthread_ratio]) * (([cpu_count] - [hyperthread_ratio]) / ([cpu_count] / [hyperthread_ratio])) END AS [total_number_of_cores] ,[cpu_count] AS [number_of_virtual_cpus] ,( SELECT [c_val] FROM @xp_msver WHERE [c_name] = 'Platform' ) AS [cpu_category] FROM [sys].[dm_os_sys_info] ) SELECT [number_of_physical_cpus] ,[number_of_cores_per_cpu] ,[total_number_of_cores] ,[number_of_virtual_cpus] ,LTRIM(RIGHT([cpu_category], CHARINDEX('x', [cpu_category]) - 1)) AS [cpu_category] FROM [ProcessorInfo]
Yukarıdaki script ile fiziksel core sayısı, cpu başına düşen core sayısına, toplam core sayısına, sanal core sayısına ve kategori sayısına ulaşabiliriz.
SQL Server’ın ve Diğer Process’lerin güncel olarak ne kadar CPU kullandığına bakmak istersek;
set nocount on declare @ts_now2 bigint select @ts_now2 = cpu_ticks /( cpu_ticks / ms_ticks ) /*cpu_ticks / convert(float, cpu_ticks_in_ms)*/ from sys.dm_os_sys_info select top 1 record_id,dateadd(ms, -1 * (@ts_now2 - [timestamp]), GetDate()) as EventTime, SQLProcessUtilization,SystemIdle,100 - SystemIdle - SQLProcessUtilization as OtherProcessUtilization from (select record.value('(./Record/@id)[1]', 'int') as record_id, record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') as SystemIdle, record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int') as SQLProcessUtilization, timestamp from (select timestamp, convert(xml, record) as record from sys.dm_os_ring_buffers where ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR' and record like '%<SystemHealth>%') as x ) as y order by record_id desc
Bu süreci saat saat izlemek istersek eğer; DECLARE @ms_ticks_now BIGINT SELECT @ms_ticks_now = ms_ticks FROM sys.dm_os_sys_info; SELECT TOP 100 record_id ,dateadd(ms, - 1 * (@ms_ticks_now - [timestamp]), GetDate()) AS EventTime ,[SQLProcess (%)] ,SystemIdle ,100 - SystemIdle - [SQLProcess (%)] AS [OtherProcess (%)] FROM ( SELECT record.value('(./Record/@id)[1]', 'int') AS record_id ,record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') AS SystemIdle ,record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int') AS [SQLProcess (%)] ,[timestamp] FROM ( SELECT [timestamp] ,convert(XML, record) AS record FROM sys.dm_os_ring_buffers WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR' AND record LIKE '%<SystemHealth>%' ) AS x ) AS y ORDER BY record_id DESC
Görsel – 5
0 Yorum