Artigos Técnicos
Análise de Subsistemas Avançados de Armazenamento
Mesmo que milhões de dólares sejam gastos na mais cara e poderosa controladora de armazenamento, junto com modernos canais FICON de 2Gb interligados a um book dedicado de uma T-Rex, caso o perfil de operações de entrada e saída de um ambiente seja 100% “cache-miss”, os tempos de resposta destas operações continuarão sendo da ordem de 20mS ou mais. Isto se deve ao fato de toda e qualquer unidade de armazenamento ainda ser baseada em discos físicos, com seus já conhecidos tempos de latência e acesso (veja Unidade 1 – Discos Físicos).
A única forma de obtermos os tempos aos quais temos nos acostumado, da ordem de 2mS por operação de disco é, em termos simples, os dados NÃO ESTAREM SOMENTE nos discos, mas também pré-armazenados em uma área de memória intermediaria chamada, genericamente, de CACHE. Evolução natural dos primeiros SMBs (Speed Matching Buffers), das controladoras IBM-3880, as áreas de cache, respondendo em velocidade eletrônica às operações viabilizaram os tempos de acesso necessários aos atuais ambientes transacionais, assim como as cada vez mais constritas janelas dedicadas ao processamento batch tradicional.
Novamente, a idéia aqui é bastante simples : caso seja detectado, pela controladora, um padrão de acesso seqüencial aos dados, esta iniciará um processo de pré-carga, lendo os próximos registros ou trilhas ANTES que os mesmos sejam pedidos pela aplicação. Desta forma, quando o pedido de operação for recebido, os dados já terão sido trazidos das unidades de disco para a memória, podendo ser imediatamente enviados em resposta.
Entretanto, a primeira parte desta descrição constantemente tem sua importância diminuída, ou seja, tudo se inicia com a DETECÇÃO DE UM PADRÃO SEQÜENCIAL de acesso. Sem que isso ocorra (acesso 100% aleatório), os algoritmos e áreas de cache tornam-se quase inúteis, servindo somente como uma memória intermediaria para operações rápidas de gravação, o que, em média, representam algo da ordem de 20% das operações normais de um ambiente de produção.
Portanto, pelo exposto acima, há 2 fatores que impactam fortemente o desempenho de uma controladora : a porcentagem de acesso seqüencial (que mais tarde se traduzirá em cache-hits), e a velocidade com que este acesso é feito (caso as operações, mesmo que seqüenciais, sejam feitas muito rapidamente, ou sob uma carga de sistema muito pesada, não haverá tempo hábil para a controladora pré-carregar os dados antes da chegada das operações).
Uma outra função importante do cache é servir de área limítrofe entre a visão lógica das aplicações, e a implementação física de armazenamento (RAID-5 ou LSF, por exemplo). Durante uma operação de gravação, os dados chegam de acordo com o formato que os métodos de acesso de cada partição “pensam” que os dados finais tem (estruturas de CCWs). Deste ponto em diante, os algoritmos de simulação da controladora ganham controle e gravam cada bloco ou trilha, fisicamente, de acordo com seu próprio modelo de emulação, ocorrendo o exato oposto durante uma leitura. Os dados físicos são extraídos e convertidos de sua estrutura física, típica de cada subsistema, para o formato esperado pelas aplicações. Um ponto interessante sobre isso é que nenhuma das controladoras modernas realmente suporta o conjunto completo de instruções a disco disponível no z/OS (ou sua versão anterior, o OS/390). De um modo geral, opções do tipo “bypass cache” ou “inhibit cache load”, apesar de entendidas, não tem mais como ser respeitadas, uma vez que TODOS OS DADOS PASSAM PELO CACHE. Outras, como as relativas a “Record Level Cache”, típicas em operações VSAM LDS para DB2, recebem suporte apenas parcial nas controladoras de alguns fornecedores. Numa operação típica, a controladora carregará, no primeiro acesso, a trilha de dados na qual o bloco requisitado reside, e o restante da trilha deste ponto em diante. Deste ponto em diante, caso seja detectado um padrão de acesso definido como seqüencial, mais trilhas serão carregadas, variando em número pela implementação.
À parte do algoritmo básico a partir do qual todos trabalham, os caches distinguem-se também por suas implementações físicas.
Cache global : quaisquer das áreas de memória podem ser diretamente acessadas para leitura ou gravação por qualquer placa adaptadora (de disco ou canal), através de um ASIC (Application Specific Integrated Circuit)
Clustered : há divisões físicas na memória, as quais são gerenciadas e acessadas separadamente, necessitando da intermediação de um processador de controle.
Tamanho fixo : algumas implementações pré-reservam áreas de seu cache, de tamanho fixo (trilhas, por exemplo) e gravam os blocos de atualização dentro das áreas correspondentes. Geralmente dinâmicas, estas áreas não ocupam posições fixas na memória, sendo alocadas (em seus tamanhos fixos), na medida em que dados destinados a ela tenham de ser carregados
Blocos : nesta implementação os blocos gravados / lidos são armazenados como entidades independentes na memória, sem uma pré-definição (áreas fixas) reservadas para entidades maiores (trilhas p.ex.).
NVS (Non-Volatile Storage) : os dados recebidos do host são copiados para uma área não-volátil (mantida por baterias internas), geralmente menor e somente para gravação, que garantem que em caso de perda de força uma cópia integra seja mantida por um tempo determinado (duração destas mesmas baterias)
NVSS (Non-Volatile Subsystem) : esta não é exatamente uma implementação somente de cache, mas o afeta diretamente. Nele, todo o subsistema é mantido por baterias em caso de falha no fornecimento de energia. O tempo é geralmente menor que o do NVS, mas suficiente para que todos os dados novos presentes no cache sejam gravados em disco físico, e os mesmos desligados de uma forma ordenada. Desta forma, os dados estão garantidos independentemente da duração da falta de energia.
Além de diferenças na implementação física, os próprios algoritmos de manuseio de dados variam bastante. Algumas controladoras disparam a pré-leitura de dados mais cedo, e carregam valores fixos de dados a cada execução. Outras ajustam dinamicamente estes valores, tentando se adaptar a variações na carga.
Cada fornecedor tem a tendência a supervalorizar as qualidades e vantagens de sua implementação, em detrimento das de seus concorrentes, como dizer que armazenar trilhas inteiras favorece a taxa de cache-hits, ou que o armazenamento de blocos utiliza melhor o cache. Entretanto, o fato é que, dentro de certos parâmetros mais favoráveis, todas as implementações funcionam e desempenham bem suas funções. Como também é verdade que é possível a ocorrência de cenários suficientemente desfavoráveis para que qualquer uma delas apresente problemas. É meramente uma questão de adaptação ao ambiente atendido pelo equipamento.
Um fator importante à ser considerado quando da utilização de CACHE para acelerar as operações de E/S através do mecanismo de "cache-hit" é a dispersão de discos por porta física de entrada. Por exemplo, uma porta FC ou FICON atuais podem atingir de 6 a 8 mil operações de E/S por segundo (iops), dado que as informações estejam no cache (CACHE-HIT). Entretanto, se TODAS AS OPERAÇÕES forem direcionadas à um mesmo disco físico (capaz de 150 iops médio a 15Krpm, ou 230 máximo - seqüencial a 15Krpm), fatalmente a taxa de operações será limitada pela capacidade do disco.
Para se calcular a quantidade de discos físicos por porta de conexão (ou portas para uma dada capacidade em discos), precisa-se saber:
Os dados de desempenho do disco físico (taxas máxima e média em iops) | |
Os dados de desempenho da porta de conexão (taxa máxima para 100% CACHE-HIT) | |
A composição da carga à qual o subsistema será submetido (%RW, %SEQ, %RAND) | |
A opção de proteção escolhida (RAID-1, RAID-5, etc) |
De posse destes dados, pode-se estimar uma quantidade de discos necessária para sustentar uma porta de conexão, conforme mostram os cálculos na tabela abaixo:
Figura 18 - Cálculo de discos físicos por porta de conexão
Nesse caso, a Linha19 representa a quantidade de discos físicos necessária para manter uma porta de conexão (típica de 2Gbs), a 70% de utilização.