¿Puede Linux borrar memoria?

10

¿Linux tiene un mecanismo para "borrar" la memoria? Por ejemplo, ¿probar la memoria y marcar las áreas como sucias si fallan para que el sistema pueda continuar operando "de manera segura" incluso con los chips de memoria ram instalados?

Cabeza de cera
fuente

Respuestas:

2

La respuesta es sí, y se realiza de forma transparente (siempre que tenga memoria ECC para detectar errores, y su versión de kernel sea al menos 2.6.30 para continuar funcionando de manera segura).

Básicamente, su memoria se verifica en cada lectura del procesador, y se limpia periódicamente *, para verificar la coherencia con los Códigos de corrección de errores (ECC). Si se produce un error, obtiene una excepción de verificación de máquina, que luego se registra y se captura por mcelog ( http://www.mcelog.org/ ).

Si su error fue corregible, incrementa un contador de "cubeta con fugas", lo que hace que un DIMM físico que falla con demasiada frecuencia sea reemplazado de manera transparente por otro. Por lo tanto, su página de memoria se copia en una nueva ubicación, su dirección de memoria virtual se actualiza para que apunte a la nueva página y el sistema operativo marca la página anterior para que ya no se use.

Esto se llama "soft-offline" en Linux (y el retiro de la página de memoria en Solaris, no sé acerca de otros sistemas operativos).

Sin embargo, si su error no fue corregible, sucede lo que se llama "línea dura", es decir, su página de memoria se elimina de la administración de memoria del sistema operativo normal y su aplicación se anula (NB: por alguna señal SIGBUS atrapable que le dice dónde el error ocurrió, pero es bastante raro que no le importe y trate de atraparlo). Si su página de memoria está asignada desde un archivo y limpia, el sistema operativo también puede volver a cargarla de forma transparente en otra ubicación física en lugar de matar el proceso.

Puede leer más sobre mcelog, hay muchas opciones de configuración, puede activar otros comportamientos, opciones y otras pistas sobre qué leer y cómo asegurarse de que mcelog se esté ejecutando en su sistema.


* Scrubbing, o "Patrol Scrubbing" consiste en leer la memoria, verificar si hay errores en el ECC y sobrescribir con las palabras de memoria corregidas cuando se descubre un error. El término limpieza de patrulla se usa por oposición a la sobrescritura de datos incorrectos sobre errores en las lecturas de memoria, lo que a veces se denomina "limpieza por demanda". El fregado es un procedimiento de hardware que se puede habilitar, generalmente a través del BIOS.

Cimbali
fuente
1
Esto solo se aplica si tiene la memoria ECC más cara.
psusi
Esto se aplica a todos los recuerdos con ECC. Ya sea paridad (pero luego no puede corregir), SECDED, el Chipkill más caro o alguno más nuevo. DDR1 ya podría implementar ECC, pero todo dependería del modelo real que utilice. El mercado "doméstico" tradicionalmente ha necesitado menos resistencia, pero las supercomputadoras llevan más de 20 años equipadas con ellos: los servidores están en el medio.
Cimbali
1
Quise decir que la memoria ECC es más costosa (que no ECC) y que la mayoría de la gente no la tiene.
psusi
1
Bueno, "la mayoría de la gente" es bastante vaga. Si es común pagar el precio de la inversión y el poder depende del mercado, como dije. Mi laptop Dell promedio, que ahora tiene 2 años, está equipada con ella (estándar, no se requieren opciones especiales). Se está volviendo cada vez más común, porque la miniaturización de las características hace que los DIMM sean más sensibles a diversas radiaciones.
Cimbali
1
Cimbali, que hace "Patrol Scrubbing" (en sistemas con memoria ECC): firmware de BIOS (probablemente en modo smm, transparente para el kernel del sistema operativo) o kernel de Linux en algún modo de software (¿qué módulo realiza el scrolbing de patrulla?) La memoria ECC no verificó sumas de ecc; para verificar ecc, se deben leer los datos (y el esquema ecc en el controlador de memoria verificará la suma). Parte de la memoria se lee con frecuencia (mediante programas normales en la CPU), otra puede no leerse durante semanas. La búsqueda de patrullas leerá toda la memoria todos los días (intel) o cada 1-48 horas para hacer la verificación ecc - electronics.stackexchange.com/q/73546#comment911379_73573
osgx
7

Esto es realmente una mala idea. La memoria no se puede probar de manera confiable en un barrido rápido. Esta es la razón por la cual el software como memtest86 usa múltiples pases con diferentes patrones de bits para probar la memoria. Solución:

  1. Pruebe la memoria con memtest86 , preferiblemente una prueba larga, déjela funcionando durante la noche, tomará mucho tiempo.

  2. Si se detecta mala memoria, use el memmap parámetro del kernel para forzar al kernel a no usar esa memoria:

   memmap = nn [KMG] $ ss [KMG]
            [KNL, ACPI] Marque la memoria específica como reservada.
            Región de memoria a utilizar, de ss a ss + nn.
            Ejemplo: excluir memoria de 0x18690000-0x1869ffff
                     memmap = 64K $ 0x18690000
                     o
                     memmap = 0x10000 $ 0x18690000

Además, puede usar la memoria ECC que corregirá errores de 1 bit y detectará errores de 2 bits en su memoria automáticamente (y recibirá mensajes de registro del kernel sobre problemas de memoria no corregibles si ocurren)

haimg
fuente
Gracias por el consejo sobre esos parámetros del núcleo. ¿Crees que puedes aclarar por qué es una idea tan mala y por qué no puedes verificar una porción de memoria usando los mismos métodos que memtest86 (+)? Soy consciente de que las pruebas más confiables requieren más tiempo de CPU (y probablemente pedazos más grandes de RAM de una vez también), pero ¿por qué esto debería ser un obstáculo? El tiempo de CPU puede no ser un problema si se extiende durante un período suficientemente largo y, además, la CPU múltiple se está volviendo cada vez más convencional.
Waxhead
Bueno, técnicamente, si se hace durante un período de tiempo suficientemente largo, esto puede ser posible. Pero el cuello de botella aquí no es CPU (s), sino bus de memoria, y por supuesto "envenena" el caché de memoria de su CPU. No había conocimiento de tal módulo del núcleo, y la idea parece muy frágil para mí (la orquestación de la escritura patrón repetido a una región arbitraria de la memoria en un sistema real, etc.)
haimg
haimg: pregunta: ¿administrará el VFS la paginación para esta memoria reservada? Creo que no puede, ya que no será visible para él.
Jay D
1
La limpieza de memoria de @Waxhead generalmente se realiza a nivel de BIOS utilizando hardware. Si está habilitado, debería encontrar opciones para la búsqueda de patrullaje y la búsqueda de demanda. Si la integridad de la memoria es importante para usted, lo que seguramente es si está utilizando la memoria ECC, entonces vale la pena el pequeño éxito en el rendimiento obtenido al habilitar estas opciones.
Ian
1
Creo que podría ser interesante incluir una referencia al módulo del kernel badram aquí. Utiliza memtest86 como usted propone, pero en lugar de evitar que el kernel use memoria defectuosa, lo asigna al kernel para que no lo use, garantizando efectivamente que ni el kernel ni sus aplicaciones se ejecuten en esa memoria.
Cimbali
2

La publicación y la respuesta malinterpretan el problema. El borrado de memoria está destinado a evitar que los errores de un solo bit corregibles se conviertan en errores dobles no corregibles. El depurador simplemente toda la memoria física (lo que obliga a fallas de caché para hacerlo) ocasionalmente. Si hay errores de un solo bit, se corregirán (y la corrección debe reescribir el valor correcto mediante una comparación y un intercambio), eliminando así el error.

De lo contrario, si se produce un segundo error en una palabra que ya tiene un error, la palabra completa será incorrecta y el sistema operativo tendrá que hacer algo drástico.

La limpieza es importante porque sin ella, la memoria que se lee pero no se escribe (como las páginas de códigos) puede acumular errores con el tiempo.

Larry Stewart
fuente
¿Por qué cree que la respuesta no entendió el problema cuando se marcó como la respuesta?
Dave
1
A pesar de la respuesta de Dave, Larry está en lo cierto, la respuesta / no / entiende mal la pregunta. La pregunta pregunta si Linux puede hacer un barrido de memoria, usado, como Larry explica cuidadosamente, para evitar que los errores de un solo bit detectados y corregidos por ECC h / w se conviertan en errores de 2 bits no corregibles. La respuesta habla sobre cómo detectar esos errores en primer lugar usando una aplicación de software.
Ian
Creo que no entiendes el propósito aquí. Por supuesto, tiene razón en su descripción acerca de la limpieza; sin embargo, si, por ejemplo, ejecuta un servidor de archivos (no crítico) en una memoria RAM no ecc y tiene ciclos de CPU de sobra, parece una buena idea para tarde o temprano poder detectar corruptos memoria y marcarlo como malo y saberlo que no ser consciente de un chip de memoria defectuoso. Quizás una mejor redacción sería la validación / verificación de memoria. Tal vez no sea fregar técnicamente, pero sigue siendo una forma viable de reducir el daño causado por una memoria potencialmente mala.
Waxhead