Estimando os requisitos de E / S para o uso estourado

11

Temos um aplicativo que consulta um banco de dados SQL periodicamente ao longo do dia. Existem períodos de zero ou apenas atividade leve, intercalados com solicitações individuais para quantidades relativamente grandes de dados. Quando essas solicitações chegam, o objetivo principal é entregar os dados rapidamente, e o objetivo secundário é fazer isso de maneira econômica. Devido à natureza do aplicativo, é bastante improvável que os dados / índices tenham sido armazenados em cache na RAM da consulta anterior (usuários diferentes, trabalhando em diferentes partes dos dados).

Para um sistema que apresenta uso relativamente estável, ouvi a regra geral para observar o comprimento da fila de disco e manter esse número relativamente pequeno. Isso será executado especificamente na AWS, onde vi a regra geral de que um comprimento de fila de disco de 1 por 100 IOPS é razoável.

Como posso estimar os requisitos de IO para esse sistema? O comprimento da fila do disco é um indicador confiável ao lidar com consultas individuais e intermitentes? Existem outras métricas que devo considerar?

Eric J.
fonte
Existem gravações em andamento ou isso é pesado para leitura?
Jack diz que tente topanswers.xyz 26/02
@JackDouglas: São 98% das leituras. Há um monte de gravações.
Eric J.
1
Próxima pergunta: as leituras estão dispersas ou é provável que suas "solicitações individuais para quantidades relativamente grandes de dados" estejam executando E / S sequenciais?
Jack diz que tente topanswers.xyz 27/02
@JackDouglas: As maiores leituras são por meio de uma exibição indexada, de modo que a cláusula WHERE corresponde ao índice, mas retornando mais dados do que apenas o que está no índice. Não sei ao certo o que isso significa para o grau de IO sequencial. Como o subsistema de E / S subjacente é o AWS EBS, não tenho certeza de como isso afeta o acesso físico.
Eric J.
O subsistema de E / S subjacente afetará a consistência do desempenho , mas se preocupará com o acesso sequencial v disperso de maneira semelhante ao armazenamento local. Essas leituras grandes, quantos blocos distintos eles atingem normalmente? A varredura do índice em si será seqüencial, mas o acesso à tabela não será se eu o entendi corretamente até agora.
Jack diz que tente topanswers.xyz 27/02

Respostas:

10

A métrica principal que sempre considerei para E / S no SQL Server não é a IOPs ou o comprimento da fila de disco, mas a taxa de transferência do disco (s / leituras e s / gravações). No geral, os bancos de dados não são sobre quantas operações você pode lançar em um disco, mas com que rapidez essas operações são concluídas. A regra geral é ter menos de 20ms / operação (embora menor seja sempre melhor). Mais detalhes podem ser encontrados neste artigo .

O comprimento da fila de disco é um status falso e não é mais relevante. O problema é que o valor mede a fila de uma única unidade, mas agora que vivemos na era dos RAIDs, SANs e outros armazenamentos distribuídos, não há como traduzir adequadamente esse valor para um número significativo. Um excelente ponto de partida para as métricas de desempenho é este pôster da Quest / Dell, que fornece muitas coisas e explicações sobre por que elas são importantes ou não. Você não precisa usar todos eles, mas eles são um começo.

Para testar seu IO, você precisa entender sua carga de trabalho no auge. Quantas transações e quanto é armazenado em cache? A menos que você saiba e tenha medido essas medidas, é realmente difícil julgar. Você pode criar cargas de trabalho e usar ferramentas como o SQLIO para testar seu armazenamento, mas precisará de padrões de carga de trabalho para criar um teste adequado.

Por fim, uma observação sobre a AWS: Que eu saiba, a Amazon não garantirá o desempenho de IO na AWS. Isso ocorre principalmente porque o armazenamento é um recurso compartilhado massivo e é impossível avaliar os padrões de você e seus vizinhos em uma área específica de armazenamento (consulte o problema Noisy Neighbour ).

Minha recomendação seria alocar o máximo de memória possível. O SQL Server apenas enviará as coisas para fora da memória se estiver sob pressão e espaço no buffer pool (com base no LRU-K). Portanto, se seu buffer pool pode armazenar a maior parte do banco de dados na memória, você pode mitigar parte do desempenho explosivo. Além disso, considere táticas que podem manter os objetos de cache "quentes". Por fim, fique de olho no SQL 2014 e no novo recurso Hekaton .

Mike Fal
fonte
"O SQL Server só empurra as coisas para fora da memória se estiver sob pressão" ou em um ponto de verificação ?
Jack diz que tente topanswers.xyz 26/02
5
O ponto de verificação não remove objetos do buffer, mas grava páginas sujas no disco para recuperação. Ele ainda manterá os objetos no buffer pool.
Mike Fal 26/02
Obrigado pela resposta detalhada. A AWS agora possui um recurso premium chamado IOPS provisionado que garante que o número adquirido de operações de E / S por segundo possa ser executado 99,9% do tempo. Eu acho que uma operação de E / S é definida como leitura ou gravação de um bloco de dados de 16K.
26614 Eric Eric
@ MikeFal: Você tem alguma opinião sobre a metodologia de teste especificamente para esse padrão de explosão? Basta executar uma única consulta e assistir aos contadores em questão? Executar várias consultas (normalmente periódicas) uma após a outra, observando os contadores?
26414 Eric Eric
Sim, eu estou familiarizado com o PIOPS. Como afirmo, não quero saber quantas operações podem ser executadas, quero saber com que rapidez elas são. E isso não é algo que possa ser garantido pela AWS, mesmo nos PIOPs.
Mike Fal 26/02