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 10−10 erro/(bit·h), aproximadamente um erro de bit por hora por gigabyte de memória, a 10−17 erro/(bit·h), 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 (2,5×10−11 erro/(bit·h)) e 70.000 (7,0×10−11 erro/(bit·h), 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.

Implementações

Memória de servidor padrão: SECDEC de banda lateral A memória de servidor padrão é projetada para um código de Hamming de correção de erro único e detecção de erro duplo (SECDED), que permite que um erro de bit único seja corrigido e erros de bit duplo sejam detectados por palavra (a unidade de transferência do barramento). Desde o DDR SDRAM, a largura de barramento padrão (tamanho da palavra) no que diz respeito à memória é de 64 bits. Como resultado, a configuração típica entre DDR e DDR4 é uma palavra de 72 bits com 64 bits de dados e 8 bits de verificação. O DDR5 SDRAM divide o barramento em dois subcanais de 32 bits um tanto independentes, então a memória ECC usa 80 bits de largura total, divididos entre dois canais de 40 bits (32 dados, 8 verificação). O ECC também é usado com tamanhos menores e maiores. Um controlador de memória com capacidade ECC usa os bits adicionais para armazenar o código SECDED; a memória é responsável apenas por manter os bits extras. Desde o final da década de 1990, o controlador de memória também se comunica com o BIOS e mantém uma contagem de erros detectados e corrigidos, em parte para ajudar a identificar módulos de memória com falha antes que o problema se torne catastrófico. A leitura do contador é suportada em muitos sistemas graças ao padrão SMBIOS, estando disponível no Linux, BSD e Windows (Windows 2000 e posteriores).

Disposição dos bits A detecção e correção de erro depende de uma expectativa dos tipos de erros que ocorrem. Implicitamente, assume-se que a falha de cada bit em uma palavra de memória é independente, resultando na improbabilidade de dois erros simultâneos. Esse era o caso quando os chips de memória tinham um bit de largura, o que era típico na primeira metade da década de 1980; desenvolvimentos posteriores moveram muitos bits para o mesmo chip. Essa fraqueza é abordada por várias tecnologias, incluindo o Chipkill da IBM, o Extended ECC da Sun Microsystems, o Chipspare da Hewlett-Packard e o Single Device Data Correction (SDDC) da Intel, todos os quais garantem que a falha de um chip de memória afete apenas um bit por palavra ECC. Isso é conseguido espalhando os bits das palavras ECC entre os chips, uma forma de interleaving. Para garantir que cada chip receba apenas um bit por palavra, pode ser necessário intercalar entre vários módulos de memória (pentes). O interleaving em geral é uma técnica útil para se defender contra falhas correlacionadas de múltiplos bits. Um raio cósmico, por exemplo, pode perturbar múltiplos bits fisicamente vizinhos em várias palavras, associando bits vizinhos a palavras diferentes. Contanto que uma perturbação de evento único (SEU) não exceda o limiar de erro (por exemplo, um único erro) em qualquer palavra particular entre os acessos, ela pode ser corrigida (por exemplo, por um código de correção de erro de bit único), e um sistema de memória efetivamente livre de erros pode ser mantido.

Pelo próprio chip de memória Alguns chips DRAM incluem circuitos internos de correção de erros "no chip" ou "no dado", que permitem que sistemas com controladores de memória não ECC ainda obtenham a maioria dos benefícios da memória ECC. Em alguns sistemas, um efeito semelhante pode ser alcançado usando módulos de memória EOS. Como mencionado acima, o ECC no dado é obrigatório no DDR5 e LPDDR6. No entanto, sua falta de relato significa que muito pouco se sabe sobre o verdadeiro estado do chip de memória até que os erros excedam a capacidade do algoritmo no dado de realizar a correção; nenhuma informação sobre quanta "margem" existe é transmitida. Algoritmos sofisticados foram construídos para inferir a existência de erros corrigidos com base em erros não corrigidos.

Localização da correção Muitos sistemas de memória ECC usam um circuito EDAC "externo" entre a CPU e a memória. Alguns sistemas com memória ECC usam sistemas EDAC internos e externos; o sistema EDAC externo deve ser projetado para corrigir certos erros que o sistema EDAC interno não consegue corrigir. CPUs modernas de desktop e servidor integram o circuito EDAC na CPU, mesmo antes da mudança para controladores de memória integrados à CPU, que estão relacionados à arquitetura NUMA. A integração da CPU permite um sistema EDAC com penalidade zero durante a operação sem erros.

Algoritmos de correção Em 2009, os códigos de correção de erro mais comuns usavam códigos de Hamming ou Hsiao que fornecem correção de erro de bit único e detecção de erro de bit duplo (SEC-DED). Outros códigos de correção de erro foram propostos para proteger a memória – códigos de correção de erro duplo e detecção de erro triplo (DEC-TED), códigos de correção de nibble único e detecção de nibble duplo (SNC-DND), códigos de correção de erro Reed–Solomon, etc. No entanto, na prática, a correção de múltiplos bits é geralmente implementada por interleaving de múltiplos códigos SEC-DED. Pesquisas iniciais tentaram minimizar a área e os atrasos dos circuitos ECC. Hamming foi o primeiro a demonstrar que códigos SEC-DED eram possíveis com uma determinada matriz de verificação. Hsiao mostrou que uma matriz alternativa com colunas de peso ímpar fornece capacidade SEC-DED com menos área de hardware e menor atraso do que os códigos SEC-DED de Hamming tradicionais. Pesquisas mais recentes também tentam minimizar a energia, além de minimizar a área e o atraso.

Redundância em vez de ECC Controladores de memória de correção de erro tradicionalmente usam códigos de correção de erro otimizados em espaço, como Hamming e Hsiao. Se custo e espaço não forem preocupações, mas a velocidade for, uma redundância tripla modular (TMR) pode ser usada devido à sua implementação de hardware mais rápida. Sistemas de satélite espacial frequentemente usam TMR, embora a RAM de satélite geralmente use correção de erro de Hamming.

Computadores pessoais

Seymour Cray disse famosamente "paridade é para fazendeiros" quando questionado por que omitiu isso do CDC 6600. Mais tarde, ele incluiu a paridade no CDC 7600, o que fez com que os especialistas observassem que "aparentemente muitos fazendeiros compram computadores". O IBM PC original e todos os PCs até o início dos anos 1990 usavam verificação de paridade. Os posteriores, na maioria, não. A maioria dos caminhos de dados em um computador pessoal da década de 2020, incluindo PCIe, SATA, interconexão chip a chip e armazenamento em disco, têm alguma forma de proteção ECC. A falta de ECC na memória principal é comparativamente incomum, especialmente dado o tamanho e a maior probabilidade de corrupção. Linus Torvalds escreveu uma longa postagem em um fórum em 2021 atacando a escolha da Intel de abandonar o suporte a ECC em plataformas desktop, quando as plataformas desktop contemporâneas da AMD podiam usar (mas não necessariamente ativar o recurso ECC) DIMMs registrados com suporte ECC.

Cache Muitas CPUs usam códigos de correção de erro no cache no chip, incluindo os processadores Intel Itanium, Xeon, Core e Pentium (desde a microarquitetura P6), os processadores AMD Athlon, Opteron, todos os processadores baseados em Zen- e Zen+ (EPYC, EPYC Embedded, Ryzen e Ryzen Threadripper), e o DEC Alpha 21264. Desde 2006, EDC/ECC e ECC/ECC são as duas técnicas de proteção de erro de cache mais comuns usadas em microprocessadores comerciais. A técnica EDC/ECC usa um código de detecção de erro (EDC) no cache de nível 1. Se um erro é detectado, os dados são recuperados do cache de nível 2 protegido por ECC. A técnica ECC/ECC usa um cache de nível 1 protegido por ECC e um cache de nível 2 protegido por ECC. CPUs que usam a técnica EDC/ECC sempre escrevem (write-through) todos os STOREs para o cache de nível 2, de modo que, quando um erro é detectado durante uma leitura do cache de dados de nível 1, uma cópia desses dados pode ser recuperada do cache de nível 2.

Memória registrada

A memória registrada, ou bufferizada, não é o mesmo que ECC; as tecnologias executam funções diferentes. É comum que a memória usada em servidores seja registrada, para permitir o uso de muitos módulos de memória sem problemas elétricos, e ECC, para integridade dos dados.

Custo e benefícios O uso de ECC para aumentar a segurança dos dados geralmente vem com um custo maior, resultando em um desempenho marginalmente mais lento e custos de memória mais altos. A memória ECC é mais cara do que a memória não ECC devido à sua funcionalidade adicional de verificação de erros. O custo adicional da memória ECC para 1 GB em 2010 varia entre $0 e $15, dependendo do desempenho e do fabricante. O design do ECC e seu propósito em cargas de trabalho de alta confiabilidade o posicionaram para ter sobrecarga adicional para validação e os projetos adicionais de nível de circuito dentro da memória. As características mencionadas geralmente resultam em custos mais altos para a implementação do ECC. Os fabricantes de placas-mãe podem optar por adicionar compatibilidade com ECC de níveis variados, dependendo do segmento de mercado. Algumas placas e processadores habilitados para ECC são capazes de suportar ECC sem buffer (não registrado), mas também funcionarão com memória não ECC; o firmware do sistema ativa a funcionalidade ECC se a memória ECC estiver instalada. O ECC pode reduzir o desempenho da memória em cerca de 2–3 por cento em alguns sistemas, dependendo da aplicação e implementação, devido ao tempo adicional necessário para os controladores de memória ECC realizarem a verificação de erros. No entanto, sistemas modernos integram o teste ECC na CPU, não gerando atraso adicional aos acessos de memória, desde que nenhum erro seja detectado. Este não é o caso do ECC dentro da banda, que armazena tabelas usadas para proteção em uma região reservada da memória principal do sistema, suportado pela Intel para Chromebooks, que mostrou pouco impacto na navegação web e tarefas de produtividade, mas causou até 25% de redução nos benchmarks de jogos e edição de vídeo.

Notas

Referências

Ligações externas SoftECC: A System for Software Memory Integrity Checking A Tunable, Software-based DRAM Error Detection and Correction Library for HPC Detection and Correction of Silent Data Corruption for Large-Scale High-Performance Computing Single-Bit Errors: A Memory Module Supplier's perspective on cause, impact and detection Intel Xeon Processor E3 - 1200 Product Family Memory Configuration Guide