Todos SGBD, por maior que sejam, possuem os dados armazenados em discos, exceto raríssimas exceções. Até quando se fala em soluções de armazenamento (storage), estamos falando em discos. Neste artigo, minha intenção é explicar os parâmetros de discos rígidos e mostrar como podem afetar o desempenho no acesso a informações.
Parâmetros básicos
Ao escolher um disco, três parâmetros são absolutamente essenciais: tempo de seek, tempo de latência e taxa de transferência.
Tempo de seek é o tempo necessário para mover o cabeçote de leitura/gravação para a trilha adequada. O tempo de seek mínimo é aquele necessário para passar de uma trilha para a outra imediatamente antes ou depois. O tempo de seek máximo envolve a movimentação do ponto mais interno até o mais externo. E há o tempo de seek médio, que uma relação probabilística entre ambos. Atenção, é uma média probabilística, não uma média aritmética simples.
Para localizar o início de qualquer arquivo, considera-se o tempo de seek médio. Em discos onde os arquivos estejam bem organizados, leituras sequenciais conduzem apenas a operações de seek mínimo. Discos degradados, com fragmentação dos arquivos, resultam em mais operações de seek médio, o que é ruim, pois aumenta o tempo de acesso.
SGBD que alocam previamente os arquivos de armazenamento, como os datafiles do Oracle, evitam a fragmentação do disco. Datafiles com alocação dinâmica tendem a alocar os novos segmentos em locais diferentes do disco, degradando o desempenho. Assim, é melhor errar por excesso, definindo datafiles maiores. Bem como é melhor definir incrementos maiores de espaço para os datafiles, evitando a fragmentação dos arquivos.
Tempo de latência é o tempo para localizar um setor dentro de uma trilha do disco. Quanto maior o número de rotações por minuto (RPM), menor o tempo de latência. O cálculo é simples, tlat = 1/RPM.
Taxa de transferência é quantidade de bits que podem ser transferidos do disco para a memória principal (ou no sentido contrário).
O melhor é reduzir os tempos de latência e aumentar a taxa de transferência.
Buffer da controladora de disco
Neste ponto, é importante explicar que as controladoras de disco possuem buffers gerenciados exclusivamente por elas, sem interferência do sistema operacional ou SGBD. Quanto maior o buffer da controladora, melhor, pois aumentam as chances de, no próximo acesso, um determinado setor ser encontrado no buffer da controladora, evitando o acesso físico ao disco.
Para preencher o buffer, as controladoras utilizam um mecanismo de leitura avançada dos próximos setores do disco; em vários modelos, toda uma trilha é lida e mantida no buffer, na expectativa que os próximos acessos serão realizados a setores da mesma trilha;
Ainda, com o buffer na controladora, há duas taxas de transferência a considerar: entre o disco e a controladora, que tem o maior valor; e entre a controladora e a memória principal do servidor. Também influencia a taxa de transferência o número de portas paralelas existentes. Há storages com até 1024 portas, que, obviamente, deverão ter correspondência no servidor.
Experimento
Recentemente fiz um experimento para verificar o desempenho dos discos do meu computador. Escrevi pequenos programas em C, que repetiam acessos a arquivos inúmeras vezes e, ao final, indicam o tempo total de execução e o tempo médio para executar cada operação individual. Meu interesse era medir quatro diferentes situações de acesso a arquivos:
- tempo de leitura em arquivos sequenciais
- tempo de leitura em arquivos de acesso randômicos
- tempo de gravação em arquivos sequenciais
- tempo de gravação em arquivos de acesso randômicos
Acessos seqüenciais são típicos de arquivos de log ou auditoria. Acessos randômicos ocorrem em arquivos de dados e índices. A figura 1 ilustra os resultados obtidos variando o tamanho do arquivo lido. Os tempos foram obtidos desligando o buffer do sistema operacional, ou seja, realmente fazendo as operações nos discos. Este detalhe é fundamental, pois os resultados seriam totalmente diferentes com o buffer do sistema operacional ligado.
Para arquivos pequenos, a leitura e gravação de dados com acesso sequencial ou randômico é semelhante, devido ao buffer da controladora de disco, que não pode ser desligado. A medida que o arquivo cresce, a partir do ponto P1, há uma diferenciação, até atingir o ponto P2, de tamanho do arquivo, onde o tempo médio de acesso randômico estabiliza no seu valor máximo.
No equipamento utilizado, os valores encontrados foram:
- Tempo de leitura em acesso sequencial = 0,6 ms
- Tempo de leitura em acesso randômico = 6,2 ms
- Tempo de gravação em acesso sequencial = 3,2 ms
- Tempo de gravação em acesso randômico = 24,9 ms
- P1 = 100 setores do disco, cada setor com 4Kb.
- P2 = 980 setores do disco, cada setor com 4Kb.
Os valores mostrados incluem todas as etapas necessárias, como seek, latência e transferência. Se utilizarmos os métodos tradicionais de estimativa de tempo de leitura ou gravação, teríamos valores muito maiores que estes. O disco utilizado, segundo o fabricante, tem os seguintes parâmetros:
- Tempo de seek mínimo: 2 ms
- Tempo de seek médio: 12 ms
- Tempo de latência:5,6 ms
- Taxa de transferência para memória: 150 Mb/s
- Tempo para transferir 4Kb: 0,026ms
Assim, para localizar e transmitir um setor de disco poderíamos esperar 7,626 ms (2 ms + 5,6 ms + 0,026 ms). Como o tempo medido para leitura sequencial foi de 0,6 ms, toda diferença pode ser creditada a taxa de acerto do buffer da controladora, que deve ter sido próxima a 92%.
Já para a leitura randômica, o tempo medido foi de 6,2 ms. O esperado seria resultado da soma 12 ms + 5,6 ms + 0,026 ms), ou seja, 17,626 ms. Neste caso, a taxa de acerto do buffer da controladora reduziu para 65%.
Conclusão
Certo, a conclusão é meio óbvia, mas sempre é bom repetir: o ideal é termos discos mais rápidos, maior taxa de transferência e controladoras com mais memória. Também é fundamental a ordem de grandeza envolvida: o acesso a discos é medido em milisegundos, ou seja, 10-3 segundos. O acesso a memória pelo processador em nanosegundos (10-9). Portanto, enquanto um setor é lido no disco, a CPU pode executar um milhão de acessos a memória. Portanto, aumentar a memória do servidos do SGBD é investimento garantido quanto a redução do tempo de processamento de consultas.