Linux può cancellare la memoria?


10

Linux ha un meccanismo per "cancellare" la memoria? ad es. testare la memoria e contrassegnare le aree come sporche se falliscono, in modo che il sistema possa continuare a funzionare "in sicurezza" anche con chip ram installati ?!

Risposte:


2

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.


1
Questo vale solo se si dispone della memoria ECC più costosa.
psusi,

Questo vale per tutte le memorie con ECC. Che si tratti di parità (ma non è possibile correggere), SECDED, il Chipkill più costoso o qualsiasi altro nuovo. DDR1 potrebbe già implementare ECC, ma tutto dipenderebbe dal modello effettivo utilizzato. Il mercato "domestico" ha tradizionalmente meno bisogno di resilienza, ma i supercomputer ne sono stati dotati per oltre 20 anni - i server sono nel mezzo.
Cimbali,

1
Volevo dire che la memoria ECC è più costosa (rispetto a quella non ECC) e quindi la maggior parte delle persone non ce l'ha.
psusi,

1
Beh, "la maggior parte delle persone" è piuttosto vaga. Se è comune pagare il prezzo in investimenti e potere dipende dal mercato, come ho detto. Il mio laptop Dell medio, che ora ha 2 anni, è equipaggiato con esso (standard, non sono richieste opzioni speciali). Sta diventando sempre più comune, perché la miniaturizzazione delle funzioni rende i DIMM più sensibili alle varie radiazioni.
Cimbali,

1
Cimbali, che esegue "Patrol Scrubbing" (su sistemi con memoria ECC) - firmware del BIOS (probabilmente in modalità smm, in modo trasparente per il kernel del sistema operativo) o kernel Linux in una modalità software (quale modulo esegue il pattugliamento della pattuglia)? La memoria ECC non ha verificato ecc somme; per controllare ecc, i dati devono essere letti (e lo schema ecc nel controller di memoria controllerà la somma). Parte della memoria viene letta spesso (dai normali programmi su CPU), un'altra potrebbe non essere letta per settimane. Patrol Scrubbing leggerà tutta la memoria ogni giorno (intel) o ogni 1-48 ore per eseguire il controllo ecc - electronics.stackexchange.com/q/73546#comment911379_73573
osgx

7

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:

  1. Testare la memoria con memtest86 , preferibilmente test lungo, lasciarlo in esecuzione durante la notte, ci vorrà molto tempo.

  2. 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)


Grazie per il suggerimento su quei parametri del kernel. Pensi di poter chiarire per favore perché questa è una cattiva idea e perché non puoi controllare un pezzo di memoria usando gli stessi metodi di memtest86 (+)? Sono consapevole che test più affidabili richiedono più tempo della CPU (e probabilmente anche pezzi più grandi di ram in una volta sola), ma perché questo dovrebbe essere un punto fermo? Il tempo della CPU potrebbe non essere un problema se si sviluppa su un periodo abbastanza lungo e oltre al multi cpu sta diventando sempre più mainstream.
Waxhead,

Bene tecnicamente, se fatto per un periodo di tempo abbastanza lungo, questo potrebbe essere possibile. Ma il collo di bottiglia qui non è CPU (s), ma bus di memoria e, naturalmente, "avvelenare" la cache di memoria della CPU. Non sarei a conoscenza di tale modulo del kernel, e l'idea mi sembra molto fragile (orchestrando ripetute sequenze di scrittura su una regione arbitraria di memoria su un sistema live, ecc.)
haimg

haimg: domanda: il VFS gestirà il paging per questa memoria riservata? penso che non possa in quanto non sarà visibile ad esso.
Jay D,

1
La pulizia della memoria di @Waxhead viene generalmente eseguita a livello di BIOS tramite hardware. Se abilitato, dovresti trovare le opzioni per lo scrubbing delle pattuglie e lo scrubbing della domanda. Se l'integrità della memoria è importante per te, come lo è sicuramente se stai utilizzando la memoria ECC, vale la pena il piccolo colpo di prestazioni ottenuto abilitando queste opzioni.
Ian,

1
Penso che potrebbe essere interessante includere qui un riferimento al modulo del kernel badram . Utilizza memtest86 come proposto, ma invece di astenersi dall'utilizzare memoria errata, lo alloca al kernel per non utilizzarlo, garantendo in modo efficace che né il kernel né le applicazioni vengano eseguite in quella memoria.
Cimbali,

2

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.


Perché pensi che la risposta mancata abbia compreso il problema quando è stata contrassegnata come risposta?
Dave,

1
Nonostante la risposta di Dave, Larry ha ragione, la risposta / fraintende la domanda. La domanda si chiede se Linux può eseguire uno scrub della memoria, usato, come spiega Larry con attenzione, per evitare che errori a singolo bit rilevati e corretti da ECC h / w si trasformino in errori a 2 bit non correggibili. La risposta parla di come rilevare quegli errori in primo luogo usando un'applicazione software.
Ian,

Penso che tu abbia frainteso lo scopo qui. Ovviamente hai ragione nella descrizione della pulizia, tuttavia se ad esempio esegui un file server (non critico) su ram non ecc. E hai cicli di CPU per risparmiare, sembra una buona idea prima o poi di essere in grado di rilevare corrotto memoria e contrassegnarlo come cattivo e sapere che non essere a conoscenza di un chip di memoria difettoso. Forse una formulazione migliore sarebbe la validazione / verifica della memoria. Forse non tecnicamente scrub, ma comunque un modo praticabile per ridurre il danno causato da una memoria potenzialmente dannosa.
Waxhead,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.