Memória com código de correção de erro (memória ECC) é um tipo de armazenamento de dados de computador que usa um código de correção de erro (ECC) para detectar e corrigir corrupção de dados de n bits que ocorre na memória.
Tipicamente, a memória ECC mantém um sistema de memória imune a erros de bit único: os dados lidos de cada palavra são sempre os mesmos que foram escritos nela, mesmo que um dos bits realmente armazenados tenha sido invertido para o estado errado. A maioria das memórias não ECC não consegue detectar erros, embora algumas memórias não ECC com suporte a paridade permitam detecção, mas não correção.
A memória ECC é usada na maioria dos computadores onde a corrupção de dados não pode ser tolerada, como aplicações de controle industrial, bancos de dados críticos e caches de memória de infraestrutura.
Contexto: erros de memória
Conceito
Os códigos de correção de erro protegem contra corrupção de dados não detectada e são usados em computadores onde essa corrupção é inaceitável, exemplos sendo aplicações científicas e financeiras, ou em servidores de banco de dados e arquivos. O ECC também pode reduzir o número de falhas em aplicações servidoras multi-usuário e sistemas de máxima disponibilidade.
Interferência elétrica ou magnética dentro de um sistema de computador pode fazer com que um único bit de memória de acesso aleatório dinâmica (DRAM) mude espontaneamente para o estado oposto. Inicialmente, pensava-se que isso se devia principalmente a partículas alfa emitidas por contaminantes no material de encapsulamento dos chips, mas pesquisas mostraram que a maioria dos erros brandos únicos em chips DRAM ocorre como resultado de radiação de fundo, principalmente nêutrons de secundários de raios cósmicos, que podem alterar o conteúdo de uma ou mais células de memória ou interferir na circuitaria usada para ler ou escrever nelas. Assim, as taxas de erro aumentam rapidamente com o aumento da altitude; por exemplo, em comparação com o nível do mar, a taxa de fluxo de nêutrons é 3,5 vezes maior a 1,5 km e 300 vezes maior a 10–12 km (a altitude de cruzeiro de aviões comerciais). Como resultado, sistemas que operam em altas altitudes exigem provisões especiais para confiabilidade.
Como exemplo, a sonda espacial Cassini–Huygens, lançada em 1997, continha dois gravadores de voo idênticos, cada um com 2,5 gigabits de memória na forma de matrizes de chips DRAM comerciais. Devido à funcionalidade EDAC embutida, a telemetria de engenharia da sonda relatava o número de erros de bit único por palavra (corrigíveis) e erros de bit duplo por palavra (não corrigíveis). Durante os primeiros 2,5 anos de voo, a sonda relatou uma taxa de erro de bit único quase constante de cerca de 280 erros por dia. No entanto, em 6 de novembro de 1997, durante o primeiro mês no espaço, o número de erros aumentou mais de quatro vezes naquele único dia. Isso foi atribuído a um evento de partícula solar que havia sido detectado pelo satélite GOES 9.
Havia alguma preocupação de que, à medida que a densidade da DRAM aumentasse ainda mais e, portanto, os componentes nos chips ficassem menores, enquanto as tensões operacionais continuassem a cair, os chips DRAM seriam afetados por essa radiação com mais frequência, já que partículas de menor energia poderiam alterar o estado de uma célula de memória. Por outro lado, células menores criam alvos menores, e mudanças para tecnologias como SOI podem tornar as células individuais menos suscetíveis e, assim, neutralizar ou até reverter essa tendência. Estudos recentes mostram que as perturbações de evento único devido à radiação cósmica têm caído drasticamente com a geometria do processo, e as preocupações anteriores sobre o aumento das taxas de erro de células de bit são infundadas.
Taxas de erro no mundo real e consequências Trabalhos publicados entre 2007 e 2009 mostraram taxas de erro amplamente variáveis, com mais de 7 ordens de magnitude de diferença, variando de , aproximadamente um erro de bit por hora por gigabyte de memória, a , aproximadamente um erro de bit por milênio por gigabyte de memória. Um estudo em larga escala baseado no grande número de servidores do Google foi apresentado na conferência SIGMETRICS/Performance '09. A taxa de erro real encontrada foi várias ordens de magnitude maior do que os estudos anteriores de pequena escala ou laboratoriais, com entre 25.000 () e 70.000 (, ou 1 erro de bit por gigabyte de RAM a cada 1,8 horas) erros por bilhão de horas de dispositivo por megabit. Mais de 8% dos módulos de memória DIMM foram afetados por erros por ano.
A consequência de um erro de memória depende do sistema. Em sistemas sem ECC, um erro pode levar a uma falha ou à corrupção de dados; em sites de produção em larga escala, erros de memória são uma das causas mais comuns de falhas de máquina. Erros de memória podem causar vulnerabilidades de segurança. Um erro de memória pode não ter consequências se alterar um bit que não cause mau funcionamento observável nem afete os dados usados em cálculos ou salvos. Um estudo de simulação de 2010 mostrou que, para um navegador web, apenas uma pequena fração dos erros de memória causou corrupção de dados, embora, como muitos erros de memória sejam intermitentes e correlacionados, os efeitos dos erros de memória foram maiores do que o esperado para erros brandos independentes.
Alguns testes concluem que o isolamento das células de memória DRAM pode ser contornado por efeitos colaterais não intencionais de acessos especialmente criados para células adjacentes. Assim, acessar dados armazenados na DRAM faz com que as células de memória vazem suas cargas e interajam eletricamente, como resultado da alta densidade de células na memória moderna, alterando o conteúdo de linhas de memória vizinhas que não foram realmente endereçadas no acesso original à memória. Este efeito é conhecido como row hammer, e também foi usado em alguns exploits de escalonamento de privilégios em segurança de computadores.
Um exemplo de um erro de bit único que seria ignorado por um sistema sem verificação de erros, paralisaria uma máquina com verificação de paridade ou seria corrigido invisivelmente pelo ECC: um único bit fica preso em 1 devido a um chip defeituoso, ou torna-se 1 devido à radiação de fundo ou cósmica; uma planilha armazenando números em formato ASCII é carregada, e o caractere "8" (valor decimal 56 na codificação ASCII) é armazenado no byte que contém o bit preso em sua posição de bit mais baixa; então, uma alteração é feita na planilha e ela é salva. Como resultado, o "8" (0011 1000 binário) silenciosamente se torna um "9" (0011 1001).
Soluções Várias abordagens foram desenvolvidas para lidar com inversões indesejadas de bits, incluindo programação consciente de imunidade, memória com paridade de RAM e memória com ECC.
Este problema pode ser mitigado usando módulos DRAM que incluem bits de memória extras e controladores de memória que exploram esses bits. Esses bits extras são usados para registrar paridade ou para usar um código de correção de erro (ECC). A paridade permite a detecção de todos os erros de bit único (na verdade, qualquer número ímpar de bits errados), mas não a correção, então o sistema tem que continuar (apenas sinalizando o problema) ou parar. Códigos de correção de erro permitem que mais erros sejam corrigidos; quanto depende do tipo exato de memória usada.
A memória DRAM pode fornecer proteção aumentada contra erros brandos confiando em códigos de correção de erro. Essa memória de correção de erros, conhecida como memória ECC ou protegida por EDAC, é particularmente desejável para aplicações altamente tolerantes a falhas, como servidores, bem como aplicações espaciais devido ao aumento da radiação.
Alguns sistemas também "limpam" a memória, lendo periodicamente todos os endereços e reescrevendo versões corrigidas, se necessário, para remover erros brandos acumulados.
Esquemas
Subsistemas de memória modernos podem fornecer integridade de dados por meio de um ou mais dos seguintes esquemas:
Pelo controlador de memória: Esses esquemas fazem o controlador de memória enviar ou receber dados extras para o chip. **ECC de banda lateral** (SBECC) é a abordagem tradicional de servidores. Os ECCs são armazenados em chips DRAM separados e transmitidos com os dados através de canais adicionais (bits extras por palavra). O controlador de memória calcula os ECCs ao escrever, corrige erros ao ler e relata correções e detecções de erros ao sistema operacional ou firmware (UEFI ou BIOS). **ECC em linha** ou **ECC dentro da banda** (IBECC) não usa largura de canal extra e, como resultado, é compatível com módulos de memória "não ECC". O controlador de memória particiona o espaço físico. Em um estilo de implementação representado pelo IBECC da Intel e pelo processador RTOS da TI, o espaço de endereços físicos é particionado de modo que haja uma porção de memória reservada. Cada comando de escrita precisaria ser acompanhado por um comando de escrita adicional, e o mesmo se aplica a comandos de leitura. Isso resulta em aproximadamente o dobro da latência da memória. Especificamente, a implementação da Intel tem impacto mínimo no desempenho em navegação web e aplicações de produtividade, mas pode reduzir o desempenho em até 25% em cargas de trabalho de jogos e edição de vídeo. É teoricamente possível simplesmente particionar o canal existente (digamos, 64 bits em 56 bits de dados e 8 bits de verificação) para fornecer um análogo do ECC de banda lateral. Uma leitura superficial da descrição da Synopsys sobre "ECC em linha" mencionando um particionamento do canal de 16 bits por chip levaria a esse entendimento, mas isso não é muito comum em produtos comerciais. Pelo chip de memória: **ECC no dado** (ODECC), também chamado de ECC na DRAM ou ECC integrado, é obrigatório em todos os módulos de memória DDR5 e LPDDR6 para mitigar as maiores taxas de erro associadas a células de memória menores. Armazenamento ECC adicional e circuitos de correção de erro são embutidos nos chips DRAM e são invisíveis para o controlador de memória. Erros de transmissão não são corrigidos, pois os ECCs não são enviados com os dados, e correções e detecções de erros não são relatadas. Latência adicional é introduzida apenas quando a correção de erros é necessária. Por ambos **ECC de link** adiciona correção de erros ao link de dados, mas não ao armazenamento subjacente. O controlador de memória calcula e transmite ECCs com os dados ao escrever na DRAM, que verifica e corrige erros. Ao ler, a DRAM calcula ECCs que o controlador de memória então verifica. É uma parte do LPDDR5. Enquanto o ECC de banda lateral fornece automaticamente redundância de nível de link, o ECC em banda/inline usando reserva de espaço de endereços físico e o ECC no dado não fornecem; eles precisariam de uma camada de ECC de link para se proteger contra corrupção na transmissão.
Relato de erros Muitas implementações iniciais de memória ECC, assim como o ECC no dado, mascaram erros corrigíveis, agindo "como se" o erro nunca tivesse ocorrido, e relatam apenas erros não corrigíveis. Implementações modernas registram tanto erros corrigíveis (CE) quanto erros não corrigíveis (UE). Algumas pessoas substituem proativamente módulos de memória que exibem altas taxas de erro, a fim de reduzir a probabilidade de eventos de erro não corrigíveis.Doug Thompson, Mauro Carvalho Chehab. "EDAC – Error Detection And Correction". . 2005–2009. "O objetivo do módulo do kernel 'edac' é detectar e relatar erros que ocorrem no sistema de computador rodando sob linux."
Implementações
Memória de servidor padrão: SECDEC de banda lateral