Risposte:
La risposta è sì, ed è fatta in modo trasparente (purché tu abbia memoria ECC per rilevare errori, e la tua versione del kernel è almeno 2.6.30 per continuare a funzionare in sicurezza).
Fondamentalmente, la memoria viene controllata ad ogni lettura dal processore e periodicamente cancellata *, per verificare la coerenza con i codici di correzione errori (ECC). Se si è verificato un errore, si ottiene un'eccezione di controllo macchina, che viene quindi registrata e acquisita da mcelog ( http://www.mcelog.org/ ).
Se il tuo errore è stato corretto, incrementa un contatore "secchio che perde", che provoca un DIMM fisico che non riesce troppo spesso a essere sostituito in modo trasparente con un altro. Quindi la tua pagina di memoria viene copiata in una nuova posizione, il tuo indirizzo di memoria virtuale viene aggiornato per puntare alla nuova pagina e la vecchia pagina è contrassegnata dal sistema operativo come non più utilizzata.
Questo si chiama "soft-offlining" su Linux (e il ritiro delle pagine di memoria su Solaris, non conosco altri sistemi operativi).
Se il tuo errore non è stato corretto, tuttavia, si verifica ciò che viene chiamato "hard-offlining", ovvero la pagina di memoria viene rimossa dalla normale gestione della memoria del sistema operativo e l'applicazione viene uccisa (NB: da un segnale SIGBUS catchable che ti dice dove l'errore si è verificato, ma è abbastanza raro non preoccuparsene e provare a catturarlo). Se la tua pagina di memoria è mappata da un file e pulita, il sistema operativo può anche ricaricarla in modo trasparente in un'altra posizione fisica invece di interrompere il processo.
Puoi leggere di più su mcelog, ci sono molte opzioni di configurazione, puoi ottenere altri comportamenti da attivare, opzioni e altri suggerimenti su cosa leggere e su come assicurarti che mcelog sia in esecuzione sul tuo sistema.
* Scrubbing, o "Patrol Scrubbing" consiste nella lettura della memoria, nel controllo di ECC per errori e nella sovrascrittura con le parole di memoria corrette quando viene rilevato un errore. Il termine scrubbing di pattuglia viene utilizzato dall'opposizione alla sovrascrittura di dati errati su errori nelle letture della memoria, che a volte viene chiamato "Scrubbing della domanda". Lo scrubbing è una procedura hardware che può essere abilitata, generalmente tramite il BIOS.
Questa è in realtà una cattiva idea. La memoria non può essere testata in modo affidabile in una rapida scansione. Questo è il motivo per cui software come memtest86 utilizzano più passaggi con schemi di bit diversi per testare la memoria. Soluzione:
Testare la memoria con memtest86 , preferibilmente test lungo, lasciarlo in esecuzione durante la notte, ci vorrà molto tempo.
Se viene rilevata una cattiva memoria, utilizzare il memmap
parametro kernel per forzare il kernel a non utilizzare quella memoria:
memmap = nn [KMG] $ ss [KMG] [KNL, ACPI] Contrassegna la memoria specifica come riservata. Regione di memoria da utilizzare, da ss a ss + nn. Esempio: escludere la memoria da 0x18690000-0x1869ffff memmap = 64K $ 0x18690000 o memmap = 0x10000 $ 0x18690000
Inoltre, puoi usare la memoria ECC che correggerà gli errori a 1 bit e rileverà automaticamente gli errori a 2 bit nella tua memoria (e riceverai messaggi di log dal kernel su problemi di memoria non correggibili se si verificano)
Il post e la risposta fraintendono il problema. Lo scrubbing della memoria ha lo scopo di impedire che errori corretti a singolo bit si trasformino in doppi errori non corretti. Lo scrubber semplicemente tutta la memoria fisica (forzando la cache a non farlo) di tanto in tanto. Se si verificano errori a bit singolo, verranno corretti (e la correzione deve riscrivere il valore corretto utilizzando un confronto e scambio), eliminando così l'errore.
Altrimenti, se si verifica un secondo errore in una parola che ha già un errore, l'intera parola non sarà correggibile e il sistema operativo dovrà fare qualcosa di drastico.
Lo scrubbing è importante perché senza di esso, la memoria che viene letta ma non scritta (come le pagine di codice) può accumulare errori nel tempo.
Se si dispone di memoria ECC, è possibile dare un'occhiata più da vicino a https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-devices-edac . (Ho trovato "sdram_scrub_rate" particolarmente interessante.)
(Se questo collegamento si interrompe ad un certo punto (in realtà non dovrebbe) suggerirei di scaricare la documentazione Linux appropriata e cercare "scrub".)