quarta-feira, 18 de março de 2015

Importancia de alinhar os discos para obter melhor performance com o SQL Server.

Antes de falar sobre a importância do alinhamento de discos, precisamos antes saber algumas nomenclaturas importantes.
Abaixo adicionei uma foto de um disco para podermos entender melhor.

Nomenclaturas:
Sectors: representa o menor pedaço de dados que pode ser lido ou escrito em um disco físico. A maioria dos discos possuem setores (sectors) de 512 bytes. Discos novos podem oferecer setores com tamanhos 1KB, 2KB, ou 4KB.
Clusters: são conhecidos por muitos como unidade de alocação de arquivo (file allocation unit). Seu tamanho é determinado quando a partição é formatada pelo Sistema Operacional. Cluster é definido por um grupo de setores (sectors) , seu tamannho ira depender do valor que foi definido para o file alocation unit. A maioria dos discos utilizam o tamanho de um setor de 512 bytes, considerando um file alocation unit de 64k então, 64K/512 bytes teremos 128 setores por cluster. Lembrando que Cluster = file alocation unit.
Track: cada lado de um disco (Platter) possui milhares de trilhas (tracks) onde são inseridos os setores (sectors) e por sua vez os clusters
Platters: são um ou mais pratos (Platters )de formato circular e de metal (quantidade depende do Hard Disk) onde são armazenadas as informações na superfície.
Stripe Unit Size: define o tamanho que os dados serão distribuídos entre os discos de um grupo RAID-0, RAID-10 ou RAID5.
Agora que entendemos as nomenclaturas podemos começar a falar sobre a importância de se alinhar um disco. O alinhamento de discos deve ser considerado para os volumes que são utilizados pelos arquivos de dados e transaction log do SQL Server.
Outra consideração importante é que o alinhamento deve ser considerado no Windows Server 2003 que não faz o alinhamento do disco por default. No Windows Server 2008 o alinhamento de discos é feito de forma automática, no entanto eu quero deixar um alerta devido ao que tenho visto em meus clientes aqui nos EUA que estão utilizando Windows Server 2008 e mesmo assim não estão com os discos alinhados. Em caso de migrações de Windows Server 2003 para Windows Server 2008, geralmente a storage é apresentada para o novo Sistema Operacional, no caso o Windows Server 2008, sem precisar redefinir os particionamentos. Mesmo sabendo que no Windows Server 2008 o alinhamento é feito por default, nesse caso não será feito porque as partições foram criados enquanto estavam no Windows Server 2003. O alinhamento é feito durante a criação da partição.
Para entendermos o porquê é necessário o alinhamento de um disco, devemos entender que todo disco usa algum espaço para armazenar informações sobre a partição, que então irão utilizar alguns setores ocultos (hidden sectors). Especialmente no Windows Server 2003 são reportados 63 setores ocultos por default. Considerando que cada setor possui 512 bytes então temos que 63 * 512 = 31.5 K que o disco ira utilizar para armazenar informações sobre a partição.
Tendo esse numero em mente vamos entender porque o disco fica desalinhado. Guarde bem em sua memória esses numeros.
Se você precisar consultar a nomenclatura acima novamente, sinta-se a vontade. Para refrescar a sua memória o Stripe Unit Size é determinado pela equipe de Storage no momento de criação das Luns, vamos considerar 64K para o nosso exemplo. Stripe Unit Size é o tamanho do “pedaço” de dados que será distribuído entre os discos de um Array da Storage.
Temos a seguinte configuração para usarmos como exemplo.
Stripe Size = 64K
Alocation Unit Size ou Cluster Size = 64K

Exemplo de um disco desalinhado.

No exemplo acima podemos ver uma situação de disco desalinhado, o Stripe Unit Size definido pela equipe de storage, possui um tamanho de 64k e esta representado na cor Azul na primeira linha da figura. O Stripe Unit Size define os limites fisicos de armazenamento para o Array.
Na segunda linha em amarelo podemos ver os setores que são utilizados para armazenar informações sobre a partição. Lembre-se que no Windows Server 2003 por default é utilizado 63 setores, considerando que o tamanho do setor é 512 bytes então teremos 31.5 K. Eu disse para você memorizar esse número. Repare que esse valor não preenche totalmente o tamanho definido pelo Stripe Unit Size que é 64K, deixando um espaço a ser preenchido. Então imagina o que irá acontecer quando os dados de usuário começar a ser gravado no disco.
Como exemplificado na linha 3 os dados de usuário, representado na cor verde, que nesse caso possui tamanho de alocação de 64K, definido pelo Alloc Unit Size, ira ser inserido entre dois espaços definidos no disco pelo Stripe Unit Size. Sempre que um dado de usuário ser inserido nos próximos espaços estará desalinhado em relação ao Stripe Unit Size definido para o Array.
Então como podemos resolver esse problema? Imagine se de alguma forma você reservasse um espaço para armazenamento de informações sobre a partição, onde o dado representado em amarelo preenchesse os 64K ao invés de 31.5K e então utilizar todo espaço definido pelo Stripe Unit no nosso exemplo a area em azul. Aconteceria que o próximo dado de usuário a ser inserido, representado em verde, iniciaria a partir do segundo Stripe Unit de 64K, evitando que a alocação feita pelo usuário não estaria entre dois espaços definidos pelo Stripe Unit. Consequentemente evitando o IO em dois lugares distintos onde precisaria apenas um.
Vamos ver agora como ficaria um exemplo utilizando um alinhamento onde reservaremos todo o espaço de 64K definido pelo Stripe Unit.

Nesse exemplo acima ao inves de usar o alinhamento default do Windows Server 2003 e utilizar apenas 31.5K, fizemos diferente e definimos o parametro align para 64K que esta representado em amarelo.
Isso irá preencher todo o espaço de 64K definido pelo parametro Stripe Unit, então as próximas alocações de dados de usuários, iniciara e terminara dentro do espaço definido pelo Stripe Unit.
Mesmo se for definido o Alloc Unit size/Cluster Size que é o bloco de dados gravado pelo usuário de 4K, estara ainda assim dentro do limite de 64K. Nesse caso serão necessarios 16 blocos de alocação de dados para preencher um Stripe Unite. Repare 16 * 4 = 64K portanto ainda estara alinhado.
Após entender essa teoria concluímos que o parâmetro Align dividido pelo Stripe Unit Size devera ser um numero inteiro sempre.
Como não se sabe a quantidade de espaço necessário para armazenar informações sobre a partição para os diferentes discos existentes no mercado, então a Microsoft recomenda utilizar o valor de alinhamento como 1024k ou 1MB.
Isso significa que assim como fizemos com 64k reservando espaço para dados de partição para garantir que os dados de usuário sejam gravados de acordo com o Stripe Unit, que nesse exemplo é 64K, podemos fazer o mesmo usando o valor 1024K recomendado pela Microsoft.
Se pegarmos o exemplo que usamos anteriormente usando um alinhamento de 64k ao invés de 31.5K (Windows Server 2003 Default) e um Stripe Unit Size de 64K temos o seguinte:
64K / 64K = 1 onde o resultado é igual a 1 bloco de Stripe Unit. Representado em amarelo, usamos 1 unidade para setores ocultos, para então iniciar a gravação dos usuários de acordo com os limites fisicos definidos pelo parametro Stripe Unit Size.
Podemos fazer o mesmo com o parametro de alinhamento 1024K e Stripe Unit Size de 64k
1024K / 64K = 16 o resultado aqui é também um numero inteiro, que significa que antes de iniciar a gravação de dados de usuários, iremos preencher 16 unidades de amarelo para setores ocultos, para então iniciar a gravação dos dados de usuário. Isso irá resultar que serão preenchidos 16 unidades de 64K para iniciar a gravação dos dados de usuário, que por sua vez estará alinhado com os limites fisicos definidos por Stripe Unit Size
Considerações
Align value : Stripe Unit Size deve ser um numero inteiro para que o disco grave de forma alinhada.
Allocation Unit Size que são blocos de dados de usuário, recomenda-se ser o mesmo valor de Stripe Unit Size.
Espero que tenham gostado do Post sobre alinhamento de discos e aguardo comentários caso tenham alguma dúvida. Em um outro post mostrarei como fazer o alinhamento de discos.
Para maiores informações e detalhes recomendo a leitura do Whitepaper Disk Partition Alignment Best Practices for SQL Server http://msdn.microsoft.com/en-us/library/dd758814(v=sql.100).aspx

Como utilizar o PERFORMANCE ANALYSIS of LOGS “PAL” para analizar falhas de performance

Uma grande ferramenta para analizar logs de contadores de performance é PAL. Através dessa ferramenta podemos gerar um relatório completo sobre os procesos em execução, utilização de CPU, utilização de Disco entre outros pontos importantes no troubleshooting de um caso de performance.
Antes de utilizar a ferramenta é necessário instalar a mesma. Para tal é necessário realizar o download e seguir os passos de instalação no endereço: http://pal.codeplex.com.
É importante observar os requisitos para a utilização PAL, entre eles a instalação dos software abaixo:
  • PowerShell v2.0 or greater
  • Microsoft .NET Framework 3.5 Service Pack 1
  • Microsoft Chart Controls for Microsoft .NET Framework 3.5
Após a instalação da ferramenta, podemos utilizar a própria para criar os contadores mais comuns e iniciar a coleta de dados.
Para fazer isso inicie a ferramenta e clique no botão "Threshold File":

Selecione em Threshold File Title qual o template você quer utilizar. Essa parte é importante pois existem templates específicos de acordo com a Role que é executada no servidor. Depois disso é só clicar em Export to Perfmon Template File:

Se abrirá uma janela para que você escolha em que local quer salvar o arquivo de template.

Agora basta abrir o performance monitor e importar um data collector, utilizando o arquivo XML exportado no passo anterior. Primeiro clicamos em New>Data Collector Set.

Clique em Create from a template (Recommended).

Clique em Browse e selecione o arquivo XML que você exportou anteriormente.

Clique em Finish.

Agora inicie o Data Collector para coletar os dados de performance:

Após a coleta dos dados de Performance clique com o botão direito em cima do Data Collector e então em STOP. Será gerado um arquivo com extensão BLG, este arquivo possui todos os dados capturados e iremos utiliza-lo para através do Performance Analysis of Logs ( PAL ) gerar um relatório amigável das informações de performance do equipamento.
Abra novamente o ( PAL ) e Clique em Next para ir para o próximo passo:

No passo Counter Log, você irá escolher qual o arquivo BLG você irá procesar, nesse caso vamos utilizar o arquivo BLG que acabamos de criar, para seleciona-lo basta clicar no botão que esta sinalizado na imagen abaixo.

Selecione o arquivo .BLG que foi criado anteriormente e clique em Next para avançar:

Na Aba Threshold File, clique em Next para avançar:

Na Aba Questions, responda as perguntas que irão ajudar a formular a análise que será realizada e clique em Next:

Em Output options mantenha o valor default e clique em Next:

Em File Output selecione onde será gravado o relatório e clique em Next:

Em Queue clique em Next:

Por final, clique em Finish:

Será aberta uma janela de prompt que executará o script "PAL".

Finalizado o script, o PAL criará um arquivo HTM na pasta que foi selecionada durante o assistente.

Nesse relatório, podemos observar diversos alertas, utilização de CPU, memoria, Disco, Rede entre outros. Todos esses gráficos são gerados com base nos dados coletados no momento em que o Data Collectors estaba em execução no equipamento. Portanto o recomendável é que o mesmo seja iniciado quando a falha de lentidão estiver ocorrendo. Sendo assim é possível através do relatório gerado pelo "PAL" observar qual é o dispositivo de hardware que está sob maior demanda naquele momento. Além disso com o relatório do "PAL" é possível identificar quais os procesos que estão sobrecarregando tal dispositivo de hardware. Por exemplo, em dos gráficos gerado pelo "PAL" é possível observar quantas requisições cada proceso está abrindo:

Essa dica se aplica aos sistemas operacionais:
  • Windows Server 2008
  • Windows Server 2008 R2
  • Windows Vista
  • Windows 7
Para utilizar o PAL no Windows Server 2003, basta utilizar o Perfwiz para criar os contadores e após criado o arquivo .blg utilizar o PAL para processar o arquivo e gerar os relatórios.

O que é e como calcular IOPS

O que são IOPS?

É o número de operações por segundo que um disco individual consegue chegar. Por exemplo, um disco SAS de 10K consegue em média 140 IOPS.

Esta velocidade é padrão na indústria com variações entre modelos, mas podemos ter uma base do que é aceitável e o fabricante do disco poderá lhe informar este número com precisão para cada modelo.

Note que a diferença é muito grande, principalmente levando em conta os novos discos SSD. Por exemplo, o disco X25-E da Intel chega a números 30 vezes maiores que os discos SAS e SATA.

Porque o IOPS é tão importante?

Esta pergunta é óbvia, mas a explicação pode não ser tão simples, pois na maioria dos casos temos a tendência de minimizar a questão alegando que uma lentidão se deve ao “desempenho da aplicação” ou “percepção do usuário”, quando na verdade pode impactar diretamente no funcionando de um aplicativo, em alguns casos até inviabilizando uma implementação.

Por exemplo, um ambiente Exchange 2003 com 2 mil caixas de correio precisa de 1,5 mil IOPS, e este número não é fácil de alcançar. O SQL Server para um banco de dados do SharePoint precisa de 5 mil IOPS para funcionar.

Como calcular o IOPS?

Multiplique o total de discos pelo tipo de RAID e conseguirá o seu número. Segue alguns exemplos:

  • O RAID 1, RAID 10 ou RAID 0 irá lhe proporcional o maior numero de IOPS possível, mas consome espaço adicional uma vez que trabalha em espelhamento
  • No RAID 5 o calculo leva em conta 1 disco a menos (no RAID 50 2 discos a menos) para as paridades, aumentando o espaço disponível ao mesmo tempo em que ganhamos performance

Como conseguir o maior IOPS possível com maior capacidade?

Temos três formas de fazer isso:

  • Utilize discos de alto desempenho, como os SAS de 15K ou o SSD, porem são mais caros e no caso do SSD de tamanhos de apenas 32GB a 300GB
  • Utilize o tipo de RAID apropriado para o desempenho e não visando o tamanho desejado como é comum, o que muitas vezes implica em utilizar RAID 10 para ter o desempenho total necessário ao invés de RAID 50. Perderíamos em capacidade total disponível, mas ganhamos em desempenho
  • Compre um storage que permita LUNs virtuais, ou seja, ele aloca os dados nos discos conforme a necessidade deste dado e não necessita dizer o tipo de RAID

O que são as LUNs virtuais?

Não vamos entrar no ponto técnico já que este é bem mais complexo, porem podemos entender o que é esta nova tecnologia sem nos tornarmos especialistas em storage.

Usando os storages mais comuns do mercado trabalhamos com LUNs da forma normal que conhecemos. Você indica que os discos X a Y formam o RAID 0, de Z a W o RAID 5 e assim por diante. Ou seja, mapeamos diretamente os discos e ficamos dependentes da capacidade de IO individual de cada um.

Nas novas linhas de storage podemos definir o tamanho da LUN sem indicar os discos e o próprio storage irá alocar automaticamente os dados mais acessados nos discos mais rápidos!

Os novos storages vendidos pela Dell, EMC, IBM e outros fabricantes são inteligentes e permitem misturar os discos. Por exemplo, posso colocar discos SSD na gaveta do storage e mais uma gaveta adicional com 24 discos de 15K SAS e não me preocupar se a LUN que criei está nos discos mais performáticos, quem fará este trabalho é o storage.

E, o mais interessante, quando o storage “perceber” que determinado dado (LUN) é mais acessado que outro ele irá realocar esta LUN para os discos mais rápidos e fazer o shift dos dados sem intervenção e queda de performance, já que trabalha em background e automático!

Referencias

Como calcular IOPS para Exchange 2003 http://technet.microsoft.com/en-us/library/bb125019(EXCHG.65).aspx

Como calcular IOPS para Exchange 2010 http://technet.microsoft.com/en-us/library/ee832791.aspx

Como calcular IOPS para o SQL do SharePoint 2010 http://technet.microsoft.com/en-us/library/cc298801.aspx

Utilitário para medir IOPS para o SQL Server (SQLIO) http://www.microsoft.com/download/en/details.aspx?displaylang=br&id=20163