Loading…

Managed Instance (#17) – Tirando relatórios pesados da produção e executando em uma réplica com dados Online!

Fala Pessoal,

Segue mais um post da série sobre Managed Instance.

A ideia desse post é simular 1 loop fazendo insert e 3 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')

E depois abri 3 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 essa 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);

Segue o resultado:

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

Mas Fabricio, no Managed Instance Business Critical não conseguimos fazer SELECT em uma réplica Read Only?

R: 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 3 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 instaância.

As conexões que faziam leitura agora se conectam na réplica Read Only conform pode ser visto abaixo:

Da para ver claramente as 3 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: Deixa eu vender aqui em paz e vai fazer seus relatórios bombas na instância Read Only.

TOP DEMAIS NÉ!?

Tudo isso sem nenhum esforço do seu time de DBA para configurar e manter essa replicação de dados. Deixa 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 post.

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!  #EuJaSabia

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

Seguem os posts anteriores sobre Managed Instance:

 

Gostou dessa Dica?

Curta, comente, compartilhe…

Assine meu canal no Youtube , curta minha página no Facebook  ou siga nossa página no Instagram para receber Dicas de Leituras, Vídeos e Eventos sobre SQL Server.

Até o próximo post.

Abraços,

Fabrício Lima

Microsoft Data Platform MVP

Consultor e Instrutor SQL Server

Trabalha com SQL Server desde 2006

One thought on “Managed Instance (#17) – Tirando relatórios pesados da produção e executando em uma réplica com dados Online!

Deixe uma resposta

%d blogueiros gostam disto: