Kann Linux Speicher scrubben?

10

Hat Linux einen Mechanismus zum "Scrubben" des Speichers? zB den Speicher testen und Bereiche als verschmutzt markieren, wenn sie ausfallen, damit das System auch mit installierten fehlerhaften RAM-Chips "sicher" weiterarbeiten kann?!

Waxhead
quelle

Antworten:

2

Die Antwort lautet "Ja" und erfolgt transparent (vorausgesetzt, Sie verfügen über einen ECC-Speicher zum Erkennen von Fehlern und Ihre Kernel-Version ist mindestens 2.6.30, um weiterhin sicher zu arbeiten).

Grundsätzlich wird Ihr Speicher bei jedem Lesevorgang vom Prozessor überprüft und regelmäßig * gesäubert, um die Konsistenz mit den Fehlerkorrekturcodes (ECC) zu überprüfen. Wenn ein Fehler aufgetreten ist, erhalten Sie eine Maschinenprüfungsausnahme, die von mcelog ( http://www.mcelog.org/ ) protokolliert und abgerufen wird .

Wenn Ihr Fehler behoben werden konnte, wird ein "Leaky Bucket" -Zähler erhöht, wodurch ein zu oft fehlgeschlagenes physisches DIMM transparent durch ein anderes ersetzt wird. Auf diese Weise wird Ihre Speicherseite an einen neuen Speicherort kopiert, Ihre virtuelle Speicheradresse wird aktualisiert, um auf die neue Seite zu verweisen, und die alte Seite wird vom Betriebssystem als nicht mehr verwendbar markiert.

Dies wird unter Linux als "Soft-Off-Offing" bezeichnet (und die Stilllegung von Speicherseiten unter Solaris, ich weiß nichts über andere Betriebssysteme).

Wenn Ihr Fehler jedoch nicht behoben werden konnte, geschieht das, was als "Hard-Off-Offing" bezeichnet wird. Dies bedeutet, dass Ihre Speicherseite aus der normalen Speicherverwaltung des Betriebssystems entfernt wird und Ihre Anwendung beendet wird (Hinweis: durch ein abfangbares SIGBUS-Signal, das Ihnen sagt, wo Der Fehler ist aufgetreten, aber es ist selten genug, sich nicht darum zu kümmern und zu versuchen, ihn zu fangen. Wenn Ihre Speicherseite einer Datei zugeordnet und bereinigt ist, kann das Betriebssystem sie auch transparent an einem anderen physischen Speicherort neu laden, anstatt den Prozess abzubrechen.

Sie können mehr über mcelog lesen, es gibt viele Konfigurationsoptionen, Sie können andere Verhaltensweisen auslösen, Optionen und andere Hinweise dazu, was zu lesen ist und wie Sie sicherstellen können, dass mcelog auf Ihrem System ausgeführt wird.


* Scrubbing oder "Patrol Scrubbing" besteht darin, den Speicher zu lesen, ihn mit ECC auf Fehler zu prüfen und mit den korrigierten Speicherwörtern zu überschreiben, wenn ein Fehler entdeckt wird. Der Begriff Patrouillen-Scrubbing wird verwendet, um falsche Daten bei Fehlern beim Lesen des Speichers zu überschreiben, was manchmal als "Demand-Scrubbing" bezeichnet wird. Scrubbing ist eine Hardwareprozedur, die normalerweise über das BIOS aktiviert werden kann.

Cimbali
quelle
1
Dies gilt nur, wenn Sie über den teureren ECC-Speicher verfügen.
Psusi
Dies gilt für alle Speicher mit ECC. Sei es Parität (aber dann können Sie nicht korrigieren), SECDED, der teurere Chipkill oder neuere. DDR1 könnte ECC bereits implementieren, aber alles hängt davon ab, welches Modell Sie tatsächlich verwenden. Der "Heimat" -Markt benötigt traditionell weniger Ausfallsicherheit, aber Supercomputer sind seit über 20 Jahren damit ausgestattet - Server liegen dazwischen.
Cimbali
1
Ich meinte, ECC-Speicher ist teurer (als Nicht-ECC) und die meisten Leute haben ihn nicht.
Psusi
1
Nun, "die meisten Leute" sind ziemlich vage. Ob es üblich ist, den Preis für Investitionen und Strom zu zahlen, hängt, wie gesagt, vom Markt ab. Mein durchschnittlicher Dell-Laptop, der jetzt 2 Jahre alt ist, ist damit ausgestattet (Standard, keine besonderen Optionen erforderlich). Es wird immer häufiger, weil die Miniaturisierung von Merkmalen DIMMs für verschiedene Strahlungen sensibler macht.
Cimbali
1
Cimbali, wer macht "Patrol Scrubbing" (auf Systemen mit ECC-Speicher) - BIOS-Firmware (wahrscheinlich im SMM-Modus, transparent für den OS-Kernel) oder Linux-Kernel in einem Softwaremodus (welches Modul führt das Patrol Scrubbing durch)? Der ECC-Speicher hat die ecc-Summen nicht überprüft. Um ecc zu überprüfen, müssen Daten gelesen werden (und das ecc-Schema im Speichercontroller überprüft die Summe). Ein Teil des Speichers wird häufig gelesen (von normalen Programmen auf der CPU), ein anderer wird möglicherweise wochenlang nicht gelesen. Patrol Scrubbing liest jeden Tag den gesamten Speicher (Intel) oder alle 1-48 Stunden, um die Ecc-Überprüfung
durchzuführen
7

Das ist eigentlich eine schlechte Idee. Der Speicher kann nicht in einem schnellen Durchlauf zuverlässig getestet werden. Aus diesem Grund verwendet Software wie memtest86 mehrere Durchgänge mit unterschiedlichen Bitmustern, um den Speicher zu testen. Lösung:

  1. Testspeicher mit memtest86 , vorzugsweise langer Test, über Nacht laufen lassen, es wird lange dauern.

  2. Wenn ein fehlerhafter Speicher erkannt wird, verwenden Sie den memmap Kernel-Parameter , um den Kernel zu zwingen, diesen Speicher nicht zu verwenden:

   memmap = nn [KMG] $ ss [KMG]
            [KNL, ACPI] Markieren Sie einen bestimmten Speicher als reserviert.
            Zu verwendender Speicherbereich von ss bis ss + nn.
            Beispiel: Speicher von 0x18690000-0x1869ffff ausschließen
                     memmap = 64K $ 0x18690000
                     oder
                     memmap = 0x10000 $ 0x18690000

Darüber hinaus können Sie einen ECC-Speicher verwenden, der 1-Bit-Fehler korrigiert und 2-Bit-Fehler in Ihrem Speicher automatisch erkennt (und Sie erhalten vom Kernel Protokollmeldungen zu nicht korrigierbaren Speicherproblemen, falls diese auftreten).

haimg
quelle
Vielen Dank für den Tipp zu diesen Kernel-Parametern. Denken Sie, Sie können bitte klären, warum dies eine so schlechte Idee ist und warum Sie einen Speicherblock nicht mit denselben Methoden wie memtest86 (+) überprüfen können? Ich bin mir bewusst, dass zuverlässigere Tests mehr CPU-Zeit erfordern (und wahrscheinlich auch größere RAM-Stücke auf einmal), aber warum sollte dies ein Show-Stopper sein? Die CPU-Zeit ist möglicherweise kein Problem, wenn sie über einen ausreichend langen Zeitraum verteilt ist und außerdem mehrere CPUs immer mehr zum Mainstream werden.
Waxhead
Technisch gesehen kann dies möglich sein, wenn dies über einen ausreichend langen Zeitraum erfolgt. Der Engpass hier ist jedoch nicht die CPU (s), sondern der Speicherbus, und natürlich "vergiften" Sie den Speichercache Ihrer CPU. Ich würde ein solches Kernelmodul nicht kennen, und die Idee erscheint mir sehr fragil (das Orchestrieren des wiederholten Schreibens von Mustern in einen beliebigen Speicherbereich auf einem Live-System usw.)
haimg
haimg: frage: verwaltet das vFS das paging für diesen reservierten speicher? Ich denke, es kann nicht, da es für es nicht sichtbar sein wird.
Jay D
1
@Waxhead Die Speicherbereinigung erfolgt normalerweise auf BIOS-Ebene mithilfe von Hardware. Wenn diese Option aktiviert ist, sollten Sie Optionen für das Scrubben von Patrouillen und das Scrubben von Anforderungen finden. Wenn Ihnen die Speicherintegrität wichtig ist, was sicherlich der Fall ist, wenn Sie ECC-Speicher verwenden, lohnt sich der geringere Leistungseinbruch, der durch das Aktivieren dieser Optionen erzielt wird.
Ian
1
Ich denke, es könnte interessant sein, hier einen Verweis auf das Badram- Kernel-Modul aufzunehmen. Es verwendet memtest86, wie Sie es vorschlagen, aber anstatt den Kernel davon abzuhalten, schlechten Speicher zu verwenden, weist es ihn dem Kernel zu, ihn nicht zu verwenden, wodurch effektiv garantiert wird, dass weder der Kernel noch Ihre Anwendungen in diesen Speicher laufen.
Cimbali
2

Der Beitrag und die Antwort missverstehen das Problem. Das Speicher-Scrubbing soll verhindern, dass korrigierbare Einzelbitfehler zu nicht korrigierbaren Doppelfehlern werden. Der Scrubber hat gelegentlich nur den gesamten physischen Speicher (was dazu führt, dass Cache-Fehler auftreten). Wenn Einzelbitfehler vorliegen, werden diese korrigiert (und die Korrektur muss den korrekten Wert mithilfe eines Vergleichs und Austauschs neu schreiben), wodurch der Fehler behoben wird.

Wenn andernfalls ein zweiter Fehler in einem Wort auftritt, das bereits einen Fehler aufweist, ist das gesamte Wort nicht korrigierbar und das Betriebssystem muss etwas drastisches tun.

Das Scrubben ist wichtig, da ohne es Speicher, der gelesen, aber nicht geschrieben wird (wie Codepages), im Laufe der Zeit Fehler ansammeln kann.

Larry Stewart
quelle
Warum hat die Antwort das Problem Ihrer Meinung nach nicht verstanden, wenn sie als Antwort markiert wurde?
Dave
1
Trotz Daves Antwort ist Larry ganz richtig, die Antwort / tut / missversteht die Frage. In der Frage wird gefragt, ob Linux eine Speicherbereinigung durchführen kann, die, wie Larry sorgfältig erklärt, verwendet wird, um zu verhindern, dass von ECC h / w erkannte und korrigierte Einzelbitfehler zu nicht korrigierbaren 2-Bit-Fehlern werden. In der Antwort wird erläutert, wie diese Fehler zunächst mithilfe einer Softwareanwendung erkannt werden können.
Ian
Ich denke, Sie verstehen den Zweck hier falsch. Sie haben natürlich Recht mit Ihrer Beschreibung zum Scrubben. Wenn Sie jedoch beispielsweise einen (nicht kritischen) Dateiserver auf einem Nicht-ECC-RAM ausführen und über CPU-Zyklen verfügen, klingt dies nach einer guten Idee, um früher oder später Beschädigungen erkennen zu können Speicher und kennzeichnen Sie es als schlecht und wissen Sie darüber Bescheid, als sich eines schlechten Speicherchips nicht bewusst zu sein. Vielleicht wäre eine bessere Formulierung die Validierung / Verifizierung des Speichers. Vielleicht kein technisches Schrubben, aber dennoch eine praktikable Möglichkeit, den durch potenziell schlechtes Gedächtnis verursachten Schaden zu verringern.
Waxhead
1

Wenn Sie über ECC-Speicher verfügen, sollten Sie sich https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-devices-edac genauer ansehen . (Ich fand "sdram_scrub_rate" besonders interessant.)

(Wenn dieser Link irgendwann unterbrochen wird (sollte es wirklich nicht). Ich würde vorschlagen, die entsprechende Linux-Dokumentation herunterzuladen und nach "scrub" zu suchen.)

Kai
quelle