Banco de Dados

22 mai, 2019

Managed Instance – Tirando relatórios pesados da produção e executando em uma réplica com dados online

Publicidade

Fala, pessoal!

A ideia deste artigo é simular um loop fazendo insert e três loops fazendo consultas para monitorar o consumo de CPU do servidor.

Primeiramente vou rodar tudo em uma única instância. Depois, vou balancear a carga e mandar as conexões de leitura para a instância Read Only do MI.

Utilizando tudo na mesma instância

Simulando um ambiente de produção, deixei um loop de insert executando em uma conexão:

while 1 = 1
insert into Jogador_Bom(Nome) values('ASalskasdla kjFaçlkçkçlkjlksasdai sdwdqwdFabianjalsidal')

Em seguida, abri três outras conexões e deixei um loop executando a consulta abaixo para simular um movimento no ambiente:

set nocount on
declare @cod int
while 1=1
select @cod = count(*) from TeamFabianoAmorim..Jogador_Bom where nome like '%Fabiano Amorim%'

Segue abaixo uma foto da Whoisactive com essas queries sem execução na minha instância de produção:

Usando a query abaixo, do Glenn Berry, podemos monitorar o consumo de CPU da minha instância:

-- Get CPU Utilization History for last 256 minutes (in one minute intervals)  (Query 46) (CPU Utilization History)
DECLARE @ts_now bigint = (SELECT cpu_ticks/(cpu_ticks/ms_ticks) FROM sys.dm_os_sys_info WITH (NOLOCK)); 

SELECT TOP(256) SQLProcessUtilization AS [SQL Server Process CPU Utilization], 
               SystemIdle AS [System Idle Process], 
               100 - SystemIdle - SQLProcessUtilization AS [Other Process CPU Utilization], 
               DATEADD(ms, -1 * (@ts_now - [timestamp]), GETDATE()) AS [Event Time] 
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 WITH (NOLOCK)
			WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR' 
			AND record LIKE N'%<SystemHealth>%') AS x) AS y 
ORDER BY record_id DESC OPTION (RECOMPILE);

Resultado:

Veja que minha instância está utilizando 19% de CPU após a execução das consultas.

  • “Mas, Fabrício, no Managed Instance Business Critical não conseguimos fazer SELECT em uma réplica Read Only?”

Sim. Vamos mudar um pouco nosso teste.

Balanceando a carga da produção

Agora vou manter o loop de insert na produção e abrir as três conexões na réplica Read Only.

Na produção, deixei o loop de insert executando:

Repare que, com a função DATABASEPROPERTYEX, consigo provar que estou conectado na instância READ_WRITE.

Veja que só tenho o insert rodando nessa instância. As conexões que faziam leitura agora se conectam na réplica Read Only conforme pode ser visto abaixo:

Podemos ver claramente as três em execução na whoisactive.

Vamos ver se o processamento realmente foi balanceado com essa mudança.

Segue o consumo de CPU da produção:

Com a execução apenas do insert, o processamento do meu servidor de produção (READ_WRITE) agora baixou para 1%.

Rodando a mesma query no servidor Read Only:

A bomba das queries que elevam o consumo do servidor agora estão impactando a réplica READ_ONLY e não a produção READ_WRITE.

No popular, seria:

  • “Deixe-me vender aqui em paz e vá fazer seus relatórios bombas na instância Read Only”

Excelente, né?

Tudo isso sem nenhum esforço do seu time de DBA para configurar e manter essa replicação de dados. Deixe o DBA gastar o tempo dele fazendo tuning de queries para melhorar a performance do sistema e deixar os clientes felizes!

  • “Muito bom, Fabrício, mas a galera está curiosa para saber qual o resultado da consulta que utilizou no seu artigo”

Segue o resultado da busca na tabela importada da FIFA procurando “jogador bom” com o nome de Fabiano Amorim no time dele:

Resultado: zero linhas retornadas!

É isso aí, pessoal. Espero que essa informação seja útil pra vocês.

Seguem os artigos já publicados aqui no portal sobre Managed Instance:

Gostaram da dica? Curtam, comentem e compartilhem.

Assinem o meu canal no YouTube, curtam minha página no Facebook ou sigam nossa página no Instagram para receber dicas de leitura, vídeos e novidades sobre eventos de SQL Server.

Até o próximo artigo!

Abraços.