terça-feira, 23 de julho de 2019

Validar Memoria, CPU, Consumo Memoria, Consumo de CPU, Tipo Servidor, Batch Requests/sec e Page Life Expectancy


Pessoal, abaixo um script muito interessante para uma validação inicial de de um Servidor SQL Server:
Retorno da consulta:
-- Total de Memoria no Servidor
-- % Uso de Memoria
-- % Qtde de CPU
-- VM ou servidor Fisico
-- Transações por segundo no SQL Server (bom para monitorar como está a utilização do banco de dados);
-- Quantidade de conexões no banco de dados (bom para monitorar quando temos um maior número de usuários conectados)
-- Consumo de CPU do servidor (bom para acompanhar o consumo de CPU);
-- [Page Life Expectancy] Expectativa de vida em segundos de uma página na memória do SQL Server (bom para monitorar se você está mantendo dados em cache por muito tempo, evitando acessos a disco

Parte do script veio da rotina de contatores do brother Fabrício Lima (https://www.fabriciolima.net/blog/2016/06/22/queries-do-dia-a-dia-monitorando-contadores-de-forma-simples-via-dmv/)


USE MASTER
GO

DECLARE 
 @BATCHREQUESTS INT,
 @USER_CONNECTION INT,
 @CPU INT, 
 @PLE INT,
 @V_CPU_COUNT INT,
 @V_BATCH_REQUESTS INT

DECLARE 
 @REQUESTSPERSECONDSAMPLE1 BIGINT,
 @REQUESTSPERSECONDSAMPLE2 BIGINT

DECLARE 
 @V_SERVER_MEMORY_GB VARCHAR(255),
 @V_PER_MEMORY_USED VARCHAR(255),
 @V_VIRTUAL_MACHINE_TYPE_DESC VARCHAR(255)


SELECT 
 @REQUESTSPERSECONDSAMPLE1 = CNTR_VALUE 
FROM SYS.DM_OS_PERFORMANCE_COUNTERS WHERE COUNTER_NAME = 'BATCH REQUESTS/SEC'

WAITFOR DELAY '00:00:05'

SELECT 
 @REQUESTSPERSECONDSAMPLE2 = CNTR_VALUE 
FROM SYS.DM_OS_PERFORMANCE_COUNTERS WHERE COUNTER_NAME = 'BATCH REQUESTS/SEC'

SELECT @BATCHREQUESTS = (@REQUESTSPERSECONDSAMPLE2 - @REQUESTSPERSECONDSAMPLE1)/5

SELECT 
 @USER_CONNECTION = CNTR_VALUE
FROM SYS.DM_OS_PERFORMANCE_COUNTERS
WHERE COUNTER_NAME = 'USER CONNECTIONS'
        
SELECT  TOP(1) @CPU  = (SQLProcessUtilization + (100 - SystemIdle - SQLProcessUtilization ) )
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 
        
        
SELECT
 @PLE = CNTR_VALUE 
FROM SYS.DM_OS_PERFORMANCE_COUNTERS
WHERE COUNTER_NAME = 'PAGE LIFE EXPECTANCY'
 AND OBJECT_NAME LIKE '%Buffer Manager%'


SELECT  
 @V_SERVER_MEMORY_GB = round(total_physical_memory_kb/1048576.0,2),-- AS "SERVER_MEMORY_GB"
 @V_PER_MEMORY_USED = round(100 - (100 * CAST(available_physical_memory_kb AS DECIMAL(18,3))/CAST(total_physical_memory_kb AS DECIMAL(18,3))) ,2),-- AS "PER_MEMORY_USED"
 @V_CPU_COUNT = CPU_COUNT,
 @V_VIRTUAL_MACHINE_TYPE_DESC = VIRTUAL_MACHINE_TYPE_DESC
FROM SYS.DM_OS_SYS_INFO SYSINFO
OUTER APPLY SYS.DM_OS_SYS_MEMORY 


DECLARE @V1 BIGINT, @DELAY SMALLINT = 2, @TIME DATETIME;
 
SELECT @TIME = DATEADD(SECOND, @DELAY, '00:00:00');
 
SELECT @V1 = CNTR_VALUE 
FROM MASTER.SYS.DM_OS_PERFORMANCE_COUNTERS
WHERE COUNTER_NAME = 'Batch Requests/sec';
 
WAITFOR DELAY @time;
 
 /* [VIRTUAL_MACHINE_TYPE_DESC]
 https://docs.microsoft.com/pt-br/sql/relational-databases/system-dynamic-management-views/sys-dm-os-sys-info-transact-sql?view=sql-server-2017
 NONE = SQL Server não está em execução em uma máquina virtual.
 HYPERVISOR = o SQL Server está em execução dentro de um hipervisor, o que implica uma virtualização assistida por hardware. Quando a função Hyper-V é instalada, o hipervisor hospeda o sistema operacional, para que uma instância em execução no sistema operacional host esteja em execução no hipervisor.
 OTHER = o SQL Server está em execução dentro de uma máquina virtual que não usa assistente de hardware, como o Microsoft Virtual PC.
 */

SELECT 
 @V_BATCH_REQUESTS = (CNTR_VALUE - @V1)/@DELAY   -- Transações por segundo no SQL Server (bom para monitorar como está a utilização do banco de dados);
FROM MASTER.SYS.DM_OS_PERFORMANCE_COUNTERS
WHERE COUNTER_NAME='Batch Requests/sec';


SELECT 
 @V_SERVER_MEMORY_GB    AS [SERVER_MEMORY_GB]   -- Total de Memoria no Servidor
 ,@V_PER_MEMORY_USED    AS [PER_MEMORY_USED]   -- % Uso de Memoria
 ,@V_CPU_COUNT     AS [CPU_COUNT]     -- % Qtde de CPU
 ,@V_VIRTUAL_MACHINE_TYPE_DESC AS [VIRTUAL_MACHINE_TYPE_DESC] -- VM ou servidor Fisico
 ,@V_BATCH_REQUESTS    AS [BATCH REQUESTS/SEC]   -- Transações por segundo no SQL Server (bom para monitorar como está a utilização do banco de dados);
 ,@USER_CONNECTION    AS QT_USER_CONNECTION   -- Quantidade de conexões no banco de dados (bom para monitorar quando temos um maior número de usuários conectados)
 ,@CPU       AS [%_CPU]      -- Consumo de CPU do servidor (bom para acompanhar o consumo de CPU);
 ,@PLE       AS [Page Life Expectancy]  -- [Page Life Expectancy] Expectativa de vida em segundos de uma página na memória do SQL Server (bom para monitorar se você está mantendo dados em cache por muito tempo, evitando acessos a disco






Um comentário:

  1. Boa Luiz, muito bom compartilhar esse conhecimento, meu brother! Continue!!

    ResponderExcluir

Migrando Blog https://luizflsilva.wordpress.com/

Curtindo cada vez mais a criar conteudo que possa levar aprendizado a amantes e profissionais da area de banco de dados, estou migrando o bl...