- Aprender
- Computação e TI
- Ciência da computação
- Sistemas operacionais
- Dispositivos de entrada e saída e RAID
Dispositivos de entrada e saída, discos e RAID
IntermediárioAula 7 de 9 do curso Curso de Sistemas operacionais
O que você vai aprender
- Descreva o que um dispositivo apresenta ao sistema operacional e como o núcleo usa consulta periódica, interrupções, acesso direto à memória (DMA) e drivers de dispositivo para transferir dados entre a memória e os dispositivos.
- Descreva a interface de dispositivo e o protocolo básico de entrada e saídaPosicione os dispositivos nos barramentos do computador, nomeie os registradores que um dispositivo disponibiliza e acompanhe o protocolo simples que o sistema operacional usa para enviar um comando ao dispositivo.
- Escolha entre consulta periódica e interrupçõesExplique como as interrupções permitem que a CPU realize trabalho útil enquanto um dispositivo está ocupado, quando a consulta periódica é a melhor escolha e como a consulta híbrida e o agrupamento de interrupções reduzem a sobrecarga.
- Transfira dados com acesso direto à memória (DMA)Explique por que copiar dados com a CPU desperdiça tempo em grandes transferências e como um mecanismo de DMA transfere dados entre a memória e um dispositivo enquanto a CPU realiza outro trabalho.
- Explique os drivers de dispositivo e as camadas da pilha de armazenamentoMostre como os drivers ocultam detalhes dos dispositivos por trás de interfaces gerais, acompanhe uma requisição de leitura desde uma chamada de sistema até o dispositivo e de volta, e compare como SATA e NVMe enfileiram requisições.
- Descreva a interface de dispositivo e o protocolo básico de entrada e saída
- Descreva como um disco rígido armazena e acessa dados, calcule o tempo e a taxa de transferência de uma operação de entrada e saída e compare as políticas de escalonamento que reduzem o tempo de busca e de rotação.
- Descreva a estrutura e o endereçamento de um disco rígidoRelacione a interface de endereços de setor da unidade com seus pratos, trilhas, cabeças e cache, e explique o que a unidade garante ou não.
- Calcule o tempo e a taxa de transferência de uma operação de entrada e saída de discoDivida uma operação de entrada e saída em busca, rotação e transferência, calcule cada parte a partir das especificações de uma unidade e explique por que cargas de trabalho aleatórias e sequenciais têm desempenhos tão diferentes.
- Compare políticas de escalonamento de discoOrdene requisições de disco pendentes com FCFS, SSTF, SCAN, C-SCAN, LOOK e SPTF, calcule o movimento da cabeça em cada caso e explique onde ocorre o escalonamento em um sistema moderno.
- Descreva a estrutura e o endereçamento de um disco rígido
- Descreva células, páginas e blocos de apagamento de memória flash, explique como a camada de tradução flash oculta suas limitações e compare SSDs com discos rígidos quanto a desempenho, vida útil e custo.
- Descreva a memória flash: células, páginas, blocos e desgasteExplique como a memória flash NAND armazena bits, como é organizada em páginas e blocos de apagamento, quais operações oferece e por que se desgasta.
- Explique a camada de tradução flashDescreva como o firmware de um SSD mapeia blocos lógicos para páginas de memória flash, escreve como em um registro, coleta lixo e distribui o desgaste, e calcule a amplificação de escrita e o tamanho da tabela de mapeamento.
- Compare SSDs e discos rígidosCompare latência, vazão, vida útil, comportamento em caso de falha e custo de SSDs e discos rígidos e explique o que muda para o sistema operacional.
- Descreva a memória flash: células, páginas, blocos e desgaste
- Explique como um arranjo redundante de discos mapeia blocos com distribuição em faixas, espelhamento e paridade, calcule capacidade e vazão para cada nível de RAID e escolha um nível adequado à carga de trabalho e aos seus riscos de falha.
- Explique o que um arranjo RAID oferece e como avaliá-loDescreva um arranjo RAID como um disco lógico construído a partir de vários discos, o modelo de falhas e as medidas usadas para comparar níveis de RAID, e os problemas que todo projeto com múltiplos discos deve tratar.
- Mapeie blocos com distribuição em faixas e espelhamentoCalcule onde um bloco lógico fica em RAID-0 e RAID-10, explique o efeito do tamanho do fragmento de faixa e determine a capacidade, a confiabilidade e o desempenho da distribuição em faixas e do espelhamento.
- Proteja dados com paridade em RAID-4, RAID-5 e RAID-6Calcule a paridade XOR, reconstrua um bloco perdido a partir dela, atualize a paridade em uma pequena escrita e explique o problema das pequenas escritas e como RAID-5 e RAID-6 lidam com ele.
- Escolha um nível de RAID e planeje o tratamento de falhas e as reconstruçõesRelacione níveis de RAID a cargas de trabalho, estime o tempo de reconstrução e o risco de setores ilegíveis durante a reconstrução e justifique uma escolha entre espelhamento e paridade.
- Explique o que um arranjo RAID oferece e como avaliá-lo
- Reconheça como dispositivos de armazenamento falham parcialmente e de forma silenciosa, calcule e compare somas de verificação e projete um sistema de armazenamento que detecte corrupção, escritas em destino incorreto e escritas perdidas e as repare a partir de cópias redundantes.
- Reconheça falhas de armazenamento além da falha completa de um discoDescreva erros latentes de setor, corrupção silenciosa, escritas em destino incorreto e escritas perdidas, sua frequência e por que a redundância sozinha não os detecta.
- Calcule e compare somas de verificaçãoCalcule somas de verificação XOR, por adição e de Fletcher, descreva o CRC e compare funções de soma de verificação pelos erros que detectam e por seus custos.
- Incorpore verificações de integridade a um sistema de armazenamentoDecida onde as somas de verificação são armazenadas, acompanhe o caminho de leitura que detecta e repara corrupção, detecte escritas em destino incorreto e escritas perdidas e planeje a varredura de integridade e seus custos.
- Reconheça falhas de armazenamento além da falha completa de um disco
Guia de estudo de Dispositivos de entrada e saída e RAID
1Acompanhe uma requisição de entrada e saída do software ao hardware
Um programa pode solicitar um bloco de dados sem saber qual controlador vai buscá-lo. O núcleo transforma essa requisição em acessos a registradores, transferências de dados e tratamento de conclusão. Acompanhe essas tarefas separadamente: como um comando chega ao dispositivo, como a CPU espera por ele e quem transfere os bytes. Depois, reúna as tarefas em uma pilha de armazenamento que permite que muitos programas e núcleos de CPU compartilhem dispositivos.
1.1 Envie um comando a um dispositivo
Um dispositivo de entrada e saída transfere dados para dentro ou para fora de um computador ou os mantém de forma persistente. Um teclado fornece entrada; uma placa de rede envia e recebe pacotes; um disco mantém dados depois que a energia é desligada. Os dispositivos se conectam por barramentos ou interconexões. PCI Express (PCIe) conecta dispositivos de alto desempenho, como SSDs NVMe. SATA e USB atendem outros dispositivos de armazenamento e periféricos mais distantes na hierarquia. Interconexões rápidas custam mais para construir e têm limites físicos mais restritos, então um computador combina vários tipos.
A interface é a visão do software
Um controlador pode conter processadores, memória e firmware, o software executado dentro do dispositivo. O sistema operacional o controla por meio de uma interface de hardware disponibilizada pelo dispositivo. Dois controladores podem ter estruturas internas muito diferentes e, ainda assim, aceitar os mesmos comandos.
Um dispositivo simples tem três registradores:
| Registrador | O que o núcleo obtém ou fornece |
|---|---|
| Estado | Se o dispositivo está pronto, ocupado, terminou ou informa um erro |
| Comando | Qual operação iniciar |
| Dados | Os bytes enviados ou recebidos |
Para uma operação simples de saída, o núcleo primeiro verifica o estado até o dispositivo estar pronto. Depois, escreve os dados, escreve o comando e verifica o estado até a conclusão. Por fim, verifica se houve erro. Escrever o comando antes de fornecer seus dados poderia iniciar uma operação com o conteúdo errado. Verificar o estado repetidamente é consulta periódica; fazer a CPU transferir a área útil é entrada e saída programada (PIO).
Acesse registradores com segurança
A entrada e saída mapeada em portas fornece aos registradores um espaço de endereçamento separado. Em x86, instruções como in e out acessam essas portas. O núcleo controla qual código pode executá-las. A entrada e saída mapeada em memória (MMIO) coloca registradores no espaço de endereçamento físico, permitindo que instruções de leitura e escrita os acessem por mapeamentos controlados pelas tabelas de páginas do núcleo. Dispositivos PCIe normalmente usam MMIO.
Um endereço de MMIO representa uma operação de dispositivo, embora seu acesso se pareça com um acesso à memória. Uma leitura pode limpar um indicador. Uma escrita pode iniciar uma transferência. O estado pode mudar porque o dispositivo termina o trabalho, sem que a CPU escreva nesse endereço. O comportamento comum do cache poderia ocultar essas mudanças ou combinar acessos que o dispositivo precisa receber separadamente.
Por isso, drivers do Linux usam funções de acesso como readl() e writel(), atributos de mapeamento adequados e as barreiras de memória necessárias. Um ponteiro volatile pode impedir que o compilador remova ou combine acessos, mas não garante toda a ordenação necessária em relação à memória comum ou à reordenação da CPU. Por exemplo, um descritor de comando na RAM precisa estar visível ao dispositivo antes que um registrador de notificação o instrua a buscar esse descritor.
Mantenha o controle dos dispositivos no núcleo
Uma aplicação normalmente chama read() ou write(). O núcleo verifica as permissões e executa o protocolo de dispositivo em nome dela. Isso impede que um programa emita comandos que interfiram na requisição de outro programa. Um buffer de usuário é a área de dados da aplicação; um registrador de comando é o ponto de controle do controlador. Eles têm funções diferentes, mesmo quando ambos têm endereços.
Principais conclusões
- A interface de dispositivo oculta a estrutura interna e o firmware do controlador.
- Forneça os dados antes de iniciar o protocolo de comando simples; depois, verifique a conclusão e os erros.
- A consulta periódica verifica a prontidão; a PIO transfere dados com a CPU.
- Acessos a registradores por MMIO podem ter efeitos colaterais e exigem funções de acesso da plataforma e ordenação.
- Chamadas de sistema permitem que o núcleo intermedeie o acesso compartilhado a dispositivos.
1.2 Decida como a CPU espera
Um dispositivo pode levar muito mais tempo para concluir uma requisição do que a CPU leva para emiti-la. A estratégia de espera decide se a CPU passa esse intervalo verificando o dispositivo ou realizando outro trabalho. Ela não altera a rapidez com que o próprio dispositivo conclui a requisição.
Consulte ou suspenda
Com consulta periódica, a CPU lê o estado repetidamente. Uma conclusão pode ser percebida rapidamente, mas verificações feitas enquanto o dispositivo ainda está ocupado consomem tempo de CPU. Com interrupções, um processo que aguarda uma leitura fica bloqueado e outro processo pronto pode executar. Quando o dispositivo termina, ele sinaliza à CPU. O tratador de interrupções do núcleo, também chamado de rotina de serviço de interrupção, verifica a conclusão, trata o resultado e coloca o processo em espera no estado de pronto. O escalonador decide quando esse processo executará novamente.
Suponha que o processo A inicie uma leitura de disco que leva 10 ms. A consulta periódica ocupa a CPU durante essa espera. Com entrada e saída por interrupções, o processo B pode executar cálculos durante os mesmos 10 ms. A operação de dispositivo de A ainda dura 10 ms; o processamento útil se sobrepõe à espera.
Interrupções também exigem trabalho: a CPU salva o estado, executa o tratador, restaura o estado e pode trocar de processo e preencher novamente os caches. O custo costuma ser de alguns microssegundos. Se um dispositivo responde em 2 µs, um breve laço de consulta periódica pode ser mais barato que bloquear e despertar o processo. Interrupções são adequadas a operações lentas; uma consulta periódica curta é adequada às muito rápidas.
Adapte-se à velocidade de conclusão e à carga
Uma estratégia híbrida, ou de duas fases, faz consultas periódicas brevemente e depois aguarda uma interrupção com o processo suspenso se a requisição ainda não terminou. Conclusões rápidas evitam o custo de despertar, enquanto conclusões lentas não ocupam a CPU durante todo o período. O Linux oferece verificação periódica da conclusão para requisições adequadas de armazenamento rápido.
Um grande volume de interrupções cria outro problema. Se quase todo ciclo da CPU trata eventos recém-chegados, o código que consome seus dados recebe pouco tempo para executar. Isso é bloqueio ativo: a máquina está ocupada, mas o progresso útil despenca. O mecanismo de rede NAPI do Linux limita o trabalho com interrupções e muda para consulta periódica em lotes sob carga.
O agrupamento de interrupções reúne várias conclusões em uma notificação. Com 100.000 conclusões por segundo e 5 µs de trabalho de CPU por interrupção, notificações separadas custam:
Isso equivale à metade do tempo de um núcleo de CPU a cada segundo. Combinar oito conclusões por interrupção resulta em 12.500 interrupções e 62,5 ms de trabalho de CPU por segundo, ou 6,25% de um núcleo. Uma requisição pode esperar brevemente por seu lote, então a menor sobrecarga vem acompanhada de latência adicional de notificação.
Envie notificações ao núcleo certo
Dispositivos PCIe normalmente usam MSI ou MSI-X, interrupções entregues como mensagens a um endereço especial. Múltiplos vetores de interrupção permitem que um dispositivo direcione as conclusões de filas diferentes a núcleos diferentes. Um controlador NVMe pode associar filas por núcleo a vetores de interrupção adequados, mantendo próximos os trabalhos de submissão e conclusão. Mais vetores organizam o trabalho da CPU; eles não encurtam uma leitura de memória flash nem uma rotação de disco.
Principais conclusões
- Interrupções permitem que o processamento se sobreponha ao tempo do dispositivo; um processo cuja operação terminou fica pronto antes de executar.
- Compare o tempo de consulta periódica com a sobrecarga de interrupção e despertar para dispositivos rápidos.
- A espera híbrida consulta periodicamente por pouco tempo e depois bloqueia o processo, se necessário.
- O bloqueio ativo consome tempo de CPU sem progresso útil.
- O agrupamento reduz a sobrecarga de notificações ao aceitar alguma latência adicional.
- MSI-X oferece vetores de interrupção separados para filas de dispositivo.
1.3 Delegue a transferência de dados ao DMA
Esperar e copiar são tarefas separadas. Interrupções podem impedir que a CPU fique em espera ocupada enquanto um dispositivo trabalha, mas a CPU ainda estaria ocupada se precisasse transferir cada palavra por um registrador de dados. O acesso direto à memória (DMA) atribui essa transferência a um mecanismo de hardware, geralmente dentro do controlador de dispositivo.
Meça o trabalho que a PIO deixa para a CPU
Imagine um registrador de dados de 4 bytes que leva 100 ns por acesso. Transferir um bloco de 4 KiB exige:
Essas operações de registrador ocupam a CPU. Buffers maiores exigem proporcionalmente mais acessos. O DMA elimina essa cópia palavra por palavra pelo registrador; a CPU ainda prepara a requisição e trata sua conclusão.
Acompanhe uma leitura com DMA
- O driver prepara um buffer de destino e o disponibiliza para acesso pelo dispositivo.
- Ele fornece o endereço ou os endereços de DMA, a quantidade de bytes, a direção e o comando de leitura.
- O dispositivo lê os blocos de armazenamento solicitados e escreve os bytes na memória.
- A CPU executa outro trabalho enquanto o dispositivo transfere os dados.
- A conclusão é informada, geralmente por uma interrupção. O tratador verifica o estado e desperta o processo em espera.
O mecanismo de DMA atua como mestre do barramento, iniciando transferências de memória. Os custos de configuração dependem do mapeamento, da plataforma e do número de regiões de memória. O DMA também consome largura de banda de memória compartilhada com a CPU. Ele libera instruções da CPU, não todos os recursos.
Descreva memória distribuída
Um buffer pode ser contíguo no espaço de endereçamento virtual de um processo e ocupar páginas físicas separadas. Uma lista de dispersão e reunião descreve essas regiões como pares de endereço e comprimento. Um dispositivo pode transferir uma requisição por várias regiões sem que a CPU primeiro precise copiá-las para um único buffer fisicamente contíguo.
Por exemplo, um buffer de três páginas pode ser respaldado por três páginas não adjacentes. O driver cria descritores para as regiões visíveis ao dispositivo e mantém as páginas correspondentes estáveis até a conclusão. A fixação impede que essas páginas sejam removidas ou reutilizadas enquanto o hardware ainda possa acessá-las. Desfixá-las cedo demais cria o risco de uma escrita posterior por DMA sobrescrever dados de outra pessoa.
Use o espaço de endereçamento do dispositivo
Um dispositivo normalmente não usa um ponteiro virtual da aplicação. A API de DMA do núcleo fornece endereços de barramento, que podem diferir dos endereços físicos da CPU. Uma IOMMU traduz endereços de dispositivo para a memória física e restringe a memória que um dispositivo pode acessar. Esse isolamento também ajuda um hipervisor a atribuir um dispositivo a uma máquina virtual.
Caches de CPU acrescentam outra etapa de coordenação. Antes de uma transferência de DMA de saída, o dispositivo precisa ver os bytes mais recentes da CPU; após uma transferência de entrada, a CPU precisa ver as atualizações do dispositivo. Alguns hardwares mantêm a coerência automaticamente. Outras plataformas exigem sincronização de cache por meio da API de DMA. Mapeamento de endereços, tempo de vida das páginas e visibilidade do cache resolvem, cada um, uma parte diferente da segurança da transferência.
Principais conclusões
- O DMA assume a cópia da área útil; as interrupções eliminam a espera.
- A CPU ainda configura o DMA e trata a conclusão.
- Listas de dispersão e reunião descrevem transferências por regiões de memória separadas.
- Páginas fixadas na memória devem permanecer estáveis até o DMA terminar.
- A API de DMA fornece endereços visíveis ao dispositivo; uma IOMMU os traduz e restringe.
- A coerência de cache ou a sincronização explícita torna visíveis as atualizações da CPU e do dispositivo.
1.4 Acompanhe uma leitura pela pilha de armazenamento
Um driver de dispositivo traduz uma requisição geral em comandos do controlador, acessos a registradores e tratamento da conclusão. Isso permite que um sistema de arquivos solicite um bloco sem saber se o hardware usa SATA, NVMe ou USB. O driver conhece o protocolo específico e as particularidades do controlador.
Atribua uma tarefa a cada camada
Uma leitura de armazenamento no Linux geralmente passa por esta sequência:
Aplicação → chamada de sistema → sistema de arquivos → camada de blocos genérica → driver → controlador → dispositivo de armazenamento.
O sistema de arquivos mapeia uma posição no arquivo para blocos de armazenamento. A camada de blocos enfileira requisições, combina as adjacentes e pode escalonar sua ordem. O driver envia as operações resultantes. O acesso ao dispositivo de blocos bruto pode contornar o sistema de arquivos e ainda usar as camadas inferiores.
A interface padrão torna um novo hardware utilizável sem reescrever cada aplicação. Ela também oculta alguns recursos especiais. Interfaces como ioctl() ou de passagem direta de comandos permitem que o software solicite controles que não se encaixam em uma leitura ou escrita comum de blocos.
Separe as classes de dispositivos
| Classe | Interface típica e exemplos |
|---|---|
| Dispositivo de blocos | Blocos endereçados; discos rígidos e SSDs |
| Dispositivo de caracteres | Um fluxo de bytes; terminais e portas seriais |
| Interface de rede | Comunicação por pacotes por meio de sockets |
O Linux disponibiliza dispositivos de blocos e de caracteres como arquivos especiais, como /dev/sda e /dev/nvme0n1. Drivers geralmente executam em modo núcleo, então um erro em um driver pode travar o núcleo ou corromper a memória. O isolamento de drivers limita esse alcance em sistemas que o oferecem. A coleção de drivers do Linux representa uma grande parcela de sua árvore de código-fonte; estudos também descobriram que o código de drivers é particularmente propenso a erros.
Enfileire trabalho entre núcleos
A camada de blocos blk-mq do Linux usa filas de software por CPU e filas de despacho de hardware. Um escalonador de entrada e saída como mq-deadline, bfq ou kyber pode reordenar o trabalho ou administrar a justiça; none evita uma política adicional de escalonamento. Discos rígidos se beneficiam da redução de buscas. Dispositivos NVMe rápidos frequentemente usam none, pois não têm uma cabeça para reposicionar. O escalonador selecionado aparece entre colchetes em /sys/block/<device>/queue/scheduler.
SATA com AHCI/NCQ oferece uma fila de até 32 comandos pendentes por dispositivo. NVMe oferece muitas filas de submissão e conclusão na memória: até 65.535 filas de entrada e saída, com até cerca de 64.000 comandos por fila. Controladores reais oferecem limites menores. Pares de filas por núcleo reduzem a contenção nos caminhos compartilhados de submissão.
Acompanhe uma leitura NVMe
Um processo chama read(fd, buf, 4096). Se os dados não estiverem no cache, o sistema de arquivos encontra o bloco de disco e a camada de blocos cria uma requisição. O driver NVMe escreve um descritor em uma fila de submissão e depois escreve no registrador de notificação da fila por MMIO. O controlador busca o comando, transfere os dados para a memória por DMA e publica uma entrada de conclusão. Uma interrupção MSI-X leva o núcleo a concluir a requisição. Em uma leitura com buffer, os dados chegam ao buffer da aplicação pelo cache de páginas, e read() retorna 4096. Um acerto de cache pode satisfazer a leitura antes que seja necessária uma operação de entrada e saída no dispositivo.
Principais conclusões
- Drivers adaptam uma interface padrão do núcleo a protocolos específicos de dispositivos.
- A camada de blocos enfileira, combina e escalona requisições de blocos endereçados.
- AHCI/NCQ tem uma fila de pouca profundidade por dispositivo; NVMe oferece muitas filas na memória.
- Um registrador de notificação anuncia o trabalho enfileirado; o DMA transfere os dados úteis; o tratamento da conclusão finaliza a requisição.
2Calcule os custos de disco e escolha uma ordem de requisições
Um disco rígido apresenta setores numerados, mas atender uma requisição pode exigir um movimento do braço e uma espera pela rotação antes de transferir qualquer byte. Relacione essas etapas físicas à latência, aos IOPS e à taxa de transferência. Depois, compare ordens de requisição considerando o deslocamento e a espera: um percurso curto pode melhorar a vazão enquanto uma requisição distante continua esperando. Os caches e o firmware do dispositivo também influenciam o que o sistema operacional observa.
2.1 Relacione endereços de setor ao hardware do disco
Um disco rígido apresenta um vetor de setores numerados a partir de zero. Esses números são endereços de bloco lógico (LBAs). Tradicionalmente, um setor tinha 512 bytes; muitas unidades agora usam setores físicos de 4.096 bytes. Uma unidade 512e aceita setores lógicos de 512 bytes sobre esse formato físico maior. Um bloco de 4 KiB de um sistema de arquivos pode, portanto, abranger vários setores lógicos.
Visualize as partes móveis
Pratos magnéticos giram em um eixo. Cada superfície tem trilhas concêntricas divididas em setores e uma cabeça de leitura e escrita em um braço móvel. As cabeças se movem juntas. As trilhas na mesma posição do braço em todas as superfícies formam um cilindro. Velocidades comuns do eixo incluem 5.400 e 7.200 RPM, com 10.000 e 15.000 RPM em famílias de discos mais rápidas.
LBAs próximos geralmente são posicionados próximos, ajudando leituras sequenciais a evitar buscas repetidas. Um setor remapeado para um setor reserva pode quebrar essa relação. O software, portanto, vê um espaço de endereçamento linear útil sem conhecer a posição física exata.
Trilhas externas têm mais espaço para setores. A gravação por zonas coloca mais setores nessas trilhas, de modo que mais bytes passam sob a cabeça por rotação. A vazão sequencial pode cair à medida que uma leitura avança em direção ao centro. A defasagem entre trilhas desloca as posições dos setores entre trilhas vizinhas: depois que a cabeça muda de trilha, o próximo setor sequencial chega no momento certo, em vez de já ter passado.
Separe conclusão de durabilidade
Um cache da unidade pode manter dados lidos recentemente e aceitar escritas. Esses buffers variam de alguns megabytes a centenas de megabytes; o cache de leitura pode manter o restante de uma trilha que já está passando sob a cabeça. Com cache de escrita de retorno, uma escrita pode terminar enquanto seus dados permanecem no cache volátil. A escrita direta espera pelo meio. Uma descarga do cache solicita que escritas armazenadas em cache cheguem ao armazenamento durável; o acesso forçado à unidade (FUA) solicita uma conclusão durável para a escrita afetada.
A atomicidade em caso de queda de energia é outra propriedade. Uma unidade de escrita atômica muda por completo ou permanece inalterada quando falta energia. O tamanho do setor por si só não fornece essa garantia: o dispositivo precisa documentá-la. Uma escrita que atravessa várias unidades atômicas pode resultar em uma escrita fragmentada, com algumas unidades novas e outras antigas. Descargas tratam da durabilidade; unidades atômicas tratam de atualizações parciais.
Leia corretamente as indicações de capacidade
As capacidades das unidades usam prefixos SI decimais. Unidades binárias usam potências de dois:
Uma unidade de 4 TB contém, portanto:
As duas indicações descrevem a mesma quantidade de bytes. Uma ferramenta que exibe cerca de 3,64 com a indicação “TB” usou aritmética binária com uma indicação de aparência decimal; a conversão não removeu espaço.
Reconheça uma restrição adicional de escrita
A gravação magnética sobreposta (SMR) sobrepõe trilhas adjacentes para armazenar mais dados. Reescrever uma trilha pode interferir na vizinha, tornando pequenas atualizações aleatórias custosas. Grandes escritas sequenciais em zonas adequadas funcionam melhor. Trata-se de um disco magnético com uma restrição de gerenciamento de escrita, embora leituras comuns ainda envolvam as mesmas cabeças e os mesmos pratos giratórios.
Principais conclusões
- LBAs identificam setores lógicos; os tamanhos de setores lógicos e físicos podem ser diferentes.
- As cabeças buscam trilhas enquanto os pratos giram sob elas.
- A gravação por zonas e a defasagem entre trilhas contribuem para o acesso sequencial eficiente.
- A conclusão da escrita de retorno pode anteceder a durabilidade; a descarga e o FUA solicitam persistência.
- A atomicidade em caso de queda de energia decorre da garantia documentada do dispositivo.
- TB decimal e TiB binário são unidades diferentes para os mesmos bytes.
- A SMR melhora a densidade, mas torna pequenas reescritas aleatórias mais custosas.
2.2 Calcule latência, IOPS e taxa de transferência
Uma requisição de disco gasta tempo para chegar aos dados antes de transferi-los. Para uma requisição simples sem espera em fila ou acerto de cache, divida o tempo de atendimento em três partes:
A busca move e estabiliza o braço na trilha. A latência rotacional é a espera até o setor chegar à cabeça. O tempo de transferência corresponde à passagem dos bytes sob ela. A espera em fila, quando existe, acrescenta tempo antes do início do atendimento.
Converta RPM em tempo de espera
Uma rotação leva 60.000 ms divididos pela RPM. A 7.200 RPM:
Para uma posição aleatória do setor, a espera média é meia rotação, cerca de 4,17 ms. A 15.000 RPM, uma rotação leva 4 ms e a espera média é 2 ms. Uma RPM maior reduz a latência rotacional; ela não reduz diretamente o tempo de busca do braço.
As fichas técnicas informam um tempo médio de busca. Requisições distribuídas uniformemente têm uma distância média de busca de cerca de um terço do percurso completo, mas o tempo de busca não é proporcional à distância. A aceleração e a estabilização dominam buscas curtas; buscas longas incluem mais percurso em velocidade máxima.
Calcule uma pequena leitura aleatória
Use uma unidade de 7.200 RPM com busca média de 8 ms e taxa de transferência de 200 MB/s. Uma requisição de 4 KiB contém 4.096 bytes. Primeiro, calcule a transferência em segundos:
Depois, some posicionamento e transferência:
Uma requisição pendente por vez resulta em cerca de:
A taxa efetiva é de cerca de 4.096 bytes multiplicados por 82 por segundo, ou 0,34 MB/s. Uma especificação de transferência de 200 MB/s descreve a movimentação de dados já posicionados; ela não elimina os cerca de 12 ms gastos no posicionamento para cada pequena requisição aleatória.
Calcule uma leitura sequencial longa
Agora leia 100 MB com uma busca inicial e uma espera rotacional. O tempo de transferência é 100/200 s, ou 500 ms. O tempo total é de cerca de 512,17 ms, resultando em:
A taxa efetiva é aproximadamente 580 vezes a taxa de pequenas leituras aleatórias. Um custo de posicionamento é distribuído por muito mais bytes. Grandes transferências sequenciais são dominadas pelo tempo de transferência; pequenas requisições aleatórias são dominadas pelo posicionamento.
Use bytes de forma consistente ao combinar KiB com MB/s e converta milissegundos em segundos antes de dividir bytes pelo tempo. IOPS é adequado para pequenas operações aleatórias; MB/s é adequado para fluxos sequenciais. A leitura antecipada, o posicionamento próximo e a combinação de pequenas escritas em lotes sequenciais melhoram o desempenho ao alterar a frequência com que o custo de posicionamento é pago.
Principais conclusões
- Some tempo de busca, latência rotacional e tempo de transferência para modelar o tempo de atendimento do disco.
- A latência rotacional média para uma posição aleatória é metade de 60.000/RPM milissegundos.
- Use bytes e unidades de tempo consistentes ao calcular uma taxa efetiva de transferência.
- Pequenas requisições aleatórias pagam repetidamente o custo de posicionamento; grandes requisições sequenciais o distribuem.
- IOPS conta operações por segundo; vazão conta bytes por segundo.
2.3 Compare percursos de escalonamento e tempos de espera
Um escalonador de disco escolhe qual requisição pendente atender em seguida. A posição fornece informações úteis sobre o custo de atendimento. Reduzir o percurso do braço ajuda, mas uma política também deve considerar quanto tempo cada requisição espera.
Compare as políticas
| Política | Próxima requisição ou percurso | Principal compromisso |
|---|---|---|
| FCFS | Ordem de chegada | Ordem justa, percurso potencialmente longo |
| SSTF | Trilha mais próxima | Baixo custo de busca, possível inanição |
| SCAN | Atende em uma varredura até a extremidade e depois inverte | Espera limitada por varreduras |
| C-SCAN | Atende em uma direção e retorna sem atender | Esperas mais uniformes entre posições |
| LOOK | Inverte na última requisição pendente | Evita percurso desnecessário até a extremidade |
| C-LOOK | Atende em uma direção e retorna entre as requisições pendentes extremas | Atendimento circular sem percurso desnecessário até a extremidade |
O SSTF pode escolher repetidamente novas requisições próximas enquanto uma distante espera. Um sistema operacional sem a geometria exata costuma aproximá-lo usando a distância entre LBAs, no método chamado bloco mais próximo primeiro. A justiça do tipo SCAN pressupõe que o sistema consiga continuar atendendo trabalho durante a varredura; um dispositivo sobrecarregado ainda não consegue oferecer um tempo de resposta fixo para cada chegada.
Some o percurso trecho por trecho
Considere as trilhas 0–199, uma cabeça em 50 movendo-se para trilhas de número maior e as chegadas 82, 170, 43, 140, 24, 16, 190. Pare de contar quando todas as requisições terminarem.
FCFS segue a lista. Seu percurso é 32 + 88 + 127 + 97 + 116 + 8 + 174 = 642 trilhas. SSTF visita 43, 24, 16, 82, 140, 170, 190, totalizando 208 trilhas.
SCAN visita as requisições de número maior, continua até 199 e depois inverte até 16. Sua distância é 149 + 183 = 332. LOOK retorna em 190, resultando em 140 + 174 = 314. C-LOOK vai de 50 a 190, retorna a 16 e termina em 43: 140 + 174 + 27 = 341 trilhas. O retorno é um movimento real, embora nenhuma requisição seja atendida durante ele. C-SCAN iria até 199, retornaria a 0 sem atender e depois atenderia em direção às trilhas de número maior até 43.
O melhor total nessa fila finita não determina a melhor política para um fluxo de chegadas futuras. O pequeno percurso do SSTF aqui vem acompanhado de risco de inanição sob carga contínua.
Inclua rotação e firmware
Menor tempo de posicionamento primeiro (SPTF) minimiza a soma de busca e latência rotacional. Uma trilha mais distante pode ser escolhida se seu setor chegar antes. Escolhas precisas exigem a geometria e a posição rotacional, então o firmware da unidade está em melhor posição para fazê-las que o sistema operacional.
O sistema operacional pode combinar requisições de blocos adjacentes e depois enviar vários comandos por NCQ. O firmware reordena esse lote usando informações internas. O escalonamento antecipatório pode deixar o disco ocioso brevemente para esperar uma provável requisição seguinte próxima. O escalonamento por prazo limita o adiamento; o mq-deadline do Linux acompanha os prazos e favorece leituras. O escalonamento de SSDs se concentra em justiça e latência, pois não há busca ou rotação a reduzir.
Principais conclusões
- FCFS preserva a ordem de chegada; SSTF troca um percurso menor pelo risco de inanição.
- SCAN e LOOK fazem varreduras nos dois sentidos; variantes circulares atendem em uma direção.
- Conte todo movimento, inclusive um retorno circular sem atendimento.
- SPTF considera a posição rotacional além da busca.
- O sistema operacional combina e enfileira; o firmware da unidade pode reordenar usando a geometria oculta.
- Prazos e antecipação buscam objetivos além do percurso mínimo.
3Explique atualizações em memória flash e o desempenho de SSDs
A memória flash pode ler rapidamente uma página pequena, mas reutilizá-la exige apagar um bloco muito maior. Um controlador de SSD oculta essa diferença por trás de endereços lógicos. Acompanhe como ele posiciona novas versões, recupera espaço antigo e distribui o desgaste; depois, use esses mecanismos para interpretar amplificação de escrita, profundidade da fila e especificações de vida útil. A ausência de partes móveis altera os custos de armazenamento sem tornar todos os acessos igualmente baratos.
3.1 Entenda páginas, blocos de apagamento e desgaste
A memória flash NAND armazena informações como carga elétrica em células. O controlador distingue níveis de carga para ler os bits. Uma célula que armazena mais bits precisa de mais níveis distinguíveis, o que aumenta a capacidade, mas dificulta a programação e o controle de erros.
Conte os níveis de carga
| Tipo de célula | Bits por célula | Níveis de carga |
|---|---|---|
| SLC | 1 | 2 |
| MLC | 2 | 4 |
| TLC | 3 | 8 |
| QLC | 4 | 16 |
Para uma célula com b bits, o número de níveis é . Mais bits por célula geralmente reduzem o custo por gigabyte, enquanto a programação fica mais lenta e a resistência a ciclos de apagamento diminui. Essas são propriedades da organização das células; o controlador e o paralelismo do SSD como um todo também afetam o desempenho.
Relacione cada operação à sua unidade
Chips de memória flash contêm blocos de apagamento, cada um com muitas páginas. Uma página normalmente tem 4–16 KiB, enquanto um bloco de apagamento pode conter centenas de páginas e ocupar de centenas de KiB a vários MiB. Uma página de memória flash, uma página de memória virtual e um bloco de sistema de arquivos são unidades distintas, mesmo quando alguns tamanhos coincidem.
Uma leitura retorna uma página, geralmente em dezenas de microssegundos. Uma programação escreve uma página apagada e leva centenas de microssegundos. Um apagamento redefine todos os bits de um bloco para um e leva milissegundos. As páginas são programadas na ordem exigida pelo chip, geralmente das páginas de número menor para as de número maior. O controlador deve seguir essas regras de ordenação ao posicionar dados.
Uma página usada não pode simplesmente receber uma versão substituta. Seu bloco de apagamento precisa primeiro ser apagado, destruindo o conteúdo de todas as páginas desse bloco. Essa é a diferença central: escritas têm o tamanho de uma página, enquanto apagamentos têm o tamanho de um bloco.
Veja o custo de uma atualização no mesmo lugar
Imagine um bloco contendo as páginas A, B, C e D. Para substituir A por A′ mantendo a mesma posição física:
- Leia B, C e D para um armazenamento temporário.
- Apague o bloco inteiro, incluindo o A antigo.
- Programe A′, B, C e D nas páginas apagadas.
Uma página de informações novas causou três leituras, quatro programações e um apagamento. Não é possível apagar apenas A. Um SSD evita pagar esse custo em cada sobrescrita do hospedeiro escrevendo a substituição em outro lugar e alterando seu mapeamento.
Gerencie danos e retenção
Cada ciclo de programação e apagamento (P/E) danifica ligeiramente as células. Faixas representativas de resistência são cerca de 50.000–100.000 ciclos para SLC, 1.000–3.000 para TLC e cerca de 1.000 ou menos para QLC; os valores reais variam bastante conforme a geração e o fabricante do chip. Os controladores retiram de uso blocos que se tornam pouco confiáveis.
A carga também se dissipa com o tempo, especialmente em células desgastadas. A leitura ou a programação pode perturbar células próximas. Códigos de correção de erros (ECC) robustos corrigem muitos erros de bits resultantes, e o controlador pode renovar dados cuja contagem de erros esteja aumentando. A memória flash é um armazenamento persistente com operações assimétricas e resistência finita, então uma leitura rápida de página, por si só, diz pouco sobre o custo de sobrescritas contínuas.
Principais conclusões
- Uma célula que armazena b bits precisa distinguir 2ᵇ níveis de carga.
- A memória flash lê e programa páginas, mas apaga blocos inteiros.
- A programação exige espaço apagado; preservar páginas vizinhas ativas torna custosas as atualizações no mesmo lugar.
- Ciclos P/E desgastam células, enquanto perturbações e dissipação de carga geram erros.
- ECC, renovação de dados e retirada de blocos de uso ajudam o controlador a gerenciar esses erros.
3.2 Acompanhe páginas lógicas pela FTL
O hospedeiro lê e sobrescreve blocos lógicos. A camada de tradução flash (FTL) do SSD mapeia esses endereços para páginas físicas de memória flash e gerencia os apagamentos ocultos por trás deles. Manter permanentemente a página lógica N na página física N faria com que sobrescritas frequentes apagassem repetidamente os mesmos blocos.
Escreva uma nova versão em outro lugar
Uma FTL estruturada em registro programa novos dados em uma página livre e altera seu mapeamento. Suponha que o LBA 100 seja mapeado para a página física 0 e o LBA 101 para a página 1. Uma sobrescrita do LBA 100 é programada na página 2. O mapa passa a ser 100 → 2; a página 0 torna-se inválida. O hospedeiro continua solicitando o LBA 100 e recebe a nova versão.
Inválido é um estado de mapeamento, não um apagamento físico imediato. Os bits antigos permanecem até que seu bloco de apagamento seja recuperado. Excluir ou sobrescrever um arquivo, portanto, não oferece uma garantia confiável de quando cada cópia física antiga desaparecerá. O apagamento confiável usa uma operação adequada de sanitização da unidade ou um esquema de criptografia de toda a unidade corretamente gerenciado com destruição da chave.
Recupere espaço e conte escritas adicionais
A coleta de lixo (GC) escolhe um bloco, copia suas páginas válidas para outro lugar, atualiza o mapa e apaga o bloco antigo. Páginas inválidas não precisam ser copiadas. Um bloco com muitas páginas inválidas fornece mais espaço livre por página ativa copiada.
A amplificação de escrita (WA) mede essa programação adicional:
Em um bloco de 64 páginas com 48 páginas válidas e 16 inválidas, a GC copia 48 páginas. Apagar o bloco cria 64 páginas livres, mas as cópias consumiram 48 páginas em outro lugar: o ganho líquido é de 16. Preencher esse ganho com 16 páginas do hospedeiro produz 64 programações de páginas de memória flash para 16 escritas de páginas do hospedeiro, então WA = 4. Uma amplificação maior consome mais rapidamente a largura de banda e a resistência a ciclos de apagamento.
O superprovisionamento reserva espaço de memória flash que o hospedeiro não pode preencher. Mais espaço livre dá à GC flexibilidade para escolher blocos de menor custo. O TRIM, chamado Deallocate em NVMe e UNMAP em SCSI, informa ao dispositivo quais intervalos lógicos não contêm mais dados necessários. As páginas de um arquivo excluído podem então ser tratadas como inválidas em vez de copiadas durante a GC.
Dimensione a memória de mapeamento e o desgaste
Um mapa em nível de página precisa de uma entrada por página lógica. Um dispositivo de 1 TiB com páginas de 4 KiB tem:
Com 4 bytes por entrada, a tabela ocupa 1 GiB. O mapeamento em nível de bloco reduz a tabela, mas torna pequenas atualizações custosas. O mapeamento híbrido combina mapas de blocos com áreas de registro mapeadas por página; outra abordagem mantém em cache apenas entradas ativas do mapa de páginas.
O nivelamento de desgaste distribui apagamentos entre os blocos. Novas escritas já são distribuídas, mas blocos que contêm dados frios e inalterados poderiam, de outra forma, evitar o desgaste indefinidamente enquanto regiões quentes se desgastam. Mover alguns dados frios libera blocos pouco usados para integrar o conjunto disponível para escrita. Essa migração pode acrescentar escritas, então o controlador equilibra o desgaste uniforme com o custo de cópia.
Principais conclusões
- Uma FTL mapeia endereços lógicos do hospedeiro para páginas físicas de memória flash.
- Atualizações em outro lugar invalidam páginas antigas sem apagar imediatamente seus bits.
- A GC copia páginas válidas antes de apagar um bloco.
- A amplificação de escrita divide toda a programação da memória flash pelas escritas do hospedeiro.
- Superprovisionamento e TRIM reduzem cópias desnecessárias.
- Mapas em nível de página trocam memória por flexibilidade de atualização.
- O nivelamento de desgaste inclui blocos pouco usados na carga de apagamentos.
3.3 Interprete a velocidade e a vida útil de SSDs
Um SSD não tem braço de disco nem prato giratório. Ele evita atrasos de posicionamento de milissegundos, mas sua velocidade ainda depende do tamanho das requisições, do paralelismo, do histórico de escritas e do trabalho que seu controlador realiza em segundo plano.
Compare latência e vazão
| Carga de trabalho ou propriedade | Disco rígido | SSD de memória flash |
|---|---|---|
| Latência de pequena leitura aleatória | Milissegundos | De dezenas a cerca de uma centena de microssegundos |
| Taxa de pequenas leituras aleatórias | Aproximadamente 75–200 IOPS | NVMe pode chegar a centenas de milhares com trabalho enfileirado suficiente |
| Transferência sequencial | Até algumas centenas de MB/s | Cerca de 550 MB/s para SATA; vários GB/s para NVMe |
| Principais custos internos | Busca, rotação, transferência | Acesso à página, trabalho do controlador, GC, paralelismo |
Essas são classes representativas de dispositivos, não garantias para cada unidade. A vazão de um SSD SATA é limitada pelo enlace de 6 Gb/s. NVMe usa PCIe e pode manter muitos canais de memória flash ocupados ao mesmo tempo.
Um programa que emite uma pequena leitura e espera por ela antes de emitir a próxima percebe a latência de cada requisição. Se a latência for 80 µs, esse padrão serial permite cerca de 12.500 operações por segundo. Um dispositivo anunciado com uma taxa de IOPS muito maior precisa de muitas requisições em andamento, fornecidas por threads ou entrada e saída assíncrona. A profundidade da fila cria oportunidades de trabalho paralelo; também pode acrescentar espera quando o dispositivo está saturado.
Considere o histórico de escritas
Escritas aleatórias e sequenciais continuam diferentes. Atualizações aleatórias podem deixar páginas inválidas espalhadas entre páginas ativas, aumentando as cópias da GC. Cargas de trabalho sequenciais podem invalidar regiões inteiras juntas, tornando a recuperação mais barata e mantendo a WA mais próxima de um. Um SSD vazio pode programar diretamente no espaço livre; um SSD cheio precisa recuperá-lo. O desempenho em regime permanente inclui esse custo contínuo da GC, enquanto testes logo após a retirada da caixa podem não incluí-lo.
Leia as especificações de vida útil como um limite de escrita
TBW é o total especificado de terabytes escritos pelo hospedeiro. DWPD expressa as gravações completas da unidade pelo hospedeiro por dia durante o período de garantia. Para um dispositivo de 1 TB especificado para 600 TBW em cinco anos:
Com 50 GB por dia, 600 TB de escritas do hospedeiro seriam acumulados após 12.000 dias, cerca de 33 anos. Essa aritmética é uma comparação de cargas de trabalho, não uma previsão de vida útil: falhas do controlador, envelhecimento e limites de garantia ainda importam. Alta amplificação interna desgasta as células mais rapidamente, embora a especificação de vida útil conte as escritas do hospedeiro.
Escolha o dispositivo adequado ao trabalho
Discos rígidos oferecem baixo custo por terabyte para conjuntos de dados grandes e acessados com pouca frequência. SSDs são adequados a trabalhos sensíveis à latência. O armazenamento em camadas mantém dados quentes em SSDs e dados mais frios em discos. Ambos podem falhar: discos têm falhas mecânicas e setores defeituosos; SSDs têm desgaste, falhas de controlador e erros de firmware. Redundância e backups separados continuam úteis para ambos.
Em SSDs, a desfragmentação acrescenta escritas com pouco benefício relacionado à busca. O TRIM ajuda o controlador a identificar dados não utilizados. Ferramentas atuais de particionamento geralmente alinham os inícios a limites de 1 MiB, evitando requisições de blocos mal alinhadas.
Principais conclusões
- Um SSD elimina o posicionamento mecânico, mas ainda tem custos do controlador e da memória flash.
- Os altos IOPS anunciados exigem requisições independentes suficientes em andamento.
- Escritas aleatórias e GC podem reduzir o desempenho de escrita em regime permanente.
- TBW conta escritas do hospedeiro; DWPD distribui esse limite pela capacidade e pelos dias de garantia.
- Escolha SSDs para acesso rápido e discos rígidos para capacidade volumosa e econômica.
- TRIM e alinhamento adequado ajudam SSDs a evitar trabalho desnecessário.
4Mapeie dados e avalie opções de RAID
Um arranjo combina discos por trás de uma interface de dispositivo de blocos. Sua organização determina quais discos contêm cada bloco, quanta capacidade resta para dados e o que sobrevive a uma falha. Avance da distribuição em faixas e dos pares espelhados até a paridade XOR e depois conte as operações físicas de entrada e saída para explicar o desempenho. Por fim, inclua a operação degradada e o tempo de reconstrução na escolha de um nível: um arranjo saudável é apenas uma etapa de sua vida útil.
4.1 Avalie o que um arranjo oferece
RAID, um arranjo redundante de discos de baixo custo ou independentes, apresenta vários discos físicos como um único dispositivo lógico de blocos. Internamente, um mapeamento envia cada bloco lógico para cópias de dados ou para uma faixa com redundância. Aplicações e sistemas de arquivos podem continuar usando a interface de blocos sem entender essa organização.
Compare três medidas separadas
Capacidade é o espaço utilizável para dados do usuário. Confiabilidade descreve as falhas que uma organização pode tolerar. Desempenho inclui tanto a vazão em muitas operações quanto a latência de uma operação. Um nível pode melhorar uma medida enquanto reduz outra. Uma vazão agregada maior também não reduz necessariamente a latência de uma única requisição de bloco.
Use este modelo simples para discos de mesmo tamanho:
| Símbolo | Significado |
|---|---|
| N | Número de discos |
| B | Blocos por disco |
| S | Vazão sequencial de um disco |
| R | Vazão aleatória de um disco para o tamanho da requisição |
| T | Latência de uma requisição a um disco |
S e R usam as mesmas unidades de taxa, como MB/s. Em um disco rígido, elas diferem muito: o exemplo anterior de tempos resultou em cerca de 195 MB/s sequenciais e 0,34 MB/s para pequenas leituras aleatórias. As fórmulas do modelo pressupõem trabalho concorrente suficiente e nenhum gargalo no controlador; seu propósito é mostrar os custos da organização.
Defina o modelo de falhas
Um disco no modelo de falha por parada funciona corretamente até falhar por completo e de forma visível. Isso torna administrável o raciocínio básico sobre RAID: o arranjo sabe qual disco está ausente. Discos reais também podem ter setores ilegíveis ou retornar bytes incorretos. Essas falhas parciais e silenciosas exigem verificações de integridade além de uma organização que sobreviva à perda completa de um disco.
Um arranjo redundante opera em modo degradado enquanto os discos com falha permanecem dentro de sua tolerância. Ele ainda fornece dados, mas os discos restantes realizam trabalho adicional ou têm menos capacidade de leitura disponível. Uma reconstrução preenche um disco substituto a partir das informações restantes. Um disco de reserva a quente é um disco ocioso instalado que permite iniciar a reconstrução rapidamente. RAID-0 não tem redundância nem esse estado de operação degradada após perder um disco do arranjo.
Mantenha consistentes as atualizações em vários discos
O RAID pode executar em um controlador de hardware com processador e cache protegido próprios, em software do sistema operacional, como o md do Linux, ou dentro de um sistema de arquivos, como ZFS. Cada um deve tratar uma escrita interrompida entre atualizações em discos diferentes. Espelhos podem divergir; dados e paridade podem descrever versões diferentes. O caso da paridade é a lacuna de escrita.
Um cache não volátil protegido ou um diário de transações adequado pode preservar atualizações pendentes para recuperação. Um mapa de bits de intenção de escrita registra quais áreas precisam de ressincronização após uma interrupção. Ele não mantém os novos dados e, sozinho, não é uma solução completa para a lacuna de escrita de paridade quando um disco também está ausente.
RAID mantém a disponibilidade diante de falhas de disco especificadas. Uma exclusão ou escrita de ransomware chega às cópias do arranjo pela interface normal. Um incêndio ou roubo pode eliminar todo o arranjo. Backups separados fornecem versões ou cópias recuperáveis além desses eventos compartilhados.
Principais conclusões
- Compare separadamente capacidade utilizável, tolerância a falhas, vazão e latência de requisição.
- O modelo básico de falha por parada pressupõe que um disco com falha seja identificado.
- Arranjos redundantes podem fornecer dados em modo degradado e reconstruí-los em um disco substituto.
- Atualizações interrompidas em vários discos precisam de um mecanismo de consistência.
- Um mapa de bits identifica regiões de ressincronização; registros protegidos podem preservar informações de atualização.
- RAID e backups separados protegem contra tipos diferentes de perda.
4.2 Localize blocos em faixas e pares espelhados
RAID-0 distribui dados em faixas entre discos sem manter informações redundantes. Com um fragmento de um bloco e numeração a partir de zero, o bloco lógico A vai para:
Para quatro discos, o bloco 14 pertence ao disco 2 no deslocamento 3. O módulo escolhe o disco; a divisão inteira conta as linhas de faixa completas antes desse bloco.
Inclua o tamanho do fragmento no mapeamento
Um fragmento de faixa é uma sequência de blocos consecutivos colocados em um disco antes de passar ao próximo. Seja seu tamanho c blocos. Primeiro identifique o fragmento, depois o disco e o deslocamento local:
Para o bloco 14, c = 2 e N = 4, o fragmento é 7, o disco é 3 e o deslocamento é 2. Usar A módulo N diretamente ignoraria os fragmentos de dois blocos. Fragmentos pequenos podem distribuir uma requisição grande por mais discos; fragmentos maiores mantêm mais trabalho próximo em um disco. Fragmentos comuns de arranjos variam de 64 a 512 KiB; o md do Linux geralmente usa 512 KiB como padrão.
RAID-0 tem capacidade NB e taxas agregadas ideais sequencial e aleatória NS e NR. Uma pequena requisição a um único disco ainda leva cerca de T. A falha de qualquer disco do arranjo causa perda de alguns dados, então essa organização é adequada a dados temporários reproduzíveis quando a disponibilidade não é importante.
Acrescente cópias espelhadas
Um espelho RAID-1 de dois discos escreve cada bloco nos dois integrantes. RAID-10 distribui faixas entre pares espelhados. Com quatro discos e fragmentos de um bloco entre pares, o bloco A vai para o par A módulo 2 no deslocamento piso(A/2), e ambos os integrantes o armazenam.
RAID-10 usa metade da capacidade bruta. Ele sobrevive a qualquer falha isolada e pode sobreviver a N/2 falhas se cada uma atingir um par diferente. Perder os dois integrantes de um par causa a perda dos dados desse par, mesmo que todos os outros pares permaneçam saudáveis.
Conte o trabalho útil por disco
Cada escrita espelhada atualiza dois discos em paralelo. Sua latência é cerca de T, determinada pelo integrante mais lento, enquanto a vazão agregada de escrita aleatória é NR/2. Leituras podem ser distribuídas entre todas as cópias, resultando em NR com leituras aleatórias independentes suficientes.
| Quatro discos, cada um de 4 TB; S = 200 MB/s, R = 1 MB/s | RAID-0 | RAID-10 |
|---|---|---|
| Capacidade utilizável | 16 TB | 8 TB |
| Taxa de leitura/escrita sequencial no modelo simples | 800 MB/s | 400 MB/s |
| Taxa de leitura aleatória | 4 MB/s | 4 MB/s |
| Taxa de escrita aleatória | 4 MB/s | 2 MB/s |
O modelo simples de leitura sequencial espelhada resulta em NS/2 porque os parceiros saltam os blocos um do outro. Implementações que atribuem intervalos completos de leitura a cada cópia podem obter resultados melhores. O espelhamento fornece mais capacidade de atendimento de leituras; ele não faz um disco concluir uma leitura individual na metade do tempo.
Principais conclusões
- Use módulo para determinar o disco de uma faixa de um bloco e divisão inteira para seu deslocamento local.
- Para fragmentos maiores, localize o fragmento antes de escolher o disco.
- RAID-0 tem capacidade integral utilizável e nenhuma tolerância a falhas de disco.
- RAID-10 distribui faixas entre pares espelhados e usa metade da capacidade bruta.
- Duas falhas são toleráveis apenas se nenhum par espelhado perder os dois integrantes.
- Escritas espelhadas consomem trabalho de dois discos; leituras independentes podem usar qualquer cópia.
- O resultado NS/2 para leitura sequencial espelhada no modelo simples depende da distribuição das leituras.
4.3 Reconstrua e atualize a paridade
Uma faixa com paridade armazena blocos de dados e um bloco de redundância igual ao XOR bit a bit deles. Para cada posição de bit, XOR é um quando um número ímpar de entradas é um. Aplicar XOR a um valor com ele mesmo o cancela. Esse cancelamento permite que o arranjo determine um bloco ausente.
Recupere um bloco ausente conhecido
Para os dados 0011, 0101 e 1001:
Se o segundo bloco estiver ausente:
O arranjo precisa saber qual bloco reconstruir. Uma divergência de paridade entre blocos aparentemente saudáveis mostra inconsistência, mas não identifica o integrante defeituoso. Uma soma de verificação pode ajudar a determinar quais dados são válidos.
Atualize um bloco sem ler a faixa inteira
Reconstruir a paridade a partir dos outros dados é a paridade aditiva. Com cinco discos de dados, alterar um bloco exige ler os outros quatro blocos de dados e depois combiná-los com o novo valor. A paridade subtrativa, ou leitura, modificação e escrita, remove a contribuição do bloco antigo e insere a do novo:
Altere 0101 para 1100 na faixa acima:
Isso exige duas leituras, dos dados antigos e da paridade antiga, seguidas de duas escritas, dos novos dados e da nova paridade. A fase de leitura precisa terminar antes da fase de escrita, resultando em cerca de 2T de latência. Uma escrita de faixa completa tem todos os novos blocos de dados, então calcula a nova paridade diretamente e não precisa ler blocos antigos.
Distribua o trabalho de paridade
| Nível | Posicionamento da redundância | Blocos utilizáveis | Falhas de disco toleradas | Taxa ideal de pequenas escritas aleatórias |
|---|---|---|---|---|
| RAID-4 | Um disco de paridade dedicado | (N − 1)B | Qualquer uma | R/2 |
| RAID-5 | Um bloco de paridade alternando entre discos | (N − 1)B | Qualquer uma | NR/4 |
| RAID-6 | Dois blocos independentes de redundância por faixa | (N − 2)B | Quaisquer duas | NR/6 |
O disco de paridade do RAID-4 realiza uma leitura e uma escrita para cada pequena atualização, criando um gargalo fixo. RAID-5 distribui a paridade entre os discos, permitindo que atualizações de faixas independentes ocorram simultaneamente. Ele ainda paga quatro operações físicas de entrada e saída por pequena escrita lógica. Leituras aleatórias podem usar todos os discos a NR; grandes escritas sequenciais chegam a cerca de (N − 1)S.
RAID-6 acrescenta redundâncias independentes P e Q, geralmente usando um código Reed–Solomon para Q. Duas cópias do mesmo XOR forneceriam apenas uma equação. Atualizar um bloco de dados por leitura, modificação e escrita lê os dados antigos, P e Q e depois escreve os três: seis operações de entrada e saída.
Para quatro discos de 4 TB com R = 1 MB/s, RAID-4 e RAID-5 fornecem 12 TB e taxas de escrita aleatória de 0,5 e 1 MB/s. RAID-6 fornece 8 TB e cerca de 0,67 MB/s. Em RAID-5 degradado, um bloco de dados ausente exige N − 1 leituras de blocos restantes. Em RAID-6 com um bloco de dados ausente, a reconstrução com P exige N − 2 leituras e omite Q; dois blocos ausentes exigem as duas equações independentes.
Principais conclusões
- A paridade XOR reconstrói um bloco ausente identificado.
- Uma divergência de paridade, sozinha, não consegue localizar corrupção silenciosa.
- A leitura, modificação e escrita lê dados antigos e paridade antiga e depois escreve os dois novos valores.
- Escritas de faixa completa evitam as leituras dos dados antigos e da paridade antiga.
- RAID-4 centraliza o gargalo de paridade; RAID-5 o distribui.
- RAID-6 precisa de dois códigos independentes e sobrevive a quaisquer duas falhas de disco.
- Conte quatro operações de entrada e saída para uma pequena escrita em RAID-5 e seis para RAID-6.
- Leituras em modo degradado reconstroem dados ausentes e consomem mais trabalho dos discos restantes.
4.4 Escolha um nível considerando as reconstruções
Comece a escolha de um RAID pela carga de trabalho e pelas perdas às quais ele precisa sobreviver. Considerar apenas a capacidade deixa de fora o custo de escrita, o desempenho em modo degradado e o tempo necessário para restaurar a redundância. Um arranjo maior tem mais discos contribuindo para a capacidade, mas também mais discos e setores expostos durante a recuperação.
Escolha a organização adequada à carga de trabalho
RAID-0 é adequado a dados temporários que podem ser recriados e não precisam de tolerância a falhas de disco. RAID-10 é adequado a muitas pequenas leituras e escritas aleatórias quando é aceitável abrir mão de metade da capacidade. RAID com paridade usa o espaço de forma eficiente e funciona bem para grandes escritas de faixa completa. RAID-6 acrescenta proteção contra quaisquer duas falhas, útil quando a reconstrução de unidades grandes leva muito tempo.
Com quatro discos, RAID-10 e RAID-6 fornecem, cada um, metade da capacidade bruta. RAID-10 precisa de duas escritas físicas por pequena escrita lógica; a leitura, modificação e escrita do RAID-6 precisa de seis operações de entrada e saída. RAID-6 sobrevive a qualquer combinação de falhas em dois discos, enquanto RAID-10 exige que essas falhas atinjam pares diferentes. Nenhuma das escolhas é superior em todas as medidas.
Calcule um limite inferior para a reconstrução
A reconstrução de um espelho copia seu disco parceiro restante. Uma reconstrução completa de um arranjo com paridade lê os dados restantes e reconstrói os blocos ausentes. A equação P do RAID-6 pode reconstruir um bloco de dados ausente sem Q; as leituras reais de recuperação dependem da organização e da implementação. Reconstruções de unidades completas podem envolver leituras extensas nos discos restantes.
Escrever um disco substituto de 20 TB a 200 MB/s leva pelo menos:
Isso equivale a cerca de 27,8 horas sem carga concorrente ou gargalo adicional. Entrada e saída normal, buscas, trabalho do controlador e limitação da recuperação podem aumentar esse tempo. Adicionar um disco de reserva a quente reduz a espera antes do início da reconstrução; isso não elimina o tempo de cópia.
Examine a exposição durante a recuperação
Um arranjo RAID-5 degradado já usou sua única tolerância a falha de disco. A perda de outro disco impede a recuperação. Um setor ilegível em um disco restante também pode deixar uma faixa com dois blocos desconhecidos: o bloco do disco ausente e o bloco ilegível do disco restante. Outras faixas ainda podem ser recuperáveis.
Como cálculo ilustrativo, reconstruir um RAID-5 de quatro discos de 4 TB exige ler três discos restantes completos:
Se os erros forem modelados à taxa de um por 10¹⁴ bits, o número esperado será 0,96. Esse é um número esperado segundo esse modelo de taxa, não uma probabilidade de falha de 96%. Um limite de taxa de erro de uma ficha técnica não é uma previsão medida para uma reconstrução específica. Especificações empresariais frequentemente apresentam um limite mais rigoroso, como um por 10¹⁵ bits.
Aumentar o RAID-5 de quatro para oito discos eleva a capacidade utilizável de 75% para 87,5% do espaço bruto, enquanto aumenta os dados restantes lidos durante a recuperação. Idade e desgaste semelhantes também enfraquecem a hipótese de falhas independentes. Um banco de dados com muitas escritas pode favorecer RAID-10; um grande arquivo sequencial pode favorecer RAID-6. Programe varreduras de integridade para descobrir setores defeituosos enquanto ainda há redundância e mantenha backups separados.
Principais conclusões
- Escolha considerando carga de trabalho, capacidade, padrões de falha e exposição durante a recuperação.
- A capacidade dividida pela taxa de reconstrução fornece um tempo otimista de reconstrução.
- Um arranjo RAID-5 degradado não tolera outra falha completa de disco.
- Um setor ilegível em um disco restante pode impedir a reconstrução de sua faixa.
- Um número esperado de erros não é uma probabilidade de falha.
- Mais discos em RAID-5 melhoram a eficiência de espaço, mas aumentam a exposição durante a recuperação.
5Verifique dados e repare erros identificados
Um disco pode permanecer em operação enquanto retorna blocos ilegíveis ou incorretos. Diferencie essas falhas da falha completa de disco e depois compare métodos de soma de verificação e os erros que podem deixar passar. O posicionamento da soma de verificação importa tanto quanto a aritmética: bytes corretos no endereço errado e uma versão antiga no endereço certo exigem verificações diferentes. Combine verificação com redundância e leituras periódicas para encontrar e reparar falhas antes que as opções de recuperação desapareçam.
5.1 Reconheça falhas parciais e silenciosas
O modelo de falha por parada identifica um disco inteiro como ausente. Um dispositivo no modelo de falha parcial funciona na maior parte do tempo, enquanto alguns blocos são ilegíveis ou incorretos. Essas falhas podem permanecer ocultas em dados raramente acessados até que outra falha torne esses blocos necessários para uma reconstrução.
Separe um erro de leitura informado de bytes incorretos
Um erro latente de setor (LSE) significa que a unidade não consegue ler um setor e informa um erro. Danos físicos ou erros de bits além da capacidade de correção do ECC interno podem causá-lo. Como o local é conhecido, um sistema redundante pode ler um espelho ou reconstruir esse bloco a partir da paridade. Reescrever os dados recuperados permite que a unidade retire de uso ou remapeie o local danificado.
Corrupção silenciosa significa que uma leitura retorna bytes incorretos sem informar erro. Firmware defeituoso, uma falha no controlador ou no barramento, ou uma escrita em destino incorreto podem causá-la. O estado de sucesso do comando indica que a transferência terminou; ele não valida o conteúdo de ponta a ponta.
Diferencie erros de endereço e de versão
| Falha | O que está errado | Por que uma soma de verificação local dos dados pode não detectá-la |
|---|---|---|
| Escrita em destino incorreto | Bytes novos corretos chegam ao disco ou bloco errado | Os dados e sua soma de verificação correspondente podem viajar juntos |
| Escrita perdida | Uma atualização informada como concluída nunca chega ao armazenamento | Os bytes antigos ainda correspondem à sua soma de verificação antiga |
Uma escrita em destino incorreto pode sobrescrever um bloco não relacionado e deixar o destino pretendido desatualizado. Uma escrita perdida deixa a versão antiga do bloco pretendido no lugar. Um identificador de endereço ajuda a detectar a primeira falha; uma referência da nova versão armazenada de forma independente ajuda a detectar a segunda.
O ECC interno da unidade corrige muitos erros nos bits armazenados. Ele não consegue verificar todas as falhas em outros pontos do caminho, como um valor corrompido antes de a unidade calcular seu código ou depois de a unidade retorná-lo. A proteção restrita ao meio deixa outros componentes sem verificação.
Entenda por que a escala importa
Um estudo de campo acompanhou 1,53 milhão de discos em produção por 32 meses. LSEs afetaram cerca de 8,5% das unidades nearline e 1,9% das unidades de classe empresarial. Um estudo separado sobre corrupção na mesma população durante 41 meses encontrou divergências de somas de verificação em cerca de 0,86% e 0,065%, respectivamente. Essas são observações históricas em períodos de estudo diferentes, não probabilidades anuais nem garantias atuais. Na escala de um grande parque de unidades, até falhas incomuns por unidade tornam-se eventos operacionais regulares.
Use redundância com verificação
Uma leitura normal de um espelho de duas cópias pode escolher uma delas sem compará-la com a outra. Ela pode retornar bytes corrompidos se nenhuma soma de verificação for conferida. Se as cópias forem comparadas e divergirem, duas cópias sozinhas não indicam qual está correta. Uma soma de verificação válida fornece uma base para selecionar uma versão correta.
Durante uma reconstrução de RAID-5, um LSE em um disco restante pode eliminar a última informação necessária para sua faixa. O arranjo já tem um bloco ausente, e uma equação XOR não consegue recuperar duas incógnitas. Encontrar e reparar falhas latentes enquanto todos os discos permanecem disponíveis preserva opções para a próxima falha.
Principais conclusões
- Um LSE é a incapacidade informada de ler um setor; a corrupção silenciosa retorna dados incorretos sem erro.
- Escritas em destino incorreto vão para o lugar errado; escritas perdidas deixam uma versão antiga.
- O ECC da unidade protege o meio, mas deixa outras partes do caminho dos dados expostas.
- Duas cópias espelhadas que divergem precisam de verificação para identificar uma cópia correta.
- Uma falha latente pode tornar-se irrecuperável depois que a redundância é consumida.
5.2 Calcule somas de verificação e compare sua robustez
Uma soma de verificação resume um bloco de dados em um valor muito menor. Na leitura, recalcule-a e compare-a com o valor esperado armazenado. Uma divergência detecta uma inconsistência. Entradas diferentes podem compartilhar um valor, o que se chama colisão, então somas coincidentes fornecem uma forte evidência cuja robustez depende da função escolhida e do padrão de erro.
Experimente XOR e adição
Para os bytes 0x36, 0x5A, 0xC1 e 0x0F, o XOR bit a bit resulta em 0xA2. Em binário, o cálculo é:
Inverta o bit menos significativo dos dois primeiros bytes, obtendo 0x37 e 0x5B. As duas alterações se cancelam no XOR, mantendo 0xA2. Uma operação barata pode ter um ponto cego previsível.
Uma soma de verificação por adição de 8 bits soma os valores dos bytes módulo 256:
A dupla inversão acima altera a soma para 0x62, então a adição detecta esse erro. Mas mudar a ordem dos bytes deixa tanto a adição simples quanto o XOR inalterados.
Acrescente sensibilidade à posição
Uma soma de verificação de Fletcher mantém duas somas, inicializadas em zero. Para cada byte d, atualize a primeira soma e depois adicione seu novo valor à segunda:
| Byte | Novo s₁ | Novo s₂ |
|---|---|---|
| 54 | 54 | 54 |
| 90 | 144 | 198 |
| 193 | 82 | 25 |
| 15 | 97 | 122 |
O resultado é (97, 122). Trocar os dois primeiros bytes de lugar resulta em (97, 158). A primeira soma ignora a ordem, mas a segunda atribui pesos às posições por meio da acumulação progressiva. Fletcher detecta erros de um único bit e muitos erros em rajada a baixo custo, embora colisões continuem possíveis.
Acompanhe uma divisão curta de CRC
Uma verificação de redundância cíclica (CRC) trata bits como coeficientes polinomiais e divide usando XOR. Com o gerador 1011, que representa x³ + x + 1, um resto de três bits protege os dados. Para os dados 1101, acrescente três zeros:
- Comece com 1101000 e aplique XOR com 1011000, restando 0110000.
- Alinhe o gerador ao primeiro bit um e aplique XOR com 0101100, restando 0011100.
- Aplique XOR com 0010110, restando 0001010.
- Aplique XOR com 0001011, restando 0000001.
O resto é 001, então armazene 1101001. Dividir essa palavra de código resulta em zero; alterá-la para 1111001 resulta em resto 110. Um CRC de n bits detecta toda rajada de comprimento máximo n bits. O suporte da CPU torna o CRC viável para armazenamento e tráfego de rede, incluindo CRC32C em metadados do ext4 e no Btrfs.
Hashes criptográficos como SHA-256 também resistem a tentativas deliberadas de colisão. Um hash usado contra adulteração precisa de um valor esperado confiável; substituir tanto os dados quanto seu hash não confiável invalida a comparação. O OpenZFS normalmente usa Fletcher para dados comuns e SHA-256 para deduplicação. Oito bytes de soma de verificação por bloco de 4 KiB custam cerca de 0,2% de espaço. A detecção sozinha não fornece bytes de substituição: o reparo exige redundância ou um código de correção de erros.
Principais conclusões
- Uma divergência de soma de verificação detecta inconsistência; uma colisão pode ocultar um erro.
- XOR não detecta inversões de bits que se cancelam; adição não detecta fragmentos reordenados.
- Fletcher atualiza duas somas acumuladas para que as posições dos bytes afetem o resultado.
- CRC usa divisão polinomial com XOR e detecta rajadas de comprimento limitado.
- Hashes criptográficos reforçam a resistência a colisões, mas precisam de um valor esperado confiável contra adulterações.
- Somas de verificação detectam erros; o reparo exige informações adicionais.
5.3 Posicione verificações onde possam detectar a falha
Uma função de soma de verificação determina quais alterações são detectáveis. O projeto de armazenamento determina com qual valor ela é comparada, a qual endereço pertence e se existe uma substituição correta. Uma soma de verificação robusta associada à versão errada ainda pode aceitar dados desatualizados.
Escolha um lugar para o valor esperado
| Posicionamento | Como funciona | Principal consequência |
|---|---|---|
| Por setor | Por exemplo, 512 bytes de dados mais 8 bytes de proteção em um setor de 520 bytes | A proteção viaja com o setor |
| Bloco agrupado de somas de verificação | Um bloco de 4 KiB contém 512 somas de verificação de oito bytes | Atualizar dados também pode exigir a atualização de outro bloco |
| Ponteiro do bloco pai | Um bloco pai armazena a soma de verificação do bloco filho ao qual faz referência | O conteúdo esperado é verificado de fora do bloco filho |
O ZFS usa somas de verificação em ponteiros de blocos pais, criando uma árvore de verificação até sua raiz. Informações de proteção também podem conter o endereço esperado. A etiqueta de referência do T10 usa os 32 bits menos significativos do endereço de bloco lógico junto com um CRC de dados de 16 bits e uma etiqueta de aplicação. Uma verificação de endereço pode rejeitar bytes corretos retornados do local errado.
Separe local errado de versão errada
Suponha que uma leitura do disco 3, bloco 1.207 retorne um par válido de dados e soma de verificação identificado para outro endereço. A soma de verificação sozinha coincide, mas o identificador de endereço revela o destino incorreto.
Uma escrita perdida é mais difícil: o conteúdo antigo pode ter uma soma de verificação válida e o endereço correto. A verificação por leitura após escrita compara uma nova leitura com o novo conteúdo esperado, acrescentando aproximadamente outra operação de entrada e saída. Ela precisa observar o resultado armazenado, não apenas a mesma cópia em cache volátil. Uma soma de verificação esperada armazenada separadamente, como em um ponteiro confirmado de bloco pai, pode rejeitar a versão desatualizada do bloco filho. O valor esperado separado deve, ele próprio, descrever a atualização pretendida.
Verifique antes de retornar ou reparar
Em uma leitura, obtenha o bloco e sua soma de verificação esperada, recalcule e compare. Se a primeira cópia falhar, leia outra cópia ou reconstrua o bloco a partir da redundância. Verifique esse resultado antes de retorná-lo. Se ele passar, retorne os dados corretos e reescreva a cópia danificada. Isso é autorreparo. Se nenhuma cópia válida puder ser encontrada, retorne um erro em vez de bytes não verificados.
Por exemplo, um conjunto de armazenamento ZFS espelhado lê o disco A e detecta uma divergência de soma de verificação. A cópia do disco B passa na verificação. O sistema retorna os dados de B, repara A e registra o erro de A. O espelhamento comum sem verificação de soma poderia retornar os bytes incorretos de A sem perceber.
Procure erros antes que uma falha force a recuperação
A varredura de integridade lê e verifica periodicamente os dados armazenados, inclusive blocos que as aplicações raramente acessam. Com redundância disponível, o sistema pode reparar falhas antes que outro disco falhe. No estudo histórico sobre LSEs, a varredura de integridade encontrou mais de 60% dos erros.
A verificação consome tempo de CPU, espaço para somas de verificação e, às vezes, entrada e saída adicional. Oito bytes por 4 KiB custam cerca de 0,2%; oito por 512 bytes de dados custam cerca de 1,6%. As leituras da varredura competem com requisições em primeiro plano, então períodos de baixa atividade são úteis. O argumento de ponta a ponta coloca a verificação final perto do sistema de arquivos ou da aplicação, cobrindo mais partes do caminho que o ECC da unidade restrito ao meio.
Principais conclusões
- O posicionamento da soma de verificação determina qual valor esperado está disponível durante uma leitura.
- Informações de endereço detectam dados no local errado; um valor atual esperado separado pode detectar dados desatualizados.
- Verifique uma cópia recuperada antes de retorná-la ou usá-la para reparo.
- A varredura de integridade verifica dados raramente lidos enquanto a redundância ainda pode repará-los.
- Verificações de ponta a ponta cobrem falhas além do meio da unidade.
Exercícios resolvidos de Dispositivos de entrada e saída e RAID
1Acompanhe uma requisição sem manter a CPU ocupada
16 passos
- 1IntroduçãoSepare as tarefas de uma requisição de entrada e saída
Uma requisição de armazenamento tem várias tarefas: descrever o que fazer, transferir bytes e informar quando termina. A CPU não precisa realizar todas elas continuamente: o DMA permite que o hardware transfira os bytes, e as interrupções permitem que a CPU execute outro trabalho enquanto espera.
Acompanhe uma requisição desde sua interface de registradores, passando pela espera e pela transferência, e depois reúna o caminho completo por um driver e um controlador.
- 2ExplicaçãoComece pela interface de dispositivo
O controlador oculta seu firmware e hardware interno por trás de registradores. Em um protocolo simples de saída, o driver verifica se o estado indica que o dispositivo está pronto, fornece dados, escreve o comando e depois verifica a conclusão e os erros.
A ordem importa: escrever o comando pode iniciar o hardware imediatamente. Uma aplicação acessa essa operação controlada por uma chamada de sistema.
- 3Ideia-chaveUm endereço de registrador pode iniciar trabalho
Com MMIO, leituras e escritas alcançam registradores de dispositivo por endereços mapeados. Uma leitura de registrador pode limpar um indicador; uma escrita pode iniciar um comando. Pressupostos válidos para RAM comum não são seguros aqui.
O driver usa funções de acesso da plataforma e as barreiras necessárias. Declarar um ponteiro
volatilenão fornece toda a ordenação entre um descritor na RAM e a notificação por MMIO que faz o dispositivo buscá-lo. - 4DesafioCorrija a sequência de comandos
Um driver encontra um dispositivo de saída pronto, escreve seu comando e depois preenche o registrador de dados. Qual ordem ele deve usar e por quê?
---reveal---
Forneça os dados antes de emitir o comando. O comando inicia o dispositivo, que de outra forma poderia consumir dados desatualizados. Após o envio, o driver verifica a conclusão e qualquer erro informado.
- 5ExemploPermita que outro processo execute
O processo C inicia uma leitura que dura 7 ms. O processo D tem processamento pronto para executar. Com consulta periódica, a CPU verifica repetidamente o estado da leitura de C durante toda a espera.
Com espera por interrupção, C fica bloqueado e D pode executar. Na conclusão, o tratador verifica a requisição e coloca C no estado de pronto. A leitura ainda leva 7 ms; processamento útil ocupou o intervalo.
- 6ExplicaçãoCompare o custo de notificação
Uma conclusão muito rápida pode chegar antes que bloquear e despertar o processo compense. Uma fase curta de consulta periódica evita essa sobrecarga; depois, uma estratégia híbrida suspende o processo se a requisição ainda não terminou.
Sob tráfego intenso, o agrupamento compartilha uma interrupção entre várias conclusões. Isso reduz o trabalho da CPU, mas pode atrasar a conclusão mais antiga enquanto o lote se forma.
- 7DesafioEscolha o tamanho de um lote a partir de seu custo
Um dispositivo fornece 60.000 conclusões a cada segundo. Tratar uma interrupção custa 6 µs de tempo de CPU. Quanto tempo de CPU é economizado a cada segundo ao agrupar três conclusões por interrupção?
---reveal---
Interrupções separadas custam 360 ms por segundo. Lotes de três conclusões precisam de 20.000 interrupções:
A economia é de 240 ms por segundo. O tempo de atendimento do dispositivo não muda, enquanto a notificação pode ser atrasada.
- 8ExemploConte a cópia exigida pela PIO
Suponha que uma área útil de 8 KiB passe por um registrador de dados de 8 bytes, custando 80 ns por acesso. A CPU precisa realizar:
Essas operações transferem apenas os dados úteis. O DMA delega a transferência ao hardware, deixando para a CPU a preparação do buffer, o envio e o trabalho de conclusão.
- 9ExplicaçãoMantenha o destino estável
O driver mapeia o buffer para acesso pelo dispositivo e mantém suas páginas correspondentes fixadas na memória até a conclusão. Uma lista de dispersão e reunião descreve regiões separadas por endereço e comprimento quando as páginas físicas não são adjacentes.
O dispositivo recebe endereços de barramento de DMA, não um ponteiro comum de usuário. Uma IOMMU pode traduzir esses endereços e restringir o dispositivo à memória permitida.
- 10DicaCoordene a visibilidade da memória
Um endereço válido é apenas parte de uma transferência de DMA correta. O dispositivo precisa ver os dados de saída mais recentes da CPU, e a CPU precisa ver os bytes de entrada escritos pelo dispositivo.
A coerência de hardware cuida disso em algumas plataformas. Outras precisam de sincronização explícita de cache pela API de DMA. Mantenha o buffer mapeado e estável até que o dispositivo pare de acessá-lo.
- 11DesafioDiagnostique uma liberação prematura do buffer
Um driver inicia uma transferência de DMA para duas páginas fixadas, libera-as antes da conclusão e as entrega a outro processo. Por que uma interrupção posterior não pode tornar isso seguro?
---reveal---
O dispositivo pode já ter escrito nas páginas reutilizadas antes de gerar sua interrupção. As páginas devem permanecer fixadas e indisponíveis para reutilização até o DMA terminar. Tratar a conclusão depois não pode desfazer a corrupção de memória.
- 12ConexãoPasse a requisição pela pilha
Para uma leitura com buffer cujos dados não estão no cache, o sistema de arquivos localiza os blocos de armazenamento solicitados. A camada de blocos enfileira ou combina suas requisições, e o driver envia comandos de hardware.
Essa divisão permite que o sistema de arquivos use a mesma interface de blocos para dispositivos diferentes. Um controle especial, como um comando específico do dispositivo, pode precisar de uma interface como
ioctl(). - 13ExplicaçãoEnvie trabalho por uma fila NVMe
O driver NVMe coloca um comando em uma fila de submissão na memória e depois escreve no registrador de notificação por MMIO. O controlador busca a entrada, usa DMA para transferir os dados úteis e publica uma conclusão. O MSI-X pode direcionar a notificação a um núcleo adequado.
Muitos pares de filas permitem que núcleos de CPU enviem trabalho com menos contenção compartilhada do que uma única fila de dispositivo de pouca profundidade.
- 14DesafioEncontre uma requisição antes do envio
Duas leituras de blocos vizinhos estão esperando no núcleo. Onde elas podem ser combinadas e qual ação posterior informa a um controlador NVMe que ele deve buscar o trabalho enviado?
---reveal---
A camada de blocos genérica pode combinar as requisições adjacentes antes do envio pelo driver. O driver NVMe então preenche uma entrada de submissão e escreve em seu registrador de notificação. A combinação diz respeito à requisição; o registrador de notificação anuncia o trabalho enfileirado.
- 15DesafioExplique o baixo uso da CPU durante uma leitura grande
Uma leitura grande cujos dados não estão no cache termina enquanto outro processo executa cálculos. A CPU realiza o trabalho de configuração e conclusão, mas não copia palavra por palavra pelos registradores do dispositivo. Quais mecanismos explicam essa observação?
---reveal---
O DMA transfere os dados úteis diretamente para a memória. A espera por interrupção permite que o processo de leitura fique bloqueado enquanto outro processamento executa. O driver e a camada de blocos organizam o envio e a conclusão; nenhum desses mecanismos faz desaparecer o trabalho do próprio dispositivo de armazenamento.
- 16RecapitulaçãoAcompanhe a responsabilidade em cada limite
Leia o acompanhamento de uma requisição perguntando quem conhece o endereço do bloco, quem conhece o protocolo do controlador, quem transfere os dados úteis e quem informa a conclusão.
Mantenha espera, cópia e escalonamento separados ao diagnosticar o custo de CPU. A mesma leitura pode combinar uma interface padrão de blocos, uma notificação por MMIO, DMA e uma interrupção.
2Transforme o movimento do disco em uma estimativa de desempenho
13 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoComece pelo trabalho por trás de um endereço
- 2ExplicaçãoDiferencie três garantias de armazenamento
- 3DesafioInterprete uma confirmação de escrita em cache
- 4ExemploConverta a velocidade do eixo em espera média
- 5ExemploAcrescente a transferência de uma leitura pequena
- 6Ideia-chaveDistribua o posicionamento por mais dados
- 7DesafioEstime outra carga de trabalho aleatória
- 8ExemploDesenhe um percurso LOOK
- 9ExemploConte o retorno circular
- 10DesafioAplique uma política a novas chegadas
- 11ConexãoObserve além da distância de busca
- 12DesafioEscolha o que melhorar
- 13RecapitulaçãoUse a grandeza certa para a decisão
3Acompanhe uma sobrescrita em SSD até a recuperação de espaço
14 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoVeja o que uma sobrescrita realmente faz
- 2ExplicaçãoEscolha a unidade física da operação
- 3Ideia-chaveRelacione densidade aos limites das células
- 4DesafioPreserve as páginas vizinhas
- 5ExemploRedirecione uma sobrescrita lógica
- 6ExplicaçãoCopie apenas o que ainda está ativo
- 7ExemploCalcule o custo oculto de programação
- 8DicaForneça melhores informações à coleta
- 9DesafioRecupere um bloco com mais páginas ativas
- 10ExplicaçãoForneça requisições independentes suficientes
- 11ExemploInterprete uma especificação de vida útil
- 12DesafioInterprete uma redução de velocidade em regime permanente
- 13DesafioUse informações de exclusão para mudar o trabalho interno
- 14RecapitulaçãoRelacione as visões física e do hospedeiro
4Escolha um RAID a partir do trabalho físico
18 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoCompare um arranjo em vários aspectos
- 2ExplicaçãoMantenha interface e organização separadas
- 3ConexãoPlaneje o estado após uma falha
- 4DesafioSepare disponibilidade da recuperação de versões anteriores
- 5ExemploMapeie uma faixa com fragmentos de um bloco
- 6ExplicaçãoAcrescente pares espelhados
- 7DesafioAcompanhe um fragmento maior
- 8Ideia-chaveDiferencie uma escrita de muitas escritas
- 9ExemploCalcule a paridade XOR de uma faixa
- 10ExemploRestaure o valor ausente
- 11ExemploAtualize a paridade com o bloco alterado
- 12ExplicaçãoDesloque o gargalo ou acrescente uma equação
- 13DesafioEscolha a atualização de paridade adequada
- 14ExemploCalcule o tempo antes de prometer uma reconstrução
- 15ExplicaçãoExamine erros durante esse período
- 16DesafioEscolha entre organizações de mesma capacidade
- 17DesafioCombine a carga de trabalho e as fases de atualização
- 18RecapitulaçãoAcompanhe a organização até a recuperação
5Verifique um bloco antes de confiar em seus bytes
15 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoPergunte o que uma leitura bem-sucedida estabelece
- 2ExplicaçãoSepare dados ilegíveis de dados incorretos silenciosamente
- 3ExemploAcompanhe o destino e a versão
- 4DesafioDiagnostique uma leitura bem-sucedida de dados desatualizados
- 5ExemploCalcule uma soma de verificação por adição
- 6Ideia-chaveVeja uma colisão sem tentativas aleatórias
- 7ExemploAcumule a posição com Fletcher
- 8DesafioEscolha a aritmética correta da soma de verificação
- 9ConexãoSaiba o que verificações mais robustas acrescentam
- 10ExplicaçãoColoque o valor esperado fora do valor suspeito
- 11ExemploVerifique a origem do reparo
- 12DicaEncontre falhas ocultas enquanto ainda há cópias
- 13DesafioEscolha uma verificação para um bloco no lugar errado
- 14DesafioRepare antes que a redundância seja consumida
- 15RecapitulaçãoAcompanhe as evidências para um bloco retornado
Questões de Dispositivos de entrada e saída e RAID
Conjunto 1: Dispositivos, tempos e proteção de dados10 Questões de Prática
Questão 1 de 10
Mostrar respostaOcultar resposta
Questão 2 de 10
Mostrar respostaOcultar resposta
Questão 3 de 10
Mostrar respostaOcultar resposta
Questão 4 de 10
Mostrar respostaOcultar resposta
Questão 5 de 10
Mostrar respostaOcultar resposta
Questão 6 de 10
Mostrar respostaOcultar resposta
Questão 7 de 10
Mostrar respostaOcultar resposta
Questão 8 de 10
Mostrar respostaOcultar resposta
Questão 9 de 10
Mostrar respostaOcultar resposta
Questão 10 de 10
Mostrar respostaOcultar resposta
Conjunto 2: Filas, manutenção de memória flash e recuperação10 Questões de Prática
Salve esta aula para ver todas as respostas e praticar cada conjunto.
Questão 1 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 5 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 6 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 7 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 9 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 10 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Conjunto 3: Mapeie requisições e contabilize o trabalho oculto10 Questões de Prática
Salve esta aula para ver todas as respostas e praticar cada conjunto.
Questão 1 de 10
volatile para esse registrador, sozinho, pode ser insuficiente?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 5 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 6 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 7 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 9 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 10 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Conjunto 4: Explique os compromissos entre desempenho e integridade10 Questões de Prática
Salve esta aula para ver todas as respostas e praticar cada conjunto.
Questão 1 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 5 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 6 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 7 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 9 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 10 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Conjunto 5: Escolha projetos sob restrições combinadas10 Questões de Prática
Salve esta aula para ver todas as respostas e praticar cada conjunto.
Questão 1 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 5 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 6 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 7 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 9 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 10 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Travou em uma questão sua? Ajuda com Tarefas
Termos-Chave
A
Acesso direto à memória (DMA)
Acesso forçado à unidade (FUA)
Acesso sequencial
Agrupamento de interrupções
Amplificação de escrita
Armazenamento em camadas
Arranjo redundante de discos independentes (RAID)
Autorreparo
B
Bloco de apagamento
Bloqueio ativo (livelock)
C
C-LOOK
Cache de escrita de retorno (write-back)
Camada de blocos
Camada de tradução flash (FTL)
Ciclo de programação e apagamento (P/E)
Cilindro
Código de correção de erros (ECC)
Coleta de lixo (GC)
Colisão de somas de verificação
Consulta periódica (polling)
Corrupção silenciosa
D
Defasagem entre trilhas
Desempenho em regime permanente
Disco de reserva a quente (hot spare)
Dispositivo de blocos
Dispositivo de caracteres
Distribuição em faixas (striping)
Driver de dispositivo
E
Eficiência de capacidade
Endereço de bloco lógico (LBA)
Entrada e saída mapeada em memória (MMIO)
Entrada e saída mapeada em portas
in e out em x86.Entrada e saída programada (PIO)
Erro de leitura irrecuperável (URE)
Erro latente de setor (LSE)
Escalonamento antecipatório
Escrita de faixa completa
Escrita em destino incorreto
Escrita fragmentada (torn write)
Escrita perdida
Espelhamento
Espera híbrida
Etiqueta de endereço
Exposição a falhas durante a reconstrução
F
Firmware
G
Gravação por zonas
Gravações da capacidade total da unidade por dia (DWPD)
H
Hash criptográfico
I
Integridade de ponta a ponta
Interface de dispositivo
L
Lacuna de escrita (write hole)
Latência rotacional
Leitura, modificação e escrita
Lista de dispersão e reunião (scatter-gather)
LOOK
M
Memória flash NAND
Menor tempo de busca primeiro (SSTF)
Menor tempo de posicionamento primeiro (SPTF)
Mestre do barramento
Modelo de falha parcial
Modelo de falha por parada (fail-stop)
Modo degradado
MSI-X
N
Nivelamento de desgaste
Número esperado de erros
NVMe
O
Operações de entrada e saída por segundo (IOPS)
P
Página de memória flash
Página fixada na memória
Paridade XOR
Perturbação por leitura (read disturb)
Primeiro a chegar, primeiro a ser atendido (FCFS)
Profundidade da fila
R
RAID-0
RAID-4
RAID-5
RAID-6
RAID-10
Reconstrução do arranjo
Reconstrução em modo degradado
Registrador de comando
Registrador de estado
Registrador de notificação (doorbell)
S
Soma de verificação (checksum)
Soma de verificação armazenada no ponteiro do bloco pai
Soma de verificação de Fletcher
Soma de verificação por adição
Superprovisionamento (over-provisioning)
T
Tabela de mapeamento
Tamanho do fragmento de faixa
Tempo de busca
Tempo de transferência
Terabytes gravados (TBW)
Tratador de interrupções
Trilha
TRIM
U
Unidade de gerenciamento de memória de entrada e saída (IOMMU)
V
Varredura (SCAN)
Varredura circular (C-SCAN)
Varredura de integridade (scrubbing)
Vazão (throughput)
Verificação de redundância cíclica (CRC)
Verificação por leitura após escrita
Sobre esta aula
Crie seus próprios Materiais de Estudo
Transforme suas anotações, slides e documentos em Guias de Estudo, Questões de Prática, Flashcards e mais 6 ferramentas.