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:
1 2 |
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:
1 2 3 4 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
-- 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:
- Azure SQL DB Managed Instance – Introdução
- Managed Instance – Criando minha primeira instância
- Managed Instance – Como se conectar direto do SSMS utilizando uma VPN?
- Managed Instance – Como se conectar através do SSMS de uma VM do Azure?
- Managed Instance (#5) – Quanto custa tudo isso?
- Managed Instance (#6) – Consigo fazer um Join entre tabelas de bases diferentes?
- Managed Instance (#7) – A função getdate() já retorna a data da minha localidade?
- Managed Instance (#8) – Suporte Microsoft em Português
- Managed Instance (#9) – Agora consigo mandar E-mail do SQL Server?
- Managed Instance (#10) – Consigo criar Linked Server?
- Managed Instance (#11) – Agora consigo criar Jobs direto no SSMS?
- Managed Instance (#12) – Configuração da Collation da instância
- Managed Instance (#13) – Como migrar uma base para o MI via Backup e Restore?
- Managed Instance (#14) – Qual o melhor Service Tier para a minha empresa? General Purpose ou Business Critical?
- Managed Instance (#14) – Qual o melhor Service Tier para a minha empresa? General Purpose ou Business Critical?
- Managed Instance (#15) – Anúncios do dia 04-12-2018
- Managed Instance (#16) – É verdade que nossa instância já vem com um AlwaysOn AG configurado?
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!”