La memoria de código de corrección de errores ( memoria ECC ) es un tipo de almacenamiento de datos informáticos que utiliza un código de corrección de errores [a] (ECC) para detectar y corregir la corrupción de datos de n bits que se produce en la memoria.
Por lo general, la memoria ECC mantiene un sistema de memoria inmune a los errores de un solo bit: los datos que se leen de cada palabra son siempre los mismos que los datos que se escribieron en ella, incluso si uno de los bits realmente almacenados se ha invertido al estado incorrecto. La mayoría de las memorias no ECC no pueden detectar errores, aunque algunas memorias no ECC con soporte de paridad permiten la detección pero no la corrección.
La memoria ECC se utiliza en la mayoría de las computadoras donde no se puede tolerar la corrupción de datos, como aplicaciones de control industrial, bases de datos críticas y cachés de memoria de infraestructura.
Los códigos de corrección de errores protegen contra la corrupción de datos no detectada y se utilizan en computadoras donde dicha corrupción es inaceptable, por ejemplo, en aplicaciones informáticas científicas y financieras, o en servidores de archivos y bases de datos . Los códigos de corrección de errores también pueden reducir la cantidad de fallas en aplicaciones de servidores multiusuario y sistemas de máxima disponibilidad.
Las interferencias eléctricas o magnéticas dentro de un sistema informático pueden hacer que un solo bit de la memoria dinámica de acceso aleatorio (DRAM) cambie espontáneamente al estado opuesto. Inicialmente se pensó que esto se debía principalmente a las partículas alfa emitidas por contaminantes en el material de empaquetado del chip, pero las investigaciones han demostrado que la mayoría de los errores suaves puntuales en los chips DRAM ocurren como resultado de la radiación de fondo , principalmente neutrones de rayos cósmicos secundarios, que pueden cambiar el contenido de una o más celdas de memoria o interferir con los circuitos utilizados para leer o escribir en ellas. [2] Por lo tanto, las tasas de error aumentan rápidamente con el aumento de la altitud; por ejemplo, en comparación con el nivel del mar, la tasa de flujo de neutrones es 3,5 veces mayor a 1,5 km y 300 veces mayor a 10-12 km (la altitud de crucero de los aviones comerciales). [3] Como resultado, los sistemas que operan a grandes altitudes requieren disposiciones especiales para la confiabilidad.
Como ejemplo, la nave espacial Cassini-Huygens , lanzada en 1997, contenía dos registradores de vuelo idénticos, cada uno con 2,5 gigabits de memoria en forma de matrices de chips DRAM comerciales. Debido a la funcionalidad EDAC incorporada , la telemetría de ingeniería de la nave espacial informó el número de errores (corregibles) de un solo bit por palabra y errores (incorregibles) de dos bits por palabra. Durante los primeros 2,5 años de vuelo, la nave espacial informó una tasa de error de un solo bit casi constante de aproximadamente 280 errores por día. Sin embargo, el 6 de noviembre de 1997, durante el primer mes en el espacio, el número de errores aumentó en más de un factor de cuatro en ese único día. Esto se atribuyó a un evento de partículas solares que había sido detectado por el satélite GOES 9. [ 4]
Existía cierta preocupación de que, a medida que aumenta la densidad de DRAM y, por lo tanto, los componentes de los chips se vuelven más pequeños, mientras que los voltajes operativos continúan cayendo, los chips DRAM se verán afectados por dicha radiación con mayor frecuencia, ya que las partículas de menor energía podrán cambiar el estado de una celda de memoria. [3] Por otro lado, las celdas más pequeñas son objetivos más pequeños, y los cambios en tecnologías como SOI pueden hacer que las celdas individuales sean menos susceptibles y, por lo tanto, contrarrestar, o incluso revertir, esta tendencia. Estudios recientes [5] muestran que las alteraciones de un solo evento debido a la radiación cósmica han estado disminuyendo drásticamente con la geometría del proceso y las preocupaciones anteriores sobre el aumento de las tasas de error de celda de bit son infundadas.
Los trabajos publicados entre 2007 y 2009 mostraron tasas de error muy variables con más de 7 órdenes de magnitud de diferencia, que van desde 10 −10 error/bit·h (aproximadamente un error de bit por hora por gigabyte de memoria) a 10 −17 error/bit·h (aproximadamente un error de bit por milenio por gigabyte de memoria). [5] [6] [7] En la conferencia SIGMETRICS/Performance '09 se presentó un estudio a gran escala basado en la gran cantidad de servidores de Google . [6] La tasa de error real encontrada fue varios órdenes de magnitud mayor que la de los estudios previos a pequeña escala o de laboratorio, con entre 25.000 (2,5 × 10 −11 error/bit·h) y 70.000 (7,0 × 10 −11 error/bit·h, o 1 error de bit por gigabyte de RAM por 1,8 horas) errores por cada mil millones de horas de dispositivo por megabit. Más del 8% de los módulos de memoria DIMM se vieron afectados por errores por año.
Las consecuencias de un error de memoria dependen del sistema. En sistemas sin ECC, un error puede provocar un fallo o la corrupción de los datos; en los sitios de producción a gran escala, los errores de memoria son una de las causas de hardware más comunes de fallos de las máquinas. [6] Los errores de memoria pueden causar vulnerabilidades de seguridad. [6] Un error de memoria puede no tener consecuencias si cambia un bit que no causa un mal funcionamiento observable ni afecta a los datos utilizados en los cálculos o guardados. Un estudio de simulación de 2010 mostró que, para un navegador web, solo una pequeña fracción de los errores de memoria causaban corrupción de datos, aunque, como muchos errores de memoria son intermitentes y correlacionados, los efectos de los errores de memoria fueron mayores de lo que se esperaría de errores de software independientes. [8]
Algunas pruebas concluyen que el aislamiento de las celdas de memoria DRAM puede ser sorteado por efectos secundarios no deseados de accesos especialmente diseñados a celdas adyacentes. Así, el acceso a los datos almacenados en DRAM hace que las celdas de memoria pierdan sus cargas e interactúen eléctricamente, como resultado de la alta densidad de celdas en la memoria moderna, alterando el contenido de las filas de memoria cercanas que en realidad no fueron abordadas en el acceso a la memoria original. Este efecto se conoce como row hammer , y también se ha utilizado en algunos exploits de seguridad informática de escalada de privilegios . [9] [10]
Un ejemplo de un error de un solo bit que sería ignorado por un sistema sin comprobación de errores, que detendría una máquina con comprobación de paridad o que sería corregido invisiblemente por ECC: un solo bit se queda atascado en 1 debido a un chip defectuoso o cambia a 1 debido a la radiación de fondo o cósmica; se carga una hoja de cálculo que almacena números en formato ASCII y el carácter "8" (valor decimal 56 en la codificación ASCII) se almacena en el byte que contiene el bit atascado en su posición de bit más baja; luego, se realiza un cambio en la hoja de cálculo y se guarda. Como resultado, el "8" (0011 100 0 binario) se ha convertido silenciosamente en un "9" (0011 100 1 ).
Se han desarrollado varios enfoques para lidiar con cambios de bits no deseados, incluida la programación consciente de la inmunidad, la memoria de paridad RAM y la memoria ECC .
Este problema se puede mitigar utilizando módulos DRAM que incluyan bits de memoria adicionales y controladores de memoria que aprovechen estos bits. Estos bits adicionales se utilizan para registrar la paridad o para utilizar un código de corrección de errores (ECC). La paridad permite la detección de todos los errores de un solo bit (en realidad, cualquier número impar de bits erróneos). El código de corrección de errores más común, un código de Hamming de corrección de un solo error y detección de doble error (SECDED) , permite corregir un error de un solo bit y (en la configuración habitual, con un bit de paridad adicional) detectar errores de doble bit. Chipkill ECC es una versión más eficaz que también corrige errores de múltiples bits, incluida la pérdida de un chip de memoria completo.
Seymour Cray dijo la famosa frase " la paridad es para los agricultores " cuando se le preguntó por qué lo había dejado fuera del CDC 6600. [ 11] Más tarde, incluyó la paridad en el CDC 7600 , lo que provocó que los expertos comentaran que "aparentemente muchos agricultores compran computadoras". La IBM PC original y todas las PC hasta principios de la década de 1990 usaban la verificación de paridad. [12] Las posteriores, en su mayoría, no lo hacían.
Un controlador de memoria con capacidad ECC puede generalmente [a] detectar y corregir errores de un solo bit por palabra [b] (la unidad de transferencia de bus ), y detectar (pero no corregir) errores de dos bits por palabra. El BIOS de algunas computadoras, cuando se combina con sistemas operativos como algunas versiones de Linux , BSD y Windows ( Windows 2000 y posteriores [13] ), permite contar los errores de memoria detectados y corregidos, en parte para ayudar a identificar módulos de memoria defectuosos antes de que el problema se vuelva catastrófico.
Algunos chips DRAM incluyen circuitos de corrección de errores "internos" en el chip, que permiten que los sistemas con controladores de memoria no ECC aún obtengan la mayoría de los beneficios de la memoria ECC. [14] [15] En algunos sistemas, se puede lograr un efecto similar utilizando módulos de memoria EOS .
La detección y corrección de errores depende de una expectativa de los tipos de errores que ocurren. Implícitamente, se supone que el fallo de cada bit en una palabra de memoria es independiente, lo que resulta en la improbabilidad de dos errores simultáneos. Esto solía ser el caso cuando los chips de memoria tenían un ancho de un bit, lo que era típico en la primera mitad de la década de 1980; desarrollos posteriores trasladaron muchos bits al mismo chip. Esta debilidad se soluciona con varias tecnologías, entre ellas Chipkill de IBM , Extended ECC de Sun Microsystems , Chipspare de Hewlett-Packard y Single Device Data Correction (SDDC) de Intel .
La memoria DRAM puede proporcionar una mayor protección contra errores leves al confiar en códigos de corrección de errores. Dicha memoria de corrección de errores , conocida como memoria protegida por ECC o EDAC , es particularmente deseable para aplicaciones con alta tolerancia a fallas, como servidores, así como para aplicaciones de espacio profundo debido al aumento de la radiación . Algunos sistemas también " limpian " la memoria, leyendo periódicamente todas las direcciones y escribiendo versiones corregidas si es necesario para eliminar errores leves.
El entrelazado permite distribuir el efecto de un único rayo cósmico, lo que puede alterar varios bits físicamente vecinos en varias palabras al asociar bits vecinos a diferentes palabras. Siempre que una alteración de un único evento (SEU) no supere el umbral de error (por ejemplo, un único error) en cualquier palabra en particular entre accesos, se puede corregir (por ejemplo, mediante un código de corrección de errores de un único bit) y se puede mantener un sistema de memoria efectivamente libre de errores. [16]
Los controladores de memoria con corrección de errores tradicionalmente utilizan códigos Hamming , aunque algunos utilizan redundancia modular triple (TMR). Se prefiere este último porque su hardware es más rápido que el del esquema de corrección de errores de Hamming. [16] Los sistemas de satélites espaciales a menudo utilizan TMR, [17] [18] [19] aunque la RAM de los satélites generalmente utiliza corrección de errores de Hamming. [20]
Muchas de las primeras implementaciones de memoria ECC enmascaran los errores corregibles, actuando "como si" el error nunca hubiera ocurrido y solo informan los errores no corregibles. Las implementaciones modernas registran tanto los errores corregibles (CE) como los errores no corregibles (UE). Algunas personas reemplazan de manera proactiva los módulos de memoria que presentan altas tasas de error, con el fin de reducir la probabilidad de eventos de error no corregibles. [21]
Muchos sistemas de memoria ECC utilizan un circuito EDAC "externo" entre la CPU y la memoria. Algunos sistemas con memoria ECC utilizan sistemas EDAC internos y externos; el sistema EDAC externo debe estar diseñado para corregir ciertos errores que el sistema EDAC interno no puede corregir. [14] Las CPU de escritorio y servidor modernas integran el circuito EDAC en la CPU, [22] incluso antes del cambio hacia los controladores de memoria integrados en la CPU, que están relacionados con la arquitectura NUMA . La integración de la CPU permite un sistema EDAC sin penalización durante el funcionamiento sin errores.
A partir de 2009, los códigos de corrección de errores más comunes utilizan códigos Hamming o Hsiao que proporcionan corrección de errores de un solo bit y detección de errores de doble bit (SEC-DED). Se han propuesto otros códigos de corrección de errores para proteger la memoria: códigos de corrección de errores de doble bit y detección de errores de triple bit (DEC-TED), códigos de corrección de errores de un solo nibble y detección de errores de doble nibble (SNC-DND), códigos de corrección de errores Reed-Solomon , etc. Sin embargo, en la práctica, la corrección de múltiples bits se implementa generalmente intercalando múltiples códigos SEC-DED. [23] [24]
Las primeras investigaciones intentaron minimizar el área y los costos de retardo de los circuitos ECC. Hamming fue el primero en demostrar que los códigos SEC-DED eran posibles con una matriz de verificación particular. Hsiao demostró que una matriz alternativa con columnas de peso impar proporciona capacidad SEC-DED con menos área de hardware y un retraso más corto que los códigos SEC-DED de Hamming tradicionales. Investigaciones más recientes también intentan minimizar la potencia además de minimizar el área y el retraso. [25] [26] [27]
Muchas CPU utilizan códigos de corrección de errores en la memoria caché del chip , incluidos los procesadores Intel Itanium , Xeon , Core y Pentium (desde la microarquitectura P6 ) [28] [29] , los AMD Athlon , Opteron , todos los procesadores basados en Zen [ 30] y Zen+ [31] ( EPYC , EPYC Embedded, Ryzen y Ryzen Threadripper ) y el DEC Alpha 21264. [23] [32]
A partir de 2006 [actualizar], EDC/ECC y ECC/ECC son las dos técnicas de protección de errores de caché más comunes utilizadas en microprocesadores comerciales. La técnica EDC/ECC utiliza un código de detección de errores (EDC) en la caché de nivel 1. Si se detecta un error, los datos se recuperan de la caché de nivel 2 protegida por ECC. La técnica ECC/ECC utiliza una caché de nivel 1 protegida por ECC y una caché de nivel 2 protegida por ECC. [33] Las CPU que utilizan la técnica EDC/ECC siempre escriben todos los STORES en la caché de nivel 2, de modo que cuando se detecta un error durante una lectura de la caché de datos de nivel 1, se puede recuperar una copia de esos datos de la caché de nivel 2.
La memoria registrada o con buffer no es lo mismo que la memoria ECC; las tecnologías realizan funciones diferentes. Es habitual que la memoria utilizada en servidores sea tanto registrada, para permitir que se utilicen muchos módulos de memoria sin problemas eléctricos, como ECC, para la integridad de los datos. La memoria utilizada en ordenadores de sobremesa no suele ser ni una ni otra, por motivos económicos. Sin embargo, hay memoria ECC sin buffer (no registrada) disponible [34], y algunas placas base que no son para servidores admiten la funcionalidad ECC de dichos módulos cuando se utilizan con una CPU que admite ECC. [35] La memoria registrada no funciona de forma fiable en placas base sin circuitos de buffer, y viceversa.
En última instancia, existe un equilibrio entre la protección contra pérdidas inusuales de datos y un coste más elevado.
La memoria ECC suele tener un precio más elevado en comparación con la memoria que no es ECC, debido al hardware adicional necesario para producir módulos de memoria ECC y a los menores volúmenes de producción de memoria ECC y hardware de sistema asociado. Las placas base, los chipsets y los procesadores que admiten ECC también pueden ser más caros.
La compatibilidad con ECC varía entre los fabricantes de placas base, por lo que es posible que una placa base incompatible con ECC no reconozca la memoria ECC. La mayoría de las placas base y procesadores para aplicaciones menos críticas no están diseñados para admitir ECC. Algunas placas y procesadores habilitados para ECC pueden admitir ECC sin búfer (no registrado), pero también funcionarán con memoria no ECC; el firmware del sistema habilita la funcionalidad ECC si se instala memoria ECC.
El ECC puede reducir el rendimiento de la memoria en alrededor de un 2-3 por ciento en algunos sistemas, dependiendo de la aplicación y la implementación, debido al tiempo adicional necesario para que los controladores de memoria ECC realicen la comprobación de errores. [36] Sin embargo, los sistemas modernos integran las pruebas ECC en la CPU, sin generar retrasos adicionales en los accesos a la memoria siempre que no se detecten errores. [22] [37] [38] Este no es el caso del ECC en banda que almacena las tablas utilizadas para la protección en una región reservada de la memoria principal del sistema, [39] [40] compatible con Intel para Chromebooks , que mostró poco impacto en la navegación web y las tareas de productividad, pero provocó una reducción de hasta un 25% en los puntos de referencia de juegos y edición de vídeo . [41]
La memoria compatible con ECC puede contribuir a un consumo de energía adicional debido a los circuitos de corrección de errores.
{{cite book}}
: |journal=
ignorado ( ayuda )