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:
- Managed Instance – Como migrar uma base para o MI via backup e restore?
- Managed Instance – Configuração da Collation da instância
- Managed Instance – Consigo fazer um Join entre tabelas de bases diferentes?
- Managed Instance – Criando minha primeira instância
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.