Estamos ocupados testando um sistema OLTP que desenvolvemos no .NET 4.0 e executando o SQL Server 2008 R2 nas costas. O sistema usa filas do SQL Server Service Broker, que são de alto desempenho, mas estamos experimentando uma tendência peculiar durante o processamento.
O SQL Server processa solicitações a uma taxa empolgante por 1 minuto, seguido por ~ 20 segundos de maior atividade de gravação em disco. O gráfico a seguir ilustra o problema.
Yellow = Transactions per second
Blue = Total CPU usage
Red = Sqlsrv Disk Write Bytes/s
Green = Sqlsrv Disk Read Bytes/s
Durante a solução de problemas, tentamos o seguinte sem nenhuma alteração significativa no padrão:
- Agente do SQL Server parado.
- Matou quase todos os outros processos em execução (sem A / V, SSMS, VS, Windows Explorer, etc.)
- Removidos todos os outros bancos de dados.
- Desativou todos os cronômetros de conversação (não usamos gatilhos).
- Afastado de uma abordagem orientada a fila de mensagens para um design de monitoramento de tabela simples / bruto.
- Usou cargas diferentes, de leves a pesadas.
- Corrigidos todos os impasses.
Parece que o SQL Server pode estar construindo seu cache e gravando-o em disco em intervalos específicos baseados em tempo, mas não consigo encontrar nada online para apoiar essa teoria.
Em seguida, pretendo mudar a solução para o nosso ambiente de teste dedicado para ver se consigo replicar o problema. Qualquer ajuda nesse ínterim seria muito apreciada.
Atualização 1 Conforme solicitado, a seguir, um gráfico que inclui as páginas de ponto de verificação / segundo , a expectativa de vida da página e alguns contadores de latência do disco.
Parece que o ponto de verificação (linha azul clara) é a causa do desempenho reduzido (linha amarela) que estamos observando. ^
A latência do disco permanece relativamente consistente durante o processamento e a expectativa de vida da página não parece ter nenhum efeito perceptível. Também ajustamos a quantidade de memória RAM disponível para o SQL Server, o que também não teve um grande efeito. Alterar o modelo de recuperação de SIMPLE
para FULL
também fez pouca diferença.
Atualização 2 Alterando o "Intervalo de recuperação" da seguinte maneira, conseguimos reduzir o intervalo no qual os pontos de verificação ocorrem:
EXEC sp_configure 'show advanced options',1
GO
RECONFIGURE
GO
EXEC sp_configure 'recovery interval', '30'
GO
RECONFIGURE
GO
EXEC sp_configure 'show advanced options',0
GO
RECONFIGURE
Não tenho certeza se isso é uma prática ruim?
FULL
ou BULK_LOGGED
, ele ainda se comporta como se estivesse SIMPLE
até que você faça um backup completo.