Ein-/Ausgabegeräte, Festplatten und RAID
MittelEinheit 7 von 9 in Kurs: Betriebssysteme – Prozesse, Speicher, Threads und Dateisysteme
Was du lernst
- Beschreibe, was ein Gerät dem Betriebssystem bereitstellt und wie der Kernel Polling, Interrupts, direkten Speicherzugriff (DMA) und Gerätetreiber nutzt, um Daten zwischen Speicher und Geräten zu übertragen.
- Beschreibe die Geräteschnittstelle und das grundlegende Ein-/AusgabeprotokollOrdne Geräte den Bussen des Rechners zu, benenne die Register, die ein Gerät bereitstellt, und verfolge das einfache Protokoll, mit dem das Betriebssystem einem Gerät einen Befehl erteilt.
- Wähle zwischen Polling und InterruptsErkläre, wie Interrupts es der CPU ermöglichen, während der Arbeit eines Geräts nützliche Aufgaben auszuführen, wann Polling die bessere Wahl ist und wie hybrides Polling und Interruptbündelung den Verwaltungsaufwand verringern.
- Übertrage Daten mit direktem Speicherzugriff (DMA)Erkläre, warum das Kopieren von Daten durch die CPU bei großen Übertragungen Zeit verschwendet und wie eine DMA-Einheit Daten zwischen Speicher und Gerät überträgt, während die CPU andere Arbeit erledigt.
- Erkläre Gerätetreiber und die Schichten des SpeichersystemsZeige, wie Treiber Gerätedetails hinter allgemeinen Schnittstellen verbergen, verfolge eine Leseanfrage vom Systemaufruf zum Gerät und zurück und vergleiche, wie SATA und NVMe Anfragen in Warteschlangen einreihen.
- Beschreibe die Geräteschnittstelle und das grundlegende Ein-/Ausgabeprotokoll
- Beschreibe, wie eine Festplatte Daten speichert und erreicht, berechne Dauer und Datenrate einer Ein-/Ausgabe und vergleiche Schedulingstrategien, die Positionierungs- und Rotationszeit verringern.
- Beschreibe den Aufbau und die Adressierung einer FestplatteStelle den Zusammenhang zwischen der Sektoradressierung des Laufwerks und seinen Magnetscheiben, Spuren, Köpfen und seinem Cache her und erkläre, was das Laufwerk garantiert und was nicht.
- Berechne Dauer und Datenrate einer Festplatten-Ein-/AusgabeZerlege eine Ein-/Ausgabe in Positionierung, Rotation und Übertragung, berechne jeden Anteil aus den Angaben zum Laufwerk und erkläre, warum sich zufällige und sequenzielle Arbeitslasten in ihrer Leistung so stark unterscheiden.
- Vergleiche Schedulingstrategien für FestplattenOrdne ausstehende Festplattenanfragen mit FCFS, SSTF, SCAN, C-SCAN, LOOK und SPTF, berechne jeweils die Kopfbewegung und erkläre, wo das Scheduling in einem modernen System stattfindet.
- Beschreibe den Aufbau und die Adressierung einer Festplatte
- Beschreibe Flash-Zellen, -Seiten und -Löschblöcke, erkläre, wie der Flash Translation Layer ihre Einschränkungen verbirgt, und vergleiche SSDs mit Festplatten hinsichtlich Leistung, Haltbarkeit und Kosten.
- Beschreibe Flash-Speicher: Zellen, Seiten, Blöcke und VerschleißErkläre, wie NAND-Flash Bits speichert, wie er in Seiten und Löschblöcke gegliedert ist, welche Operationen er unterstützt und warum er verschleißt.
- Erkläre den Flash Translation LayerBeschreibe, wie die Firmware einer SSD logische Blöcke auf Flash-Seiten abbildet, nach Art eines Protokolls schreibt, Datenmüll bereinigt und Verschleiß verteilt. Berechne außerdem die Schreibverstärkung und die Größe der Zuordnungstabelle.
- Vergleiche SSDs mit FestplattenVergleiche Latenz, Durchsatz, Haltbarkeit, Ausfallverhalten und Kosten von SSDs und Festplatten und erkläre, was sich für das Betriebssystem ändert.
- Beschreibe Flash-Speicher: Zellen, Seiten, Blöcke und Verschleiß
- Erkläre, wie ein redundanter Festplattenverbund Blöcke mit Striping, Spiegelung und Parität zuordnet, berechne Kapazität und Durchsatz für jedes RAID-Level und wähle ein Level passend zur Arbeitslast und ihren Ausfallrisiken.
- Erkläre, was ein RAID-Verbund leistet und wie du ihn bewertestBeschreibe einen RAID-Verbund als eine aus mehreren Festplatten aufgebaute logische Festplatte, das Fehlermodell und die Kennzahlen zum Vergleich von RAID-Leveln sowie die Probleme, die jeder Entwurf mit mehreren Festplatten behandeln muss.
- Ordne Blöcke mit Striping und Spiegelung zuBerechne, wo ein logischer Block in RAID-0 und RAID-10 liegt, erkläre die Wirkung der Chunkgröße und ermittle Kapazität, Zuverlässigkeit und Leistung von Striping und Spiegelung.
- Schütze Daten durch Parität in RAID-4, RAID-5 und RAID-6Berechne XOR-Parität, rekonstruiere damit einen verlorenen Block, aktualisiere die Parität bei einem kleinen Schreibvorgang und erkläre das Problem kleiner Schreibvorgänge sowie den Umgang von RAID-5 und RAID-6 damit.
- Wähle ein RAID-Level und plane Ausfälle und Wiederaufbauten einOrdne RAID-Level passenden Arbeitslasten zu, schätze die Wiederaufbauzeit und das Risiko unlesbarer Sektoren während eines Wiederaufbaus ab und begründe eine Wahl zwischen Spiegelung und Parität.
- Erkläre, was ein RAID-Verbund leistet und wie du ihn bewertest
- Erkenne, wie Speichergeräte teilweise und unbemerkt ausfallen, berechne und vergleiche Prüfsummen und entwirf ein Speichersystem, das Datenkorruption sowie fehlgeleitete und verlorene Schreibvorgänge erkennt und die Daten aus redundanten Kopien wiederherstellt.
- Erkenne Speicherfehler, die über den vollständigen Ausfall einer Festplatte hinausgehenBeschreibe latente Sektorfehler, unbemerkte Datenkorruption sowie fehlgeleitete und verlorene Schreibvorgänge, wie häufig sie auftreten und warum Redundanz allein sie nicht erkennt.
- Berechne und vergleiche PrüfsummenBerechne XOR-, additive und Fletcher-Prüfsummen, beschreibe die CRC und vergleiche Prüfsummenfunktionen anhand der Fehler, die sie erkennen, und ihres Aufwands.
- Integriere Integritätsprüfungen in ein SpeichersystemEntscheide, wo Prüfsummen gespeichert werden, verfolge den Lesepfad zum Erkennen und Beheben von Datenkorruption, erkenne fehlgeleitete und verlorene Schreibvorgänge und plane Scrubbing samt seinem Aufwand.
- Erkenne Speicherfehler, die über den vollständigen Ausfall einer Festplatte hinausgehen
Festplatten und RAID einfach erklärt
1Verfolge eine Ein-/Ausgabeanfrage von der Software bis zur Hardware
Ein Programm kann einen Datenblock anfordern, ohne zu wissen, welcher Controller ihn holt. Der Kernel setzt diese Anfrage in Registerzugriffe, Datenübertragungen und die Behandlung des Abschlusses um. Verfolge diese Aufgaben getrennt: wie ein Befehl das Gerät erreicht, wie die CPU darauf wartet und wer die Byte überträgt. Setze die Aufgaben dann in einem Speichersystem zusammen, das vielen Programmen und CPU-Kernen die gemeinsame Nutzung von Geräten ermöglicht.
1.1 Erteile einem Gerät einen Befehl
Ein Ein-/Ausgabegerät überträgt Daten in einen Rechner oder aus ihm heraus oder speichert sie dauerhaft. Eine Tastatur liefert Eingaben; eine Netzwerkkarte sendet und empfängt Pakete; eine Festplatte behält Daten nach dem Abschalten der Stromversorgung. Geräte sind über Busse oder Verbindungen angeschlossen. PCI Express (PCIe) verbindet leistungsfähige Geräte wie NVMe-SSDs. SATA und USB dienen anderen Speicher- und Peripheriegeräten weiter außen in der Hierarchie. Schnelle Verbindungen sind teurer herzustellen und unterliegen strengeren physikalischen Grenzen, daher kombiniert ein Rechner mehrere Arten.
Die Schnittstelle ist die Sicht der Software
Ein Controller kann Prozessoren, Speicher und Firmware enthalten, also die Software, die im Gerät läuft. Das Betriebssystem steuert ihn über eine bereitgestellte Hardwareschnittstelle. Zwei Controller können intern sehr unterschiedlich aufgebaut sein und dennoch dieselben Befehle unterstützen.
Ein einfaches Gerät hat drei Register:
| Register | Was der Kernel erfährt oder bereitstellt |
|---|---|
| Status | Ob das Gerät bereit, beschäftigt oder fertig ist oder einen Fehler meldet |
| Befehl | Welche Operation gestartet werden soll |
| Daten | Die gesendeten oder empfangenen Byte |
Für eine einfache Ausgabeoperation prüft der Kernel zunächst den Status, bis das Gerät bereit ist. Dann schreibt er die Daten, schreibt den Befehl und prüft den Status bis zum Abschluss. Abschließend prüft er, ob ein Fehler vorliegt. Würde er den Befehl schreiben, bevor er die Daten bereitstellt, könnte eine Operation mit dem falschen Inhalt starten. Das wiederholte Prüfen des Status heißt Polling; die Übertragung der Nutzdaten durch die CPU heißt programmierte Ein-/Ausgabe (PIO).
Greife sicher auf Register zu
Die portadressierte Ein-/Ausgabe gibt Registern einen eigenen Adressraum. Auf x86 greifen Befehle wie in und out auf diese Ports zu. Der Kernel kontrolliert, welcher Code sie ausführen darf. Die speicherabgebildete Ein-/Ausgabe (MMIO) platziert Register im physischen Adressraum, sodass Lade- und Speicherbefehle sie über Abbildungen erreichen, die von den Seitentabellen des Kernels kontrolliert werden. PCIe-Geräte verwenden normalerweise MMIO.
Eine MMIO-Adresse bezeichnet eine Geräteoperation, auch wenn der Zugriff einem Speicherzugriff ähnelt. Ein Lesezugriff kann ein Flag zurücksetzen. Ein Schreibzugriff kann eine Übertragung starten. Der Status kann sich ändern, weil das Gerät seine Arbeit abschließt, ohne dass die CPU an diese Adresse schreibt. Gewöhnliches Cache-Verhalten könnte diese Änderungen verbergen oder Zugriffe zusammenfassen, die das Gerät getrennt benötigt.
Linux-Treiber verwenden daher Zugriffsfunktionen wie readl() und writel(), geeignete Abbildungsattribute und erforderliche Speicherbarrieren. Ein volatile-Zeiger kann den Compiler daran hindern, Zugriffe zu entfernen oder zusammenzufassen. Er gewährleistet aber nicht die vollständige Reihenfolge gegenüber gewöhnlichem Speicher oder bei Umordnungen durch die CPU. Ein Befehlsdeskriptor im RAM muss beispielsweise für das Gerät sichtbar sein, bevor ein Doorbell-Register ihm mitteilt, diesen Deskriptor abzuholen.
Belasse die Gerätesteuerung im Kernel
Eine Anwendung ruft normalerweise read() oder write() auf. Der Kernel prüft Berechtigungen und führt das Geräteprotokoll in ihrem Auftrag aus. Das verhindert, dass ein Programm Befehle ausgibt, die die Anfrage eines anderen Programms stören. Ein Benutzerpuffer ist der Datenbereich der Anwendung; ein Befehlsregister ist die Steuerstelle des Controllers. Sie haben unterschiedliche Aufgaben, auch wenn beide Adressen besitzen.
Wichtige Erkenntnisse
- Die Geräteschnittstelle verbirgt das Innenleben und die Firmware des Controllers.
- Stelle die Daten bereit, bevor du das einfache Befehlsprotokoll startest; prüfe anschließend Abschluss und Fehler.
- Polling prüft die Bereitschaft; bei PIO überträgt die CPU die Daten.
- MMIO-Registerzugriffe können Nebenwirkungen haben und benötigen Zugriffsfunktionen der Plattform und eine festgelegte Reihenfolge.
- Systemaufrufe ermöglichen es dem Kernel, den gemeinsamen Gerätezugriff zu vermitteln.
1.2 Entscheide, wie die CPU wartet
Ein Gerät kann für den Abschluss einer Anfrage viel länger brauchen als die CPU für deren Ausgabe. Die Wartestrategie entscheidet, ob die CPU in dieser Zeit das Gerät prüft oder andere Arbeit ausführt. Sie ändert nicht, wie schnell das Gerät selbst die Anfrage abschließt.
Abfragen oder schlafen
Beim Polling liest die CPU wiederholt den Status. Ein Abschluss kann schnell bemerkt werden, aber Prüfungen, während das Gerät noch beschäftigt ist, verbrauchen CPU-Zeit. Bei Interrupts wird ein Prozess, der auf einen Lesezugriff wartet, blockiert, und ein anderer bereiter Prozess kann laufen. Wenn das Gerät fertig ist, signalisiert es dies der CPU. Die Interruptbehandlungsroutine des Kernels prüft den Abschluss, bearbeitet das Ergebnis und setzt den wartenden Prozess auf bereit. Der Scheduler entscheidet, wann dieser Prozess wieder läuft.
Angenommen, Prozess A startet einen Festplattenlesezugriff, der 10 ms dauert. Polling belegt die CPU während dieser Wartezeit. Bei interruptgesteuerter Ein-/Ausgabe kann Prozess B während derselben 10 ms rechnen. Die Geräteoperation von A dauert weiterhin 10 ms; nützliche Berechnung überlappt die Wartezeit.
Auch Interrupts verursachen Arbeit: Die CPU sichert den Zustand, führt die Behandlungsroutine aus, stellt den Zustand wieder her und muss möglicherweise Prozesse wechseln und Caches neu füllen. Der Aufwand beträgt gewöhnlich einige Mikrosekunden. Antwortet ein Gerät in 2 µs, kann eine kurze Polling-Schleife günstiger sein als das Blockieren und Aufwecken des Prozesses. Interrupts eignen sich für langsame Operationen, kurzes Polling für sehr schnelle.
Passe dich an Abschlussgeschwindigkeit und Last an
Eine hybride oder zweiphasige Strategie fragt kurz per Polling ab und wartet dann schlafend auf einen Interrupt, falls die Anfrage noch nicht abgeschlossen ist. Bei schnellem Abschluss entfällt der Aufwand des Aufweckens, während langsame Abschlüsse die CPU nicht während ihrer gesamten Dauer belegen. Linux unterstützt für geeignete schnelle Speicheranfragen die Abfrage des Abschlusses per Polling.
Starker Interruptverkehr schafft ein anderes Problem. Wenn fast jeder CPU-Zyklus neu eintreffende Ereignisse behandelt, erhält der Code, der deren Daten verarbeitet, wenig Ausführungszeit. Das ist Livelock: Der Rechner ist beschäftigt, aber der nützliche Fortschritt bricht ein. Der Linux-Netzwerkmechanismus NAPI begrenzt die Interruptarbeit und schaltet unter Last auf stapelweises Polling um.
Interruptbündelung fasst mehrere Abschlüsse zu einer Benachrichtigung zusammen. Bei 100.000 Abschlüssen pro Sekunde und 5 µs CPU-Arbeit pro Interrupt kosten separate Benachrichtigungen:
Das ist jede Sekunde die Hälfte der Zeit eines CPU-Kerns. Die Bündelung von acht Abschlüssen pro Interrupt ergibt 12.500 Interrupts und 62,5 ms CPU-Arbeit pro Sekunde oder 6,25 % eines Kerns. Eine Anfrage muss möglicherweise kurz auf ihren Stapel warten, sodass der geringere Verwaltungsaufwand mit zusätzlicher Benachrichtigungslatenz einhergeht.
Sende Benachrichtigungen an den richtigen Kern
PCIe-Geräte verwenden häufig MSI oder MSI-X, Interrupts, die als Nachrichten an eine spezielle Adresse übermittelt werden. Mehrere Interruptvektoren ermöglichen es einem Gerät, die Abschlüsse verschiedener Warteschlangen an verschiedene Kerne zu leiten. Ein NVMe-Controller kann Warteschlangen pro Kern mit passenden Interruptvektoren koppeln und so die Arbeit für Einreichung und Abschluss nahe beieinander halten. Mehr Vektoren organisieren die CPU-Arbeit; sie verkürzen weder einen Flash-Lesezugriff noch eine Festplattenumdrehung.
Wichtige Erkenntnisse
- Interrupts lassen Berechnung und Gerätezeit überlappen; ein abgeschlossener Prozess wird bereit, bevor er läuft.
- Vergleiche bei schnellen Geräten die Polling-Zeit mit dem Aufwand für Interrupt und Aufwecken.
- Hybrides Warten fragt kurz per Polling ab und blockiert dann bei Bedarf.
- Livelock verbraucht CPU-Zeit ohne nützlichen Fortschritt.
- Interruptbündelung verringert den Benachrichtigungsaufwand, indem sie etwas zusätzliche Latenz in Kauf nimmt.
- MSI-X unterstützt getrennte Interruptvektoren für Gerätewarteschlangen.
1.3 Übergib die Datenübertragung an DMA
Warten und Kopieren sind getrennte Aufgaben. Interrupts können verhindern, dass die CPU aktiv wartet, während ein Gerät arbeitet. Die CPU wäre aber weiterhin beschäftigt, wenn sie jedes Wort durch ein Datenregister übertragen müsste. Direkter Speicherzugriff (DMA) weist diese Übertragung einer Hardwareeinheit zu, die sich gewöhnlich im Gerätecontroller befindet.
Miss die Arbeit, die PIO der CPU überlässt
Stell dir ein 4 Byte großes Datenregister vor, bei dem jeder Zugriff 100 ns dauert. Das Übertragen eines 4-KiB-Blocks benötigt:
Diese Registeroperationen belegen die CPU. Größere Puffer benötigen entsprechend mehr Zugriffe. DMA erspart das wortweise Kopieren über Register; die CPU bereitet weiterhin die Anfrage vor und bearbeitet ihren Abschluss.
Verfolge einen DMA-Lesezugriff
- Der Treiber bereitet einen Zielpuffer vor und stellt ihn für den Gerätezugriff bereit.
- Er übergibt die DMA-Adresse oder -Adressen, die Anzahl der Byte, die Richtung und den Lesebefehl.
- Das Gerät liest die angeforderten Speicherblöcke und schreibt die Byte in den Speicher.
- Die CPU führt andere Arbeit aus, während das Gerät Daten überträgt.
- Der Abschluss wird gemeldet, gewöhnlich durch einen Interrupt. Die Behandlungsroutine prüft den Status und weckt den wartenden Prozess.
Die DMA-Einheit handelt als Busmaster und startet Speicherübertragungen. Der Einrichtungsaufwand hängt von der Abbildung, der Plattform und der Anzahl der Speicherbereiche ab. DMA verbraucht außerdem Speicherbandbreite, die es mit der CPU teilt. Es erspart CPU-Befehle, aber nicht alle Ressourcen.
Beschreibe verteilten Speicher
Ein Puffer kann im virtuellen Adressraum eines Prozesses zusammenhängend sein und zugleich getrennte physische Seiten belegen. Eine Scatter-Gather-Liste beschreibt diese Bereiche als Paare aus Adresse und Länge. Ein Gerät kann die Daten einer Anfrage über mehrere Bereiche hinweg übertragen, ohne dass die CPU sie zuerst in einen physisch zusammenhängenden Puffer kopieren muss.
Ein Puffer aus drei Seiten kann beispielsweise durch drei nicht benachbarte Seiten hinterlegt sein. Der Treiber erstellt Deskriptoren für die für das Gerät sichtbaren Bereiche und hält die zugrunde liegenden Seiten bis zum Abschluss unverändert an ihrem Platz. Die Fixierung verhindert, dass diese Seiten entfernt oder anderweitig verwendet werden, während die Hardware noch darauf zugreifen kann. Wird die Fixierung zu früh aufgehoben, besteht das Risiko, dass ein späterer DMA-Schreibvorgang fremde Daten überschreibt.
Nutze den Adressraum des Geräts
Ein Gerät verwendet normalerweise keinen virtuellen Zeiger einer Anwendung. Die DMA-API des Kernels liefert Busadressen, die sich von physischen CPU-Adressen unterscheiden können. Eine IOMMU übersetzt Geräteadressen in physischen Speicher und beschränkt den Speicher, auf den ein Gerät zugreifen darf. Diese Isolation hilft auch einem Hypervisor, einer virtuellen Maschine ein Gerät zuzuweisen.
CPU-Caches machen einen weiteren Koordinationsschritt nötig. Vor einer ausgehenden DMA-Übertragung muss das Gerät die neuesten Byte der CPU sehen; nach einer eingehenden Übertragung muss die CPU die Aktualisierungen des Geräts sehen. Manche Hardware hält die Kohärenz automatisch aufrecht. Andere Plattformen benötigen eine Cache-Synchronisierung über die DMA-API. Adressabbildung, Seitenlebensdauer und Cache-Sichtbarkeit lösen jeweils einen anderen Teil der Aufgabe, die Übertragung sicher zu machen.
Wichtige Erkenntnisse
- DMA übernimmt das Kopieren der Nutzdaten; Interrupts ersparen der CPU das Warten.
- Die CPU richtet DMA weiterhin ein und bearbeitet den Abschluss.
- Scatter-Gather-Listen beschreiben Übertragungen über getrennte Speicherbereiche.
- Fixierte Seiten müssen bis zum Abschluss von DMA stabil an ihrem Platz bleiben.
- Die DMA-API liefert für Geräte sichtbare Adressen; eine IOMMU übersetzt und beschränkt sie.
- Cache-Kohärenz oder explizite Synchronisierung macht Aktualisierungen von CPU und Gerät sichtbar.
1.4 Verfolge einen Lesezugriff durch das Speichersystem
Ein Gerätetreiber setzt eine allgemeine Anfrage in die Befehle und Registerzugriffe eines Controllers sowie die Behandlung des Abschlusses um. So kann ein Dateisystem einen Block anfordern, ohne zu wissen, ob die Hardware SATA, NVMe oder USB verwendet. Der Treiber kennt das gerätespezifische Protokoll und die Eigenheiten des Controllers.
Gib jeder Schicht eine Aufgabe
Ein Lesezugriff auf den Speicher durchläuft unter Linux normalerweise diese Kette:
Anwendung → Systemaufruf → Dateisystem → allgemeine Blockschicht → Treiber → Controller → Speichergerät.
Das Dateisystem ordnet eine Dateiposition Speicherblöcken zu. Die Blockschicht reiht Anfragen ein, fasst benachbarte zusammen und kann ihre Reihenfolge planen. Der Treiber reicht die daraus entstehenden Operationen ein. Der direkte Zugriff auf ein rohes Blockgerät kann das Dateisystem umgehen und dennoch die unteren Schichten nutzen.
Die Standardschnittstelle macht neue Hardware nutzbar, ohne jede Anwendung neu zu schreiben. Sie verbirgt aber auch manche Sonderfunktionen. Schnittstellen wie ioctl() oder die Durchreichung von Befehlen ermöglichen es Software, Steuerfunktionen anzufordern, die nicht zu einem gewöhnlichen Lese- oder Schreibzugriff auf Blöcke passen.
Unterscheide Geräteklassen
| Klasse | Typische Schnittstelle und Beispiele |
|---|---|
| Blockgerät | Adressierte Blöcke; Festplatten und SSDs |
| Zeichenorientiertes Gerät | Ein Bytestrom; Terminals und serielle Schnittstellen |
| Netzwerkschnittstelle | Paketkommunikation über Sockets |
Linux stellt Blockgeräte und zeichenorientierte Geräte als spezielle Dateien bereit, etwa /dev/sda und /dev/nvme0n1. Treiber laufen häufig im Kernelmodus, sodass ein Treiberfehler den Kernel zum Absturz bringen oder Speicherinhalte beschädigen kann. Treiberisolation begrenzt diese Auswirkungen in Systemen, die sie unterstützen. Die Treibersammlung von Linux macht einen großen Teil seines Quellcodes aus; Studien haben Treibercode außerdem als besonders fehleranfällig eingestuft.
Verteile Anfragen über Kerne hinweg
Die Linux-Blockschicht blk-mq verwendet Softwarewarteschlangen pro CPU und Hardware-Ausgabewarteschlangen. Ein Ein-/Ausgabe-Scheduler wie mq-deadline, bfq oder kyber kann Anfragen umordnen oder für Fairness sorgen; none verzichtet auf eine zusätzliche Schedulingstrategie. Festplatten profitieren davon, wenn Positionierungsbewegungen verringert werden. Schnelle NVMe-Geräte verwenden häufig none, da sie keinen Kopf positionieren müssen. Der gewählte Scheduler erscheint in /sys/block/<device>/queue/scheduler in eckigen Klammern.
SATA mit AHCI/NCQ unterstützt pro Gerät eine Befehlswarteschlange mit bis zu 32 ausstehenden Befehlen. NVMe unterstützt viele Einreichungs- und Abschlusswarteschlangen im Speicher: bis zu 65.535 Ein-/Ausgabe-Warteschlangen mit jeweils bis zu etwa 64.000 Befehlen. Tatsächliche Controller bieten niedrigere Grenzwerte. Warteschlangenpaare pro Kern verringern die Konkurrenz auf gemeinsam genutzten Einreichungspfaden.
Verfolge einen NVMe-Lesezugriff
Ein Prozess ruft read(fd, buf, 4096) auf. Bei einem Cache-Fehlzugriff findet das Dateisystem den Festplattenblock, und die Blockschicht erstellt eine Anfrage. Der NVMe-Treiber schreibt einen Deskriptor in eine Einreichungswarteschlange und beschreibt dann deren MMIO-Doorbell-Register. Der Controller holt den Befehl ab, überträgt die Daten per DMA in den Speicher und stellt einen Abschlusseintrag ein. Ein MSI-X-Interrupt veranlasst den Kernel, die Anfrage abzuschließen. Bei einem gepufferten Lesezugriff gelangen die Daten über den Seitencache in den Puffer der Anwendung, und read() gibt 4096 zurück. Ein Cache-Treffer kann den Lesezugriff bedienen, bevor eine Geräte-Ein-/Ausgabe nötig wird.
Wichtige Erkenntnisse
- Treiber passen eine Standardschnittstelle des Kernels an gerätespezifische Protokolle an.
- Die Blockschicht reiht Anfragen für adressierte Blöcke ein, fasst sie zusammen und plant sie.
- AHCI/NCQ hat pro Gerät eine flache Warteschlange; NVMe unterstützt viele Warteschlangen im Speicher.
- Eine Doorbell kündigt eingereihte Arbeit an; DMA überträgt die Nutzdaten; die Abschlussbehandlung beendet die Anfrage.
2Berechne den Festplattenaufwand und wähle eine Anfragereihenfolge
Eine Festplatte stellt nummerierte Sektoren bereit. Die Bearbeitung einer Anfrage kann aber eine Armbewegung und das Warten auf die Rotation erfordern, bevor Daten übertragen werden. Verbinde diese physischen Schritte mit Latenz, IOPS und Datenrate. Vergleiche dann Anfragereihenfolgen anhand von Bewegungsweg und Wartezeit: Ein kurzer Weg kann den Durchsatz verbessern und zugleich eine entfernte Anfrage warten lassen. Auch Geräte-Caches und Firmware beeinflussen, was das Betriebssystem beobachtet.
2.1 Verbinde Sektoradressen mit der Festplattenhardware
Eine Festplatte stellt ein Feld von Sektoren bereit, die ab null nummeriert sind. Diese Nummern heißen logische Blockadressen (LBAs). Traditionell war ein Sektor 512 Byte groß; viele Laufwerke verwenden heute physische Sektoren mit 4.096 Byte. Ein 512e-Laufwerk akzeptiert auf diesem größeren physischen Format logische Sektoren mit 512 Byte. Ein 4-KiB-Block eines Dateisystems kann sich daher über mehrere logische Sektoren erstrecken.
Stell dir die beweglichen Teile vor
Magnetische Magnetscheiben drehen sich auf einer Spindel. Jede Oberfläche hat konzentrische Spuren, die in Sektoren unterteilt sind, sowie einen Schreib-/Lesekopf an einem beweglichen Arm. Die Köpfe bewegen sich gemeinsam. Spuren an derselben Armposition auf allen Oberflächen bilden einen Zylinder. Übliche Spindeldrehzahlen sind 5.400 und 7.200 Umdrehungen pro Minute, bei schnelleren Festplattenfamilien auch 10.000 und 15.000 Umdrehungen pro Minute.
Benachbarte LBAs werden gewöhnlich nahe beieinander platziert. Das hilft sequenziellen Lesezugriffen, wiederholte Positionierungsbewegungen zu vermeiden. Ein auf einen Reservesektor umgelegter Sektor kann diese Beziehung unterbrechen. Die Software sieht daher einen nützlichen linearen Adressraum, ohne die genaue physische Platzierung zu kennen.
Äußere Spuren bieten mehr Platz für Sektoren. Die Zonenaufzeichnung legt mehr Sektoren auf diesen Spuren ab, sodass pro Umdrehung mehr Byte unter dem Kopf vorbeilaufen. Der sequenzielle Durchsatz kann sinken, wenn sich ein Lesezugriff zur Mitte hin bewegt. Der Spurversatz verschiebt Sektorpositionen zwischen benachbarten Spuren: Nach dem Spurwechsel des Kopfes trifft der nächste sequenzielle Sektor zur richtigen Zeit ein, statt gerade vorbeigelaufen zu sein.
Unterscheide Abschluss und Dauerhaftigkeit
Ein Laufwerk-Cache kann kürzlich gelesene Daten vorhalten und Schreibvorgänge aufnehmen. Diese Puffer reichen von einigen Megabyte bis zu Hunderten Megabyte; der Lesecache kann den Rest einer Spur vorhalten, die gerade unter dem Kopf vorbeiläuft. Beim Write-Back-Caching kann ein Schreibvorgang abgeschlossen werden, während seine Daten noch im flüchtigen Cache liegen. Write-Through wartet auf das Medium. Ein Befehl zum Leeren des Caches fordert an, dass gepufferte Schreibvorgänge den dauerhaften Speicher erreichen; Force Unit Access (FUA) fordert für den betroffenen Schreibvorgang einen dauerhaften Abschluss an.
Atomarität bei Stromausfall ist eine weitere Eigenschaft. Eine atomare Schreibeinheit ändert sich bei Stromausfall entweder vollständig oder bleibt unverändert. Die Sektorgröße allein bietet keine solche Zusicherung: Das Gerät muss seine Garantie dokumentieren. Ein Schreibvorgang über mehrere atomare Einheiten kann einen zerrissenen Schreibvorgang hinterlassen, bei dem einige Einheiten neu und andere alt sind. Das Leeren des Caches betrifft die Dauerhaftigkeit; atomare Einheiten betreffen partielle Aktualisierungen.
Lies Kapazitätsangaben richtig
Laufwerkskapazitäten verwenden dezimale SI-Präfixe. Binäre Einheiten verwenden Zweierpotenzen:
Eine 4-TB-Festplatte enthält daher:
Beide Angaben beschreiben dieselbe Anzahl an Byte. Ein Werkzeug, das etwa 3,64 anzeigt und mit „TB“ bezeichnet, hat binär gerechnet und eine dezimal wirkende Bezeichnung verwendet; durch die Umrechnung ist kein Speicherplatz verloren gegangen.
Erkenne eine zusätzliche Einschränkung beim Schreiben
Die überlappende magnetische Aufzeichnung (SMR) lässt benachbarte Spuren überlappen, um mehr Daten unterzubringen. Das erneute Schreiben einer Spur kann ihre Nachbarspur stören, was kleine zufällige Aktualisierungen aufwendig macht. Große sequenzielle Schreibvorgänge in geeigneten Zonen funktionieren besser. Es handelt sich um eine Magnetfestplatte mit einer Einschränkung bei der Schreibverwaltung, auch wenn gewöhnliche Lesezugriffe weiterhin dieselben Köpfe und rotierenden Magnetscheiben nutzen.
Wichtige Erkenntnisse
- LBAs bezeichnen logische Sektoren; logische und physische Sektorgrößen können sich unterscheiden.
- Die Köpfe positionieren sich über den Spuren, während sich die Magnetscheiben darunter drehen.
- Zonenaufzeichnung und Spurversatz unterstützen effizienten sequenziellen Zugriff.
- Ein Write-Back-Schreibvorgang kann vor der dauerhaften Speicherung abgeschlossen sein; das Leeren des Caches und FUA fordern Dauerhaftigkeit an.
- Atomarität bei Stromausfall beruht auf der dokumentierten Gerätegarantie.
- Dezimale TB und binäre TiB sind unterschiedliche Einheiten für dieselben Byte.
- SMR verbessert die Speicherdichte, macht aber kleine zufällige erneute Schreibvorgänge aufwendiger.
2.2 Berechne Latenz, IOPS und Datenrate
Eine Festplattenanfrage benötigt Zeit, um die Daten zu erreichen, bevor sie übertragen werden. Bei einer einfachen Anfrage ohne Warteschlange oder Cache-Treffer lässt sich die Bedienzeit in drei Teile zerlegen:
Bei der Positionierung wird der Arm zur Spur bewegt und kommt dort zur Ruhe. Während der Rotationslatenz wird gewartet, bis der Sektor den Kopf erreicht. Die Übertragungszeit umfasst die unter dem Kopf vorbeilaufenden Byte. Falls eine Warteschlange vorhanden ist, kommt Wartezeit vor Beginn der Bedienung hinzu.
Rechne die Drehzahl in eine Wartezeit um
Eine Umdrehung dauert 60.000 ms geteilt durch die Drehzahl in Umdrehungen pro Minute. Bei 7.200 Umdrehungen pro Minute:
Bei einer zufälligen Sektorposition beträgt die durchschnittliche Wartezeit eine halbe Umdrehung, also etwa 4,17 ms. Bei 15.000 Umdrehungen pro Minute dauert eine Umdrehung 4 ms und die durchschnittliche Wartezeit 2 ms. Eine höhere Drehzahl verringert die Rotationslatenz; sie verkürzt nicht direkt die Positionierungszeit des Arms.
Datenblätter geben eine durchschnittliche Positionierungszeit an. Bei gleichmäßig verteilten Anfragen beträgt die durchschnittliche Positionierungsstrecke etwa ein Drittel des gesamten Bewegungswegs, aber die Positionierungszeit ist nicht proportional zur Strecke. Bei kurzen Bewegungen dominieren Beschleunigung und Einschwingen; lange Bewegungen umfassen mehr Fahrt mit voller Geschwindigkeit.
Berechne einen kleinen zufälligen Lesezugriff
Verwende ein Laufwerk mit 7.200 Umdrehungen pro Minute, einer durchschnittlichen Positionierungszeit von 8 ms und einer Übertragungsrate von 200 MB/s. Eine 4-KiB-Anfrage umfasst 4.096 Byte. Berechne zuerst die Übertragung in Sekunden:
Addiere dann Positionierung und Übertragung:
Bei jeweils einer ausstehenden Anfrage ergibt sich etwa:
Die effektive Rate beträgt etwa 4.096 Byte multipliziert mit 82 pro Sekunde oder 0,34 MB/s. Eine angegebene Übertragungsrate von 200 MB/s beschreibt die Übertragung bereits positionierter Daten; sie kann die ungefähr 12 ms für die Positionierung bei jeder kleinen zufälligen Anfrage nicht beseitigen.
Berechne einen langen sequenziellen Lesezugriff
Lies nun 100 MB nach einer anfänglichen Positionierung und Rotationswartezeit. Die Übertragungszeit beträgt 100/200 s oder 500 ms. Die Gesamtdauer beträgt etwa 512,17 ms, woraus folgt:
Die effektive Rate ist ungefähr 580-mal so hoch wie bei kleinen zufälligen Zugriffen. Ein Positionierungsaufwand verteilt sich auf viel mehr Byte. Bei großen sequenziellen Übertragungen dominiert die Übertragungszeit, bei kleinen zufälligen Anfragen die Positionierung.
Verwende durchgehend Byte, wenn du KiB mit MB/s kombinierst, und rechne Millisekunden in Sekunden um, bevor du Byte durch die Zeit teilst. IOPS eignet sich für kleine zufällige Operationen; MB/s eignet sich für sequenzielle Datenströme. Vorauslesen, benachbarte Platzierung und das Zusammenfassen kleiner Schreibvorgänge zu sequenziellen Stapeln verbessern die Leistung, indem sie ändern, wie häufig Positionierungsaufwand anfällt.
Wichtige Erkenntnisse
- Addiere Positionierungszeit, Rotationslatenz und Übertragungszeit, um die Bedienzeit einer Festplatte zu modellieren.
- Die durchschnittliche zufällige Rotationslatenz beträgt die Hälfte von 60.000 geteilt durch die Drehzahl in Umdrehungen pro Minute, angegeben in Millisekunden.
- Verwende Byte und einheitliche Zeiteinheiten, wenn du eine effektive Datenrate berechnest.
- Bei kleinen zufälligen Anfragen fällt wiederholt Positionierungsaufwand an; große sequenzielle Anfragen verteilen diesen Aufwand.
- IOPS zählt Operationen pro Sekunde; der Durchsatz zählt Byte pro Sekunde.
2.3 Vergleiche Schedulingwege und Wartezeiten
Ein Festplatten-Scheduler wählt, welche ausstehende Anfrage als Nächstes bearbeitet wird. Die Position liefert ihm nützliche Informationen über den Bedienaufwand. Ein kürzerer Armweg hilft, aber eine Strategie muss auch berücksichtigen, wie lange einzelne Anfragen warten.
Vergleiche die Strategien
| Strategie | Nächste Anfrage oder Weg | Wichtigster Zielkonflikt |
|---|---|---|
| FCFS | Ankunftsreihenfolge | Faire Reihenfolge, möglicherweise langer Weg |
| SSTF | Nächstgelegene Spur | Geringer Positionierungsaufwand, mögliches Verhungern |
| SCAN | Auf einem Durchlauf bis zum Rand bedienen, dann umkehren | Durch die Durchläufe beschränkte Wartezeit |
| C-SCAN | In einer Richtung bedienen, ohne Bedienung zurückkehren | Gleichmäßigere Wartezeiten über die Positionen hinweg |
| LOOK | Bei der letzten ausstehenden Anfrage umkehren | Unnötigen Weg zum Rand vermeiden |
| C-LOOK | In einer Richtung bedienen, zwischen äußersten ausstehenden Anfragen zurückspringen | Zirkuläre Bedienung ohne unnötigen Weg zum Rand |
SSTF kann wiederholt neue Anfragen in der Nähe auswählen, während eine entfernte wartet. Ein Betriebssystem ohne genaue Kenntnis der Geometrie nähert SSTF häufig anhand des LBA-Abstands an, indem es den nächsten Block zuerst wählt. Die Fairness von SCAN-Verfahren setzt voraus, dass das System während seiner Durchläufe Anfragen weiter bedienen kann; ein überlastetes Gerät kann dennoch nicht für jede eintreffende Anfrage eine feste Antwortzeit bieten.
Addiere den Weg abschnittsweise
Nimm die Spuren 0–199, einen Kopf bei 50, der sich zu höheren Spurnummern bewegt, und die eintreffenden Anfragen 82, 170, 43, 140, 24, 16, 190. Beende die Zählung, sobald alle Anfragen abgeschlossen sind.
FCFS folgt der Liste. Der Weg beträgt 32 + 88 + 127 + 97 + 116 + 8 + 174 = 642 Spuren. SSTF besucht 43, 24, 16, 82, 140, 170, 190, insgesamt 208 Spuren.
SCAN besucht die höheren Anfragen, fährt weiter bis 199 und kehrt dann bis 16 um. Der Weg beträgt 149 + 183 = 332. LOOK kehrt bei 190 um, was 140 + 174 = 314 ergibt. C-LOOK fährt von 50 bis 190, springt zurück zu 16 und endet bei 43: 140 + 174 + 27 = 341 Spuren. Der Rücksprung ist eine tatsächliche Bewegung, auch wenn dabei keine Anfrage bedient wird. C-SCAN würde bis 199 fahren, ohne Bedienung zu 0 zurückkehren und dann in aufsteigender Richtung bis 43 bedienen.
Das beste Gesamtergebnis in dieser endlichen Warteschlange belegt nicht, welche Strategie für einen Strom zukünftiger Anfragen am besten ist. Der kurze Weg von SSTF geht hier bei anhaltender Last mit dem Risiko des Verhungerns einher.
Berücksichtige Rotation und Firmware
Shortest Positioning Time First (SPTF) minimiert die Summe aus Positionierungszeit und Rotationslatenz. Eine weiter entfernte Spur kann gewinnen, wenn ihr Sektor früher eintrifft. Für genaue Entscheidungen sind Geometrie und Rotationsposition nötig, daher ist die Firmware des Laufwerks besser dafür geeignet als das Betriebssystem.
Das Betriebssystem kann Anfragen für benachbarte Blöcke zusammenfassen und dann mehrere Befehle über NCQ einreichen. Die Firmware ordnet diesen Stapel anhand interner Informationen um. Antizipierendes Scheduling kann die Festplatte kurz ungenutzt lassen, um auf eine wahrscheinliche Folgeanfrage in der Nähe zu warten. Deadline-Scheduling begrenzt das Aufschieben; Linux mq-deadline verfolgt Ablauffristen und bevorzugt Lesezugriffe. SSD-Scheduling konzentriert sich auf Fairness und Latenz, weil keine Positionierung oder Rotation eingespart werden kann.
Wichtige Erkenntnisse
- FCFS hält die Ankunftsreihenfolge ein; SSTF erkauft kürzere Wege mit dem Risiko des Verhungerns.
- SCAN und LOOK durchlaufen beide Richtungen; zirkuläre Varianten bedienen in einer Richtung.
- Zähle jede Bewegung, einschließlich einer zirkulären Rückkehr ohne Bedienung.
- SPTF berücksichtigt neben der Positionierung auch die Rotationsposition.
- Das Betriebssystem fasst Anfragen zusammen und reiht sie ein; die Laufwerksfirmware kann sie anhand der verborgenen Geometrie umordnen.
- Fristen und antizipierendes Scheduling verfolgen Ziele über den kürzesten Weg hinaus.
3Erkläre Flash-Aktualisierungen und SSD-Leistung
Flash kann eine kleine Seite schnell lesen, aber ihre erneute Nutzung setzt das Löschen eines viel größeren Blocks voraus. Ein SSD-Controller verbirgt diesen Unterschied hinter logischen Adressen. Verfolge, wie er neue Versionen platziert, alten Speicherplatz zurückgewinnt und Verschleiß verteilt. Nutze diese Mechanismen dann, um Schreibverstärkung, Warteschlangentiefe und Haltbarkeitsangaben zu deuten. Das Fehlen beweglicher Teile verändert den Speicheraufwand, macht aber nicht jeden Zugriff gleich günstig.
3.1 Verstehe Seiten, Löschblöcke und Verschleiß
NAND-Flash speichert Informationen als elektrische Ladung in Zellen. Der Controller unterscheidet Ladungszustände, um die Bits zu lesen. Eine Zelle mit mehr Bits benötigt mehr unterscheidbare Zustände. Das erhöht die Speicherdichte, erschwert aber Programmierung und Fehlerkontrolle.
Zähle die Ladungszustände
| Zelltyp | Bits pro Zelle | Ladungszustände |
|---|---|---|
| SLC | 1 | 2 |
| MLC | 2 | 4 |
| TLC | 3 | 8 |
| QLC | 4 | 16 |
Für eine Zelle mit b Bits beträgt die Anzahl der Zustände . Mehr Bits pro Zelle senken im Allgemeinen die Kosten pro Gigabyte, während die Programmierung langsamer wird und die Belastbarkeit durch Löschzyklen sinkt. Das sind Eigenschaften der Zellorganisation; auch der Controller und die Parallelität der gesamten SSD beeinflussen die Leistung.
Ordne jeder Operation ihre Einheit zu
Flash-Chips enthalten Löschblöcke, die jeweils viele Seiten enthalten. Eine Seite ist gewöhnlich 4–16 KiB groß, während ein Löschblock Hunderte Seiten enthalten und Hunderte KiB bis mehrere MiB umfassen kann. Eine Flash-Seite, eine Seite des virtuellen Speichers und ein Dateisystemblock sind unterschiedliche Einheiten, auch wenn manche Größen zufällig übereinstimmen.
Ein Lesevorgang liefert eine Seite zurück, gewöhnlich in einigen zehn Mikrosekunden. Ein Programmiervorgang schreibt eine gelöschte Seite und dauert einige Hundert Mikrosekunden. Ein Löschvorgang setzt einen ganzen Block auf Einsen zurück und dauert Millisekunden. Seiten werden in der vom Chip vorgegebenen Reihenfolge programmiert, gewöhnlich von niedrigeren zu höheren Seiten. Der Controller muss diese Reihenfolgeregeln beim Platzieren von Daten einhalten.
Eine benutzte Seite kann nicht einfach eine Ersatzversion aufnehmen. Zuerst muss ihr Löschblock gelöscht werden, wodurch der Inhalt jeder Seite in diesem Block zerstört wird. Das ist der zentrale Unterschied: Schreibvorgänge erfolgen seitenweise, Löschvorgänge blockweise.
Betrachte den Aufwand einer Aktualisierung an derselben Stelle
Stell dir einen Block mit den Seiten A, B, C und D vor. Um A durch A′ zu ersetzen und dabei dieselbe physische Platzierung beizubehalten:
- Lies B, C und D in einen temporären Speicher.
- Lösche den ganzen Block einschließlich des alten A.
- Programmiere A′, B, C und D in die gelöschten Seiten.
Eine Seite neuer Informationen hat drei Lesevorgänge, vier Programmiervorgänge und einen Löschvorgang verursacht. Nur A zu löschen ist nicht möglich. Eine SSD vermeidet diesen Aufwand bei jedem Überschreiben durch den Host, indem sie den Ersatz an anderer Stelle schreibt und ihre Zuordnung ändert.
Gehe mit Schäden und Ladungsverlust um
Jeder Programmier-/Löschzyklus (P/E-Zyklus) beschädigt die Zellen geringfügig. Typische Haltbarkeitsbereiche liegen bei etwa 50.000–100.000 Zyklen für SLC, 1.000–3.000 für TLC und etwa 1.000 oder weniger für QLC; tatsächliche Angaben unterscheiden sich je nach Chipgeneration und Hersteller stark. Controller nehmen Blöcke außer Betrieb, die unzuverlässig werden.
Ladung geht mit der Zeit ebenfalls verloren, besonders in verschlissenen Zellen. Lesen oder Programmieren kann benachbarte Zellen stören. Leistungsfähige fehlerkorrigierende Codes (ECC) beheben viele daraus entstehende Bitfehler, und der Controller kann Daten mit steigender Fehlerzahl auffrischen. Flash ist dauerhafter Speicher mit unterschiedlich aufwendigen Operationen und begrenzter Haltbarkeit. Ein schneller Seitenlesezugriff allein sagt daher wenig über den Aufwand anhaltender Überschreibungen aus.
Wichtige Erkenntnisse
- Eine Zelle, die b Bits speichert, muss 2ᵇ Ladungszustände unterscheiden.
- Flash liest und programmiert Seiten, löscht aber ganze Blöcke.
- Programmierung benötigt gelöschten Speicherplatz; das Erhalten benachbarter gültiger Seiten macht Aktualisierungen an derselben Stelle aufwendig.
- P/E-Zyklen verschleißen Zellen, während Störungen und Ladungsverlust Fehler erzeugen.
- ECC, Auffrischung und das Ausmustern von Blöcken helfen dem Controller, diese Fehler zu bewältigen.
3.2 Verfolge logische Seiten durch den FTL
Der Host liest und überschreibt logische Blöcke. Der Flash Translation Layer (FTL) der SSD ordnet diese Adressen physischen Flash-Seiten zu und verwaltet die dahinter verborgenen Löschvorgänge. Würde die logische Seite N dauerhaft auf der physischen Seite N bleiben, müssten bei häufigem Überschreiben dieselben Blöcke wiederholt gelöscht werden.
Schreibe eine neue Version an anderer Stelle
Ein logstrukturierter FTL programmiert neue Daten in eine freie Seite und ändert ihre Zuordnung. Angenommen, LBA 100 ist der physischen Seite 0 und LBA 101 der Seite 1 zugeordnet. Eine Überschreibung von LBA 100 wird in Seite 2 programmiert. Die Zuordnung wird zu 100 → 2; Seite 0 wird ungültig. Der Host fordert weiterhin LBA 100 an und erhält die neue Version.
Ungültig ist ein Zuordnungszustand, keine sofortige physische Löschung. Die alten Bits bleiben bestehen, bis ihr Löschblock zurückgewonnen wird. Das Löschen oder Überschreiben einer Datei gibt daher keine verlässliche Zusicherung, wann jede alte physische Kopie verschwindet. Zuverlässiges Löschen nutzt eine geeignete Sanitize-Operation des Laufwerks oder ein korrekt verwaltetes Verschlüsselungsverfahren für das gesamte Laufwerk mit anschließender Schlüsselvernichtung.
Gewinne Speicherplatz zurück und zähle zusätzliche Schreibvorgänge
Die Garbage Collection (GC) wählt einen Block, kopiert seine gültigen Seiten an eine andere Stelle, aktualisiert die Zuordnung und löscht den alten Block. Ungültige Seiten müssen nicht kopiert werden. Ein Block mit vielen ungültigen Seiten liefert pro kopierter gültiger Seite mehr freien Speicherplatz.
Die Schreibverstärkung (WA) misst diese zusätzliche Programmierung:
In einem Block mit 64 Seiten, davon 48 gültig und 16 ungültig, kopiert die GC 48 Seiten. Das Löschen des Blocks erzeugt 64 freie Seiten, aber die Kopien haben an anderer Stelle 48 Seiten verbraucht: Der Nettogewinn beträgt 16. Wird dieser Gewinn mit 16 Seiten des Hosts gefüllt, entstehen 64 Flash-Seitenprogrammiervorgänge für 16 Seitenschreibvorgänge des Hosts, also WA = 4. Höhere Verstärkung verbraucht Bandbreite und die Belastbarkeit durch Löschzyklen schneller.
Over-Provisioning reserviert Flash-Speicherplatz, den der Host nicht füllen kann. Mehr freier Speicher gibt der GC Spielraum, günstigere Blöcke zu wählen. TRIM, bei NVMe Deallocate und bei SCSI UNMAP genannt, teilt dem Gerät mit, welche logischen Bereiche keine benötigten Daten mehr enthalten. Die Seiten einer gelöschten Datei können dann als ungültig behandelt werden, statt während der GC kopiert zu werden.
Plane Zuordnungsspeicher und Verschleiß ein
Eine Zuordnung auf Seitenebene benötigt einen Eintrag pro logischer Seite. Ein Gerät mit 1 TiB und 4 KiB großen Seiten hat:
Bei 4 Byte pro Eintrag benötigt die Tabelle 1 GiB. Die Zuordnung auf Blockebene verkleinert die Tabelle, macht aber kleine Aktualisierungen aufwendig. Hybride Zuordnung kombiniert Blockzuordnungen mit protokollartigen Bereichen mit Seitenzuordnung; ein anderer Ansatz hält nur aktive Einträge der Seitenzuordnung im Cache.
Der Verschleißausgleich verteilt Löschvorgänge über die Blöcke. Neue Schreibvorgänge wechseln bereits den Ort, aber Blöcke mit kalten, unveränderten Daten könnten sonst dauerhaft verschont bleiben, während heiße Bereiche verschleißen. Das Verschieben einiger kalter Daten gibt wenig genutzte Blöcke für den Pool der beschreibbaren Blöcke frei. Diese Migration kann zusätzliche Schreibvorgänge erzeugen, daher wägt der Controller gleichmäßigen Verschleiß gegen Kopieraufwand ab.
Wichtige Erkenntnisse
- Ein FTL ordnet logische Adressen des Hosts physischen Flash-Seiten zu.
- Aktualisierungen an anderer Stelle machen alte Seiten ungültig, ohne deren Bits sofort zu löschen.
- GC kopiert gültige Seiten, bevor sie einen Block löscht.
- Die Schreibverstärkung teilt die gesamten Flash-Programmiervorgänge durch die Schreibvorgänge des Hosts.
- Over-Provisioning und TRIM verringern unnötiges Kopieren.
- Zuordnungen auf Seitenebene tauschen Speicherbedarf gegen Flexibilität bei Aktualisierungen.
- Der Verschleißausgleich bezieht wenig genutzte Blöcke in die Löschvorgänge ein.
3.3 Deute SSD-Geschwindigkeit und Haltbarkeit
Eine SSD hat weder Festplattenarm noch rotierende Magnetscheibe. Sie vermeidet mechanische Positionierungsverzögerungen im Millisekundenbereich, aber ihre Geschwindigkeit hängt weiterhin von Anfragegröße, Parallelität, Schreibverlauf und der Hintergrundarbeit ihres Controllers ab.
Vergleiche Latenz und Durchsatz
| Arbeitslast oder Eigenschaft | Festplatte | Flash-SSD |
|---|---|---|
| Latenz kleiner zufälliger Lesezugriffe | Millisekunden | Einige Zehn bis etwa hundert Mikrosekunden |
| Rate kleiner zufälliger Lesezugriffe | Ungefähr 75–200 IOPS | NVMe kann bei genügend eingereihter Arbeit Hunderttausende erreichen |
| Sequenzielle Übertragung | Bis zu einigen Hundert MB/s | Etwa 550 MB/s bei SATA; mehrere GB/s bei NVMe |
| Wichtigster interner Aufwand | Positionierung, Rotation, Übertragung | Seitenzugriff, Controllerarbeit, GC, Parallelität |
Dies sind typische Geräteklassen, keine Garantien für jedes Laufwerk. Der Durchsatz von SATA-SSDs wird durch die Verbindung mit 6 Gb/s begrenzt. NVMe nutzt PCIe und kann viele Flash-Kanäle gleichzeitig beschäftigen.
Ein Programm, das einen kleinen Lesezugriff ausgibt und vor dem nächsten auf dessen Abschluss wartet, erfährt die Latenz jeder Anfrage. Bei einer Latenz von 80 µs erlaubt dieses serielle Muster etwa 12.500 Operationen pro Sekunde. Ein Gerät, das mit einer viel höheren IOPS-Rate beworben wird, benötigt viele gleichzeitig laufende Anfragen, bereitgestellt durch Threads oder asynchrone Ein-/Ausgabe. Warteschlangentiefe schafft Möglichkeiten für parallele Arbeit; sie kann auch zusätzliche Wartezeit verursachen, wenn das Gerät ausgelastet ist.
Berücksichtige den Schreibverlauf
Zufällige und sequenzielle Schreibvorgänge bleiben unterschiedlich. Zufällige Aktualisierungen können ungültige Seiten verstreut zwischen gültigen Seiten hinterlassen und dadurch die Kopierarbeit der GC erhöhen. Sequenzielle Arbeitslasten können ganze Bereiche gemeinsam ungültig machen, was ihre Rückgewinnung günstiger macht und die WA näher bei eins hält. Eine leere SSD kann direkt in freien Speicher programmieren; eine gefüllte SSD muss ihn zurückgewinnen. Die Leistung im stationären Zustand umfasst diesen laufenden GC-Aufwand, Tests im Neuzustand dagegen möglicherweise nicht.
Lies Haltbarkeitsangaben als Schreibbudget
TBW ist die angegebene Gesamtzahl der vom Host geschriebenen Terabyte. DWPD bezeichnet vollständige Schreibvorgänge des Hosts auf das Laufwerk pro Tag über den Garantiezeitraum. Für ein Gerät mit 1 TB und einer Angabe von 600 TBW über fünf Jahre gilt:
Bei 50 GB pro Tag wären 600 TB Schreibvorgänge des Hosts nach 12.000 Tagen erreicht, also nach etwa 33 Jahren. Diese Rechnung vergleicht Arbeitslasten und ist keine Lebensdauerprognose: Controllerausfälle, Alterung und Garantiegrenzen sind weiterhin relevant. Hohe interne Verstärkung verschleißt Zellen schneller, obwohl die Haltbarkeitsangabe die Schreibvorgänge des Hosts zählt.
Wähle das passende Gerät für die Arbeit
Festplatten bieten geringe Kosten pro Terabyte für große, selten genutzte Datensätze. SSDs eignen sich für latenzempfindliche Arbeit. Hierarchische Datenspeicherung hält heiße Daten auf SSDs und kältere auf Festplatten. Beide können ausfallen: Festplatten haben mechanische Fehler und defekte Sektoren; SSDs haben Verschleiß, Controllerfehler und Firmwarefehler. Redundanz und separate Datensicherungen bleiben für beide sinnvoll.
Bei SSDs erzeugt Defragmentierung Schreibvorgänge und bringt beim Positionierungsaufwand wenig Nutzen. TRIM hilft dem Controller, ungenutzte Daten zu erkennen. Aktuelle Partitionierungswerkzeuge richten Anfänge häufig an 1-MiB-Grenzen aus und vermeiden so ungünstig ausgerichtete Blockanfragen.
Wichtige Erkenntnisse
- Eine SSD beseitigt die mechanische Positionierung, aber Controller und Flash verursachen weiterhin Aufwand.
- Hohe beworbene IOPS-Zahlen erfordern genügend unabhängige gleichzeitig laufende Anfragen.
- Zufällige Schreibvorgänge und GC können die Schreibleistung im stationären Zustand senken.
- TBW zählt Schreibvorgänge des Hosts; DWPD verteilt dieses Budget auf Kapazität und Garantietage.
- Wähle SSDs für schnellen Zugriff und Festplatten für wirtschaftliche große Kapazitäten.
- TRIM und geeignete Ausrichtung helfen SSDs, unnötige Arbeit zu vermeiden.
4Ordne Daten zu und bewerte RAID-Entscheidungen
Ein Verbund kombiniert Festplatten hinter einer Blockgeräteschnittstelle. Sein Aufbau entscheidet, welche Festplatten jeden Block speichern, wie viel Kapazität für Daten bleibt und was einen Ausfall übersteht. Arbeite dich von Striping und gespiegelten Paaren zur XOR-Parität vor und zähle dann physische Ein-/Ausgaben, um die Leistung zu erklären. Beziehe schließlich den degradierten Betrieb und die Wiederaufbauzeit in die Wahl eines Levels ein: Ein intakter Verbund ist nur eine Phase seiner Betriebszeit.
4.1 Bewerte, was ein Verbund leistet
RAID, ein redundanter Verbund preiswerter oder unabhängiger Festplatten, stellt mehrere physische Festplatten als ein logisches Blockgerät dar. Intern leitet eine Zuordnung jeden logischen Block an Datenkopien oder an einen Stripe mit Redundanz. Anwendungen und Dateisysteme können die Blockschnittstelle weiter nutzen, ohne diesen Aufbau zu kennen.
Vergleiche drei getrennte Kennzahlen
Kapazität ist der nutzbare Platz für Benutzerdaten. Zuverlässigkeit beschreibt die Ausfälle, die ein Aufbau tolerieren kann. Leistung umfasst sowohl den Durchsatz über viele Operationen als auch die Latenz einer einzelnen Operation. Ein Level kann eine Kennzahl verbessern und zugleich eine andere verringern. Mehr Gesamtdurchsatz muss auch nicht die Latenz einer einzelnen Blockanfrage senken.
Verwende dieses einfache Modell für gleich große Festplatten:
| Symbol | Bedeutung |
|---|---|
| N | Anzahl der Festplatten |
| B | Blöcke pro Festplatte |
| S | Sequenzieller Durchsatz einer Festplatte |
| R | Zufälliger Durchsatz einer Festplatte für die Anfragegröße |
| T | Latenz einer Anfrage an eine Festplatte |
S und R verwenden dieselben Einheiten für die Datenrate, etwa MB/s. Bei einer Festplatte unterscheiden sie sich stark: Das frühere Zeitbeispiel ergab etwa 195 MB/s sequenziell und 0,34 MB/s bei kleinen zufälligen Lesezugriffen. Die Modellformeln setzen genügend gleichzeitige Arbeit und keinen Engpass im Controller voraus; sie sollen den Aufwand des Aufbaus sichtbar machen.
Benenne das Fehlermodell
Eine Fail-Stop-Festplatte funktioniert korrekt, bis sie vollständig und erkennbar ausfällt. Das macht die grundlegende Betrachtung von RAID handhabbar: Der Verbund weiß, welche Festplatte fehlt. Reale Festplatten können auch unlesbare Sektoren haben oder falsche Byte zurückgeben. Diese partiellen und unbemerkten Fehler benötigen zusätzlich zu einem Aufbau, der den Ausfall einer ganzen Festplatte übersteht, Integritätsprüfungen.
Ein redundanter Verbund läuft im degradierten Betrieb, solange die ausgefallenen Festplatten innerhalb seiner Toleranz bleiben. Er stellt weiterhin Daten bereit, aber die verbliebenen Festplatten leisten zusätzliche Arbeit oder haben weniger freie Lesekapazität. Ein Wiederaufbau füllt eine Ersatzfestplatte anhand der verbliebenen Informationen. Ein Hot-Spare-Laufwerk ist eine eingebaute, ungenutzte Festplatte, die einen zeitnahen Wiederaufbau ermöglicht. RAID-0 hat keine Redundanz und nach dem Verlust eines Mitglieds keinen solchen degradierten Betriebszustand.
Halte Aktualisierungen über mehrere Festplatten konsistent
RAID kann in einem Hardwarecontroller mit eigenem Prozessor und geschütztem Cache, in Betriebssystemsoftware wie Linux md oder innerhalb eines Dateisystems wie ZFS laufen. Jede Variante muss einen Schreibvorgang behandeln, der zwischen Aktualisierungen verschiedener Festplatten unterbrochen wird. Spiegel können voneinander abweichen; Daten und Parität können verschiedene Versionen beschreiben. Der Paritätsfall heißt Write Hole.
Ein geschützter nichtflüchtiger Cache oder ein geeignetes Journal kann ausstehende Aktualisierungen für die Wiederherstellung erhalten. Eine Write-Intent-Bitmap hält fest, welche Bereiche nach einer Unterbrechung erneut synchronisiert werden müssen. Sie bewahrt die neuen Daten nicht auf und ist für sich genommen keine vollständige Lösung des Paritäts-Write-Hole-Problems, wenn außerdem eine Festplatte fehlt.
RAID erhält die Verfügbarkeit bei bestimmten Festplattenausfällen. Das Löschen einer Datei oder ein Schreibvorgang durch Erpressungssoftware erreicht die Kopien des Verbunds über die normale Schnittstelle. Feuer oder Diebstahl kann den gesamten Verbund beseitigen. Separate Datensicherungen bieten wiederherstellbare Versionen oder Kopien über solche gemeinsamen Ereignisse hinaus.
Wichtige Erkenntnisse
- Vergleiche nutzbare Kapazität, Ausfalltoleranz, Durchsatz und Anfragelatenz getrennt.
- Das grundlegende Fail-Stop-Modell nimmt an, dass eine ausgefallene Festplatte erkannt wird.
- Redundante Verbünde können im degradierten Betrieb Daten bereitstellen und auf ein Ersatzlaufwerk wiederaufbauen.
- Unterbrochene Aktualisierungen über mehrere Festplatten benötigen einen Konsistenzmechanismus.
- Eine Bitmap bezeichnet Bereiche zur erneuten Synchronisierung; geschützte Protokolle können Aktualisierungsinformationen bewahren.
- RAID und separate Datensicherungen schützen vor unterschiedlichen Arten von Verlust.
4.2 Finde Blöcke in Stripes und gespiegelten Paaren
RAID-0 verteilt Daten per Striping über Festplatten, ohne redundante Informationen vorzuhalten. Bei einem Chunk von einem Block und einer Nummerierung ab null geht der logische Block A an:
Bei vier Festplatten gehört Block 14 zu Festplatte 2 beim Offset 3. Modulo wählt die Festplatte; ganzzahlige Division zählt die vollständigen Stripe-Zeilen vor diesem Block.
Beziehe die Chunkgröße in die Zuordnung ein
Ein Chunk ist eine Folge aufeinanderfolgender Blöcke, die auf einer Festplatte abgelegt werden, bevor zur nächsten gewechselt wird. Seine Größe sei c Blöcke. Bestimme zuerst den Chunk, dann die Festplatte und den lokalen Offset:
Für Block 14, c = 2 und N = 4 ist der Chunk 7, die Festplatte 3 und der Offset 2. Würdest du direkt A modulo N verwenden, blieben die Chunks aus zwei Blöcken unberücksichtigt. Kleine Chunks können eine große Anfrage auf mehr Festplatten verteilen; größere Chunks halten mehr benachbarte Arbeit auf einer Festplatte. Übliche Chunks in Verbünden reichen von 64 bis 512 KiB; Linux md verwendet häufig standardmäßig 512 KiB.
RAID-0 hat die Kapazität NB und ideale sequenzielle und zufällige Gesamtraten von NS und NR. Eine kleine Anfrage an eine einzelne Festplatte dauert weiterhin etwa T. Der Ausfall eines beliebigen Mitglieds führt zum Verlust eines Teils der Daten des Verbunds. Daher eignet sich dieser Aufbau für reproduzierbare temporäre Daten, wenn Verfügbarkeit unwichtig ist.
Ergänze gespiegelte Kopien
Ein RAID-1-Spiegel aus zwei Festplatten schreibt jeden Block auf beide Mitglieder. RAID-10 verteilt Daten per Striping über gespiegelte Paare. Bei vier Festplatten und Chunks von einem Block über die Paare hinweg geht Block A an Paar A modulo 2 beim Offset ⌊A/2⌋, und beide Mitglieder speichern ihn.
RAID-10 nutzt die Hälfte der Rohkapazität. Es übersteht jeden einzelnen Ausfall und kann N/2 Ausfälle überstehen, wenn jeder ein anderes Paar trifft. Der Verlust beider Mitglieder eines Paars führt zum Verlust der Daten dieses Paars, selbst wenn alle anderen Paare intakt bleiben.
Zähle die nutzbare Arbeit pro Festplatte
Jeder gespiegelte Schreibvorgang aktualisiert zwei Festplatten parallel. Seine Latenz beträgt etwa T, bestimmt durch das langsamere Mitglied, während der zufällige Gesamtschreibdurchsatz NR/2 beträgt. Lesezugriffe können auf alle Kopien verteilt werden, was bei genügend unabhängigen zufälligen Lesezugriffen NR ergibt.
| Vier Festplatten mit je 4 TB; S = 200 MB/s, R = 1 MB/s | RAID-0 | RAID-10 |
|---|---|---|
| Nutzbare Kapazität | 16 TB | 8 TB |
| Sequenzielle Lese-/Schreibrate im einfachen Modell | 800 MB/s | 400 MB/s |
| Zufällige Leserate | 4 MB/s | 4 MB/s |
| Zufällige Schreibrate | 4 MB/s | 2 MB/s |
Das einfache Modell für gespiegelte sequenzielle Lesezugriffe ergibt NS/2, weil Partner die Blöcke des jeweils anderen überspringen. Implementierungen, die jeder Kopie ganze Lesebereiche zuweisen, können besser abschneiden. Spiegelung bietet mehr Kapazität zur Bedienung von Lesezugriffen; sie lässt eine einzelne Festplatte einen einzelnen Lesezugriff nicht in der halben Zeit abschließen.
Wichtige Erkenntnisse
- Verwende Modulo für die Festplatte bei einem Stripe aus einzelnen Blöcken und ganzzahlige Division für den lokalen Offset.
- Bestimme bei größeren Chunks zuerst den Chunk, bevor du die Festplatte auswählst.
- RAID-0 hat die volle nutzbare Kapazität und toleriert keinen Festplattenausfall.
- RAID-10 verteilt Daten per Striping über gespiegelte Paare und nutzt die Hälfte der Rohkapazität.
- Zwei Ausfälle sind nur überlebbar, wenn kein gespiegeltes Paar beide Mitglieder verliert.
- Gespiegelte Schreibvorgänge belegen zwei Festplatten; unabhängige Lesezugriffe können jede der beiden Kopien nutzen.
- Das Ergebnis NS/2 für gespiegelte sequenzielle Lesezugriffe im einfachen Modell hängt von der Aufteilung der Lesezugriffe ab.
4.3 Rekonstruiere und aktualisiere Parität
Ein Paritäts-Stripe speichert Datenblöcke und einen Redundanzblock, der ihrem bitweisen XOR entspricht. Für jede Bitposition ist XOR eins, wenn eine ungerade Anzahl der Eingaben eins ist. Die XOR-Verknüpfung eines Werts mit sich selbst hebt ihn auf. Diese Aufhebung ermöglicht es dem Verbund, einen fehlenden Block zu berechnen.
Stelle einen bekannten fehlenden Block wieder her
Für die Daten 0011, 0101 und 1001 gilt:
Wenn der zweite Block fehlt:
Der Verbund muss wissen, welcher Block zu rekonstruieren ist. Eine Paritätsabweichung zwischen scheinbar intakten Blöcken zeigt Inkonsistenz, identifiziert aber nicht das fehlerhafte Mitglied. Eine Prüfsumme kann helfen festzustellen, welche Daten gültig sind.
Aktualisiere einen Block, ohne den ganzen Stripe zu lesen
Das Rekonstruieren der Parität aus den übrigen Daten ist additive Parität. Bei fünf Datenfestplatten muss das Ändern eines Blocks die anderen vier Datenblöcke lesen und anschließend mit dem neuen Wert verknüpfen. Subtraktive Parität oder Read-Modify-Write entfernt den Beitrag des alten Blocks und fügt den neuen ein:
Ändere im obigen Stripe 0101 in 1100:
Das benötigt zwei Lesezugriffe, alte Daten und alte Parität, gefolgt von zwei Schreibzugriffen, neue Daten und neue Parität. Die Lesephase muss vor der Schreibphase abgeschlossen sein, was etwa 2T Latenz ergibt. Ein Full-Stripe-Write hat jeden neuen Datenblock und berechnet daher die neue Parität direkt, ohne alte Blöcke lesen zu müssen.
Verteile die Paritätsarbeit
| Level | Platzierung der Redundanz | Nutzbare Blöcke | Tolerierte Festplattenausfälle | Ideale Rate kleiner zufälliger Schreibvorgänge |
|---|---|---|---|---|
| RAID-4 | Eine eigene Paritätsfestplatte | (N − 1)B | Ein beliebiger | R/2 |
| RAID-5 | Ein Paritätsblock, abwechselnd auf den Festplatten | (N − 1)B | Ein beliebiger | NR/4 |
| RAID-6 | Zwei unabhängige Redundanzblöcke pro Stripe | (N − 2)B | Zwei beliebige | NR/6 |
Die Paritätsfestplatte von RAID-4 führt für jede kleine Aktualisierung einen Lese- und einen Schreibzugriff aus und erzeugt so einen festen Engpass. RAID-5 verteilt die Parität auf die Mitglieder, sodass Aktualisierungen unabhängiger Stripes gleichzeitig laufen können. Pro kleinem logischen Schreibvorgang fallen weiterhin vier physische Ein-/Ausgaben an. Zufällige Lesezugriffe können alle Festplatten mit NR nutzen; große sequenzielle Schreibvorgänge erreichen etwa (N − 1)S.
RAID-6 ergänzt unabhängige P- und Q-Redundanz und verwendet für Q gewöhnlich einen Reed–Solomon-Code. Zwei Kopien desselben XOR würden nur eine Gleichung ergeben. Die Aktualisierung eines Datenblocks durch Read-Modify-Write liest alte Daten, P und Q und schreibt anschließend alle drei: sechs Ein-/Ausgaben.
Bei vier 4-TB-Festplatten mit R = 1 MB/s bieten RAID-4 und RAID-5 12 TB und zufällige Schreibraten von 0,5 beziehungsweise 1 MB/s. RAID-6 bietet 8 TB und etwa 0,67 MB/s. Bei degradiertem RAID-5 benötigt ein fehlender Datenblock N − 1 Lesezugriffe auf verbliebene Blöcke. Bei RAID-6 mit einem fehlenden Datenblock benötigt die Rekonstruktion mit P N − 2 Lesezugriffe und lässt Q aus; zwei fehlende Blöcke benötigen beide unabhängigen Gleichungen.
Wichtige Erkenntnisse
- XOR-Parität rekonstruiert einen identifizierten fehlenden Block.
- Eine Paritätsabweichung allein kann unbemerkte Datenkorruption nicht lokalisieren.
- Read-Modify-Write liest alte Daten und Parität und schreibt anschließend beide neuen Werte.
- Full-Stripe-Writes vermeiden das Lesen alter Daten und alter Parität.
- RAID-4 bündelt den Paritätsengpass auf einer Festplatte; RAID-5 verteilt ihn.
- RAID-6 benötigt zwei unabhängige Codes und übersteht zwei beliebige Festplattenausfälle.
- Zähle vier Ein-/Ausgaben für einen kleinen RAID-5-Schreibvorgang und sechs für RAID-6.
- Lesezugriffe im degradierten Betrieb rekonstruieren fehlende Daten und beanspruchen die verbliebenen Festplatten stärker.
4.4 Wähle ein Level unter Berücksichtigung des Wiederaufbaus
Beginne die Wahl eines RAID-Levels bei der Arbeitslast und den Verlusten, die das System überstehen muss. Die Kapazität allein berücksichtigt weder den Schreibaufwand noch die Leistung im degradierten Betrieb oder die Zeit zur Wiederherstellung der Redundanz. Ein größerer Verbund hat mehr Festplatten, die Kapazität beitragen, aber während der Wiederherstellung sind auch mehr Mitglieder und Sektoren Risiken ausgesetzt.
Stimme den Aufbau auf die Arbeitslast ab
RAID-0 eignet sich für temporäre Daten, die sich wiederherstellen lassen und bei denen keine Toleranz gegenüber Festplattenausfällen nötig ist. RAID-10 eignet sich für viele kleine zufällige Lese- und Schreibzugriffe, wenn der Verzicht auf die Hälfte der Kapazität akzeptabel ist. Paritäts-RAID nutzt Speicherplatz effizient und funktioniert gut bei großen Full-Stripe-Writes. RAID-6 ergänzt Schutz gegen zwei beliebige Ausfälle, was bei einem langen Wiederaufbau großer Laufwerke nützlich ist.
Bei vier Festplatten bieten RAID-10 und RAID-6 jeweils die Hälfte der Rohkapazität. RAID-10 benötigt pro kleinem logischen Schreibvorgang zwei physische Schreibvorgänge; Read-Modify-Write bei RAID-6 benötigt sechs Ein-/Ausgaben. RAID-6 übersteht jedes Ausfallmuster mit zwei Festplatten, während bei RAID-10 verschiedene Paare betroffen sein müssen. Keine der beiden Optionen ist bei jeder Kennzahl überlegen.
Berechne eine untere Schranke für den Wiederaufbau
Der Wiederaufbau eines Spiegels kopiert dessen verbliebene Partnerfestplatte. Der vollständige Wiederaufbau eines Paritätsverbunds liest verbliebene Daten und rekonstruiert fehlende Blöcke. Die P-Gleichung von RAID-6 kann einen fehlenden Datenblock ohne Q rekonstruieren; die tatsächlichen Lesezugriffe bei der Wiederherstellung hängen von Aufbau und Implementierung ab. Der Wiederaufbau ganzer Geräte kann umfangreiche Lesezugriffe auf die verbliebenen Festplatten umfassen.
Das Beschreiben einer 20-TB-Ersatzfestplatte mit 200 MB/s dauert mindestens:
Das sind etwa 27,8 Stunden ohne konkurrierende Last oder zusätzlichen Engpass. Normale Ein-/Ausgabe, Positionierungsbewegungen, Controllerarbeit und Drosselung der Wiederherstellung können die Dauer verlängern. Ein Hot-Spare-Laufwerk verkürzt die Wartezeit bis zum Beginn des Wiederaufbaus; es beseitigt nicht die Kopierzeit.
Untersuche die Gefährdung während der Wiederherstellung
Ein degradierter RAID-5-Verbund hat seine einzige Toleranz für einen Festplattenausfall bereits aufgebraucht. Ein weiterer Festplattenverlust lässt die Wiederherstellung scheitern. Auch ein unlesbarer Sektor auf einer verbliebenen Festplatte kann einen Stripe mit zwei unbekannten Blöcken hinterlassen: dem Block des fehlenden Mitglieds und dem unlesbaren Block des verbliebenen Mitglieds. Andere Stripes können weiterhin wiederherstellbar sein.
Als Beispielrechnung liest der Wiederaufbau von vier 4-TB-RAID-5-Mitgliedern drei vollständige verbliebene Festplatten:
Werden Fehler mit einem pro 10¹⁴ Bits modelliert, beträgt die erwartete Anzahl 0,96. Das ist eine erwartete Anzahl unter diesem Ratenmodell, keine Ausfallwahrscheinlichkeit von 96 %. Eine Fehlergrenze aus dem Datenblatt ist keine gemessene Vorhersage für einen bestimmten Wiederaufbau. Spezifikationen für Unternehmenslaufwerke geben häufig eine strengere Grenze an, etwa einen Fehler pro 10¹⁵ Bits.
Die Erweiterung von RAID-5 von vier auf acht Festplatten erhöht die nutzbare Kapazität von 75 % auf 87,5 % des Rohspeichers und erhöht zugleich die Menge der bei der Wiederherstellung gelesenen verbliebenen Daten. Ähnliches Alter und ähnlicher Verschleiß schwächen außerdem die Annahme unabhängiger Ausfälle. Eine schreibintensive Datenbank kann RAID-10 bevorzugen, ein großes sequenzielles Archiv RAID-6. Plane Scrubbing ein, um defekte Sektoren aufzudecken, solange Redundanz besteht, und bewahre separate Datensicherungen auf.
Wichtige Erkenntnisse
- Wähle anhand von Arbeitslast, Kapazität, Ausfallmustern und Gefährdung bei der Wiederherstellung.
- Kapazität geteilt durch die Wiederaufbaurate ergibt eine optimistische Wiederaufbauzeit.
- Ein degradierter RAID-5-Verbund toleriert keinen weiteren vollständigen Festplattenausfall.
- Ein unlesbarer Sektor auf einer verbliebenen Festplatte kann die Rekonstruktion seines Stripe verhindern.
- Eine erwartete Fehleranzahl ist keine Ausfallwahrscheinlichkeit.
- Mehr RAID-5-Mitglieder verbessern die Speichereffizienz und erhöhen zugleich die Gefährdung bei der Wiederherstellung.
5Prüfe Daten und behebe nachgewiesene Fehler
Eine Festplatte kann online bleiben und dabei unlesbare oder falsche Blöcke zurückgeben. Unterscheide diese Fehler vom Ausfall einer ganzen Festplatte und vergleiche dann Prüfsummenverfahren und die Fehler, die sie übersehen können. Die Platzierung der Prüfsumme ist ebenso wichtig wie die Berechnung: Korrekte Byte an der falschen Adresse und eine alte Version an der richtigen Adresse benötigen unterschiedliche Prüfungen. Kombiniere Überprüfung mit Redundanz und regelmäßigen Lesezugriffen, um Fehler zu finden und zu beheben, bevor die Wiederherstellungsmöglichkeiten verloren gehen.
5.1 Erkenne partielle und unbemerkte Fehler
Das Fail-Stop-Modell erkennt eine ganze Festplatte als fehlend. Ein Fail-Partial-Gerät funktioniert größtenteils, während einige Blöcke unlesbar oder falsch sind. Solche Fehler können in selten genutzten Daten verborgen bleiben, bis ein weiterer Ausfall diese Blöcke für einen Wiederaufbau nötig macht.
Unterscheide einen gemeldeten Lesefehler von falschen Bytes
Ein latenter Sektorfehler (LSE) bedeutet, dass das Laufwerk einen Sektor nicht lesen kann und einen Fehler meldet. Physische Schäden oder Bitfehler, die die Korrekturfähigkeit des internen ECC übersteigen, können ihn verursachen. Da der Ort bekannt ist, kann ein redundantes System einen Spiegel lesen oder den Block aus der Parität rekonstruieren. Schreibt es die wiederhergestellten Daten erneut, kann das Laufwerk die beschädigte Stelle ausmustern oder auf eine andere Stelle abbilden.
Unbemerkte Datenkorruption bedeutet, dass ein Lesezugriff falsche Byte zurückgibt, ohne einen Fehler zu melden. Fehlerhafte Firmware, ein Controller- oder Busfehler oder ein fehlgeleiteter Schreibvorgang können dies verursachen. Der Erfolgsstatus des Befehls besagt, dass die Übertragung abgeschlossen wurde; er ist keine Ende-zu-Ende-Prüfung des Inhalts.
Unterscheide Adress- und Versionsfehler
| Fehler | Was falsch ist | Warum eine lokale Datenprüfsumme ihn übersehen kann |
|---|---|---|
| Fehlgeleiteter Schreibvorgang | Korrekte neue Byte landen auf der falschen Festplatte oder im falschen Block | Daten und zugehörige Prüfsumme können zusammen übertragen werden |
| Verlorener Schreibvorgang | Eine als abgeschlossen gemeldete Aktualisierung erreicht den Speicher nie | Alte Byte stimmen weiterhin mit ihrer alten Prüfsumme überein |
Ein fehlgeleiteter Schreibvorgang kann einen nicht zugehörigen Block überschreiben und das vorgesehene Ziel unverändert lassen. Ein verlorener Schreibvorgang lässt die alte Version des vorgesehenen Blocks bestehen. Eine Adresskennung hilft, den ersten Fehler zu erkennen; eine unabhängig gespeicherte Erwartung der neuen Version hilft beim zweiten.
Der interne ECC des Laufwerks korrigiert viele Fehler in gespeicherten Bits. Er kann nicht alle Fehler an anderen Stellen des Pfads prüfen, etwa einen Wert, der beschädigt wurde, bevor das Laufwerk seinen Code berechnet, oder nachdem es ihn zurückgegeben hat. Ein auf das Medium begrenzter Schutz lässt andere Komponenten ungeprüft.
Verstehe, warum die Größenordnung zählt
Eine Feldstudie beobachtete 1,53 Millionen Festplatten im produktiven Einsatz über 32 Monate. LSEs betrafen etwa 8,5 % der Nearline-Laufwerke und 1,9 % der Laufwerke der Unternehmensklasse. Eine separate Korruptionsstudie derselben Grundgesamtheit über 41 Monate fand Prüfsummenabweichungen bei 0,86 % beziehungsweise 0,065 %. Dies sind historische Beobachtungen über unterschiedliche Studienzeiträume, keine jährlichen Wahrscheinlichkeiten oder aktuellen Garantien. In einem großen Laufwerksbestand werden selbst Fehler, die pro Laufwerk selten sind, zu regelmäßigen Betriebsereignissen.
Nutze Redundanz mit Überprüfung
Ein gewöhnlicher Lesezugriff auf einen Spiegel mit zwei Kopien kann eine Kopie auswählen, ohne sie mit der anderen zu vergleichen. Er kann beschädigte Byte zurückgeben, wenn keine Prüfsumme geprüft wird. Werden die Kopien verglichen und stimmen sie nicht überein, sagen zwei Kopien allein nicht, welche richtig ist. Eine gültige Prüfsumme bietet eine Grundlage, um eine korrekte Version auszuwählen.
Während eines RAID-5-Wiederaufbaus kann ein LSE auf einer verbliebenen Festplatte die letzte für ihren Stripe nötige Information beseitigen. Dem Verbund fehlt bereits ein Block, und eine XOR-Gleichung kann zwei Unbekannte nicht rekonstruieren. Das Auffinden und Beheben latenter Fehler, solange alle Mitglieder verfügbar sind, erhält Möglichkeiten für den nächsten Ausfall.
Wichtige Erkenntnisse
- Ein LSE ist die gemeldete Unfähigkeit, einen Sektor zu lesen; unbemerkte Datenkorruption liefert falsche Daten ohne Fehlermeldung.
- Fehlgeleitete Schreibvorgänge haben das falsche Ziel; verlorene Schreibvorgänge hinterlassen eine alte Version.
- Der ECC des Laufwerks schützt das Medium, lässt aber andere Teile des Datenpfads ungeschützt.
- Zwei voneinander abweichende Spiegelkopien müssen überprüft werden, um eine korrekte Kopie zu finden.
- Ein latenter Fehler kann nicht mehr behebbar sein, nachdem die Redundanz aufgebraucht ist.
5.2 Berechne Prüfsummen und vergleiche ihre Stärke
Eine Prüfsumme fasst einen Datenblock in einem viel kleineren Wert zusammen. Berechne sie beim Lesen erneut und vergleiche sie mit dem gespeicherten Erwartungswert. Eine Abweichung deckt eine Inkonsistenz auf. Verschiedene Eingaben können denselben Wert haben, was Kollision heißt. Daher bieten übereinstimmende Prüfsummen einen starken Beleg, dessen Aussagekraft von der gewählten Funktion und dem Fehlermuster abhängt.
Probiere XOR und Addition
Für die Byte 0x36, 0x5A, 0xC1 und 0x0F ergibt bitweises XOR 0xA2. Binär lautet die Rechnung:
Kippe das niederwertigste Bit in beiden ersten Bytes, sodass 0x37 und 0x5B entstehen. Die beiden Änderungen heben sich bei XOR auf, und 0xA2 bleibt bestehen. Eine günstige Operation kann eine vorhersehbare Schwachstelle haben.
Eine 8-Bit-additive Prüfsumme addiert die Bytewerte modulo 256:
Das doppelte Kippen oben ändert die Summe zu 0x62, sodass Addition diesen Fehler erkennt. Aber eine Umordnung der Byte lässt sowohl einfache Addition als auch XOR unverändert.
Ergänze die Abhängigkeit von der Position
Eine Fletcher-Prüfsumme führt zwei Summen, die mit null initialisiert werden. Aktualisiere für jedes Byte d die erste Summe und addiere dann ihren neuen Wert zur zweiten:
| Byte | Neues s₁ | Neues s₂ |
|---|---|---|
| 54 | 54 | 54 |
| 90 | 144 | 198 |
| 193 | 82 | 25 |
| 15 | 97 | 122 |
Das Ergebnis ist (97, 122). Das Vertauschen der ersten beiden Byte ergibt (97, 158). Die erste Summe ignoriert die Reihenfolge, aber die zweite gewichtet Positionen durch das laufende Aufsummieren. Fletcher erkennt Einzelbitfehler und viele Bündelfehler bei geringem Aufwand, auch wenn Kollisionen möglich bleiben.
Verfolge eine kurze CRC-Division
Eine zyklische Redundanzprüfung (CRC) behandelt Bits als Polynomkoeffizienten und dividiert mithilfe von XOR. Beim Generator 1011, der x³ + x + 1 darstellt, schützt ein drei Bit langer Rest die Daten. Hänge für die Daten 1101 drei Nullen an:
- Beginne mit 1101000 und verknüpfe mit 1011000 per XOR; es bleibt 0110000.
- Richte den Generator an der führenden Eins aus und verknüpfe mit 0101100 per XOR; es bleibt 0011100.
- Verknüpfe mit 0010110 per XOR; es bleibt 0001010.
- Verknüpfe mit 0001011 per XOR; es bleibt 0000001.
Der Rest ist 001, speichere also 1101001. Die Division dieses Codeworts ergibt null; die Änderung zu 1111001 ergibt den Rest 110. Eine n-Bit-CRC erkennt jedes Fehlerbündel mit einer Länge von höchstens n Bits. CPU-Unterstützung macht CRC für Speicher- und Netzwerkverkehr praktikabel, einschließlich CRC32C in ext4-Metadaten und Btrfs.
Kryptografische Hashfunktionen wie SHA-256 widerstehen außerdem gezielten Kollisionsversuchen. Eine Hashfunktion gegen Manipulation benötigt einen vertrauenswürdigen Erwartungswert; werden sowohl Daten als auch ihr nicht vertrauenswürdiger Hashwert ersetzt, versagt der Vergleich. OpenZFS verwendet normalerweise Fletcher für gewöhnliche Daten und SHA-256 für Deduplizierung. Acht Prüfsummenbytes pro 4-KiB-Block kosten etwa 0,2 % Speicherplatz. Die Erkennung allein liefert keine Ersatzbytes: Die Reparatur benötigt Redundanz oder einen fehlerkorrigierenden Code.
Wichtige Erkenntnisse
- Eine Prüfsummenabweichung erkennt Inkonsistenz; eine Kollision kann einen Fehler verbergen.
- XOR übersieht sich aufhebende Bitänderungen; Addition übersieht umgeordnete Teile.
- Fletcher aktualisiert zwei laufende Summen, sodass Bytepositionen das Ergebnis beeinflussen.
- CRC nutzt Polynomdivision mit XOR und erkennt Fehlerbündel bis zu einer begrenzten Länge.
- Kryptografische Hashfunktionen erhöhen die Kollisionsresistenz, benötigen aber für den Schutz vor Manipulation einen vertrauenswürdigen Erwartungswert.
- Prüfsummen erkennen Fehler; zur Reparatur sind zusätzliche Informationen nötig.
5.3 Platziere Prüfungen dort, wo sie den Fehler erkennen können
Eine Prüfsummenfunktion bestimmt, welche Änderungen erkennbar sind. Der Speicherentwurf bestimmt, mit welchem Wert sie verglichen wird, zu welcher Adresse sie gehört und ob ein korrekter Ersatz existiert. Eine starke Prüfsumme an der falschen Version kann weiterhin veraltete Daten akzeptieren.
Wähle einen Platz für den Erwartungswert
| Platzierung | Funktionsweise | Wichtigste Folge |
|---|---|---|
| Pro Sektor | Zum Beispiel 512 Datenbytes plus 8 Schutzbytes in einem 520-Byte-Sektor | Der Schutz wird mit dem Sektor übertragen |
| Gebündelter Prüfsummenblock | Ein 4-KiB-Block enthält 512 Prüfsummen zu je acht Byte | Die Aktualisierung von Daten kann auch die Aktualisierung eines anderen Blocks erfordern |
| Übergeordneter Blockzeiger | Ein übergeordneter Block speichert die Prüfsumme des referenzierten untergeordneten Blocks | Der erwartete Inhalt wird von außerhalb des untergeordneten Blocks geprüft |
ZFS verwendet Prüfsummen in übergeordneten Blockzeigern und erzeugt so einen Prüfbaum bis zu seiner Wurzel. Schutzinformationen können auch die erwartete Adresse enthalten. Die Referenzkennung von T10 verwendet die unteren 32 Bits der logischen Blockadresse zusammen mit einer 16-Bit-Daten-CRC und einer Anwendungskennung. Eine Adressprüfung kann korrekte Byte zurückweisen, die vom falschen Ort zurückgegeben wurden.
Unterscheide falschen Ort und falsche Version
Angenommen, ein Lesezugriff auf Festplatte 3, Block 1.207 gibt ein gültiges Daten-Prüfsummen-Paar zurück, das für eine andere Adresse gekennzeichnet ist. Die Prüfsumme allein stimmt überein, aber die Adresskennung deckt die Fehlleitung auf.
Ein verlorener Schreibvorgang ist schwieriger: Der alte Inhalt kann eine gültige Prüfsumme und die korrekte Adresse haben. Die Leseprüfung nach dem Schreiben vergleicht einen erneuten Lesezugriff mit dem erwarteten neuen Inhalt und fügt ungefähr eine weitere Ein-/Ausgabe hinzu. Sie muss das gespeicherte Ergebnis prüfen und nicht lediglich dieselbe flüchtige Cache-Kopie. Eine separat gespeicherte erwartete Prüfsumme, etwa in einem festgeschriebenen übergeordneten Blockzeiger, kann stattdessen die veraltete untergeordnete Version zurückweisen. Der separate Erwartungswert muss selbst die beabsichtigte Aktualisierung beschreiben.
Prüfe vor Rückgabe oder Reparatur
Lies bei einem Lesezugriff den Block und seine erwartete Prüfsumme, berechne sie erneut und vergleiche. Besteht die erste Kopie die Prüfung nicht, lies eine andere Kopie oder rekonstruiere den Block aus der Redundanz. Prüfe das Ergebnis, bevor du es zurückgibst. Besteht es die Prüfung, gib die korrekten Daten zurück und überschreibe die beschädigte Kopie. Das ist Selbstheilung. Kann keine gültige Kopie gefunden werden, gib einen Fehler statt ungeprüfter Byte zurück.
Ein gespiegelter ZFS-Pool liest zum Beispiel Festplatte A und erkennt eine Prüfsummenabweichung. Die Kopie von Festplatte B besteht die Prüfung. Das System gibt die Daten von B zurück, repariert A und erfasst den Fehler von A. Gewöhnliche Spiegelung ohne Prüfsummenprüfung könnte die fehlerhaften Byte von A unbemerkt zurückgeben.
Suche nach Fehlern, bevor ein Ausfall die Wiederherstellung erzwingt
Scrubbing liest und prüft gespeicherte Daten regelmäßig, einschließlich Blöcken, auf die Anwendungen selten zugreifen. Solange Redundanz verfügbar ist, kann das System Fehler beheben, bevor ein weiteres Mitglied ausfällt. In der historischen LSE-Studie fand Scrubbing mehr als 60 % der Fehler.
Die Prüfung verbraucht CPU-Zeit, Prüfsummenplatz und manchmal zusätzliche Ein-/Ausgabe. Acht Byte pro 4 KiB kosten etwa 0,2 %; acht pro 512 Datenbytes kosten etwa 1,6 %. Scrubbing-Lesezugriffe konkurrieren mit Anfragen im Vordergrund, daher sind Zeiten geringer Last günstig. Das Ende-zu-Ende-Argument legt die abschließende Prüfung nahe an das Dateisystem oder die Anwendung und deckt damit mehr vom Pfad ab als ein nur auf das Medium bezogener ECC des Laufwerks.
Wichtige Erkenntnisse
- Die Platzierung der Prüfsumme bestimmt, welcher Erwartungswert bei einem Lesezugriff verfügbar ist.
- Adressinformationen erkennen Daten am falschen Ort; ein separater aktueller Erwartungswert kann veraltete Daten erkennen.
- Prüfe eine wiederhergestellte Kopie, bevor du sie zurückgibst oder zur Reparatur verwendest.
- Scrubbing prüft selten gelesene Daten, solange Redundanz sie noch reparieren kann.
- Ende-zu-Ende-Prüfungen erfassen Fehler über das Laufwerksmedium hinaus.
Festplatten und RAID: Beispiele
1Verfolge eine Anfrage, ohne die CPU zu belegen
16 Schritte
- 1EinführungTrenne die Aufgaben einer Ein-/Ausgabeanfrage
Eine Speicheranfrage umfasst mehrere Aufgaben: beschreiben, was zu tun ist, Byte übertragen und den Abschluss melden. Die CPU muss nicht alle Aufgaben ständig selbst ausführen: DMA lässt Hardware die Byte übertragen, und Interrupts ermöglichen der CPU, während des Wartens andere Arbeit auszuführen.
Verfolge eine Anfrage von ihrer Registerschnittstelle über Warten und Übertragung und setze dann den vollständigen Pfad durch Treiber und Controller zusammen.
- 2ErklärungBeginne mit der Geräteschnittstelle
Der Controller verbirgt seine Firmware und interne Hardware hinter Registern. In einem einfachen Ausgabeprotokoll prüft der Treiber, ob der Status bereit ist, stellt Daten bereit, schreibt den Befehl und prüft dann Abschluss und Fehler.
Die Reihenfolge ist wichtig: Das Schreiben des Befehls kann die Hardware sofort starten. Eine Anwendung erreicht diese kontrollierte Operation über einen Systemaufruf.
- 3KernaussageEine Registeradresse kann Arbeit auslösen
Bei MMIO erreichen Lade- und Speicherbefehle Geräteregister über abgebildete Adressen. Ein Registerlesezugriff kann ein Flag zurücksetzen; ein Schreibzugriff kann einen Befehl starten. Gewöhnliche Annahmen über RAM sind hier nicht sicher.
Der Treiber verwendet Zugriffsfunktionen der Plattform und erforderliche Barrieren. Einen Zeiger als
volatilezu deklarieren, gewährleistet nicht die vollständige Reihenfolge zwischen einem RAM-Deskriptor und der MMIO-Benachrichtigung, die das Gerät veranlasst, ihn abzuholen. - 4HerausforderungKorrigiere die Befehlsreihenfolge
Ein Treiber stellt fest, dass ein Ausgabegerät bereit ist, schreibt seinen Befehl und füllt dann das Datenregister. Welche Reihenfolge sollte er verwenden und warum?
---reveal---
Stelle die Daten bereit, bevor du den Befehl ausgibst. Der Befehl startet das Gerät, das andernfalls veraltete Daten verarbeiten könnte. Nach der Einreichung prüft der Treiber den Abschluss und jeden gemeldeten Fehler.
- 5BeispielLass einen anderen Prozess laufen
Prozess C startet einen Lesezugriff, der 7 ms dauert. Prozess D hat eine Berechnung bereit. Beim Polling prüft die CPU während der gesamten Wartezeit wiederholt den Status des Lesezugriffs von C.
Beim interruptgesteuerten Warten wird C blockiert und D kann laufen. Bei Abschluss prüft die Behandlungsroutine die Anfrage und setzt C auf bereit. Der Lesezugriff dauert weiterhin 7 ms; nützliche Berechnung hat diese Zeit ausgefüllt.
- 6ErklärungVergleiche den Benachrichtigungsaufwand
Ein sehr schneller Abschluss kann eintreffen, bevor sich Blockieren und Aufwecken lohnen würden. Eine kurze Polling-Phase vermeidet diesen Aufwand; bei einer hybriden Strategie schläft anschließend der wartende Prozess, falls die Anfrage noch nicht abgeschlossen ist.
Bei hohem Aufkommen teilt die Interruptbündelung einen Interrupt auf mehrere Abschlüsse auf. Das verringert die CPU-Arbeit, kann aber den frühesten Abschluss verzögern, während der Stapel gebildet wird.
- 7HerausforderungWähle eine Stapelgröße anhand ihres Aufwands
Ein Gerät liefert jede Sekunde 60.000 Abschlüsse. Die Behandlung eines Interrupts kostet 6 µs CPU-Zeit. Wie viel CPU-Zeit wird pro Sekunde eingespart, wenn drei Abschlüsse pro Interrupt gebündelt werden?
---reveal---
Separate Interrupts kosten 360 ms pro Sekunde. Stapel mit drei Abschlüssen benötigen 20.000 Interrupts:
Die Einsparung beträgt 240 ms pro Sekunde. Die Bedienzeit des Geräts bleibt unverändert, während sich die Benachrichtigung verzögern kann.
- 8BeispielZähle den bei PIO nötigen Kopieraufwand
Angenommen, 8 KiB Nutzdaten durchlaufen ein 8 Byte großes Datenregister, wobei jeder Zugriff 80 ns kostet. Die CPU muss ausführen:
Diese Operationen übertragen nur die Nutzdaten. DMA übergibt die Übertragung an die Hardware; der CPU bleiben Puffervorbereitung, Einreichung und Abschlussbehandlung.
- 9ErklärungHalte den Zielbereich stabil
Der Treiber bildet den Puffer für den Gerätezugriff ab und hält die zugrunde liegenden Seiten bis zum Abschluss fixiert. Eine Scatter-Gather-Liste beschreibt getrennte Bereiche aus Adresse und Länge, wenn die physischen Seiten nicht benachbart sind.
Das Gerät erhält DMA-Busadressen, keinen gewöhnlichen Benutzerzeiger. Eine IOMMU kann diese Adressen übersetzen und das Gerät auf erlaubten Speicher beschränken.
- 10TippKoordiniere die Sichtbarkeit im Speicher
Eine gültige Adresse ist nur ein Teil einer korrekten DMA-Übertragung. Das Gerät muss die neuesten ausgehenden Daten der CPU sehen, und die CPU muss eingehende, vom Gerät geschriebene Byte sehen.
Auf manchen Plattformen übernimmt die Hardwarekohärenz diese Aufgabe. Andere benötigen eine explizite Cache-Synchronisierung über die DMA-API. Halte den Puffer abgebildet und stabil, bis das Gerät nicht mehr darauf zugreift.
- 11HerausforderungUntersuche eine vorzeitige Pufferfreigabe
Ein Treiber startet DMA in zwei fixierte Seiten, gibt sie vor Abschluss frei und überlässt sie einem anderen Prozess. Warum kann ein späterer Interrupt dies nicht sicher machen?
---reveal---
Das Gerät kann bereits in die erneut verwendeten Seiten geschrieben haben, bevor es seinen Interrupt auslöst. Die Seiten müssen fixiert bleiben und dürfen erst wiederverwendet werden, wenn DMA abgeschlossen ist. Die anschließende Abschlussbehandlung kann die Beschädigung des Speicherinhalts nicht rückgängig machen.
- 12VerbindungLeite die Anfrage durch das Speichersystem
Bei einem gepufferten Lesezugriff mit Cache-Fehlzugriff findet das Dateisystem die angeforderten Speicherblöcke. Die Blockschicht reiht deren Anfragen ein oder fasst sie zusammen, und der Treiber reicht Hardwarebefehle ein.
Diese Aufteilung lässt das Dateisystem für verschiedene Geräte dieselbe Blockschnittstelle nutzen. Eine spezielle Steuerfunktion wie ein gerätespezifischer Befehl kann eine Schnittstelle wie
ioctl()benötigen. - 13ErklärungReiche Arbeit über eine NVMe-Warteschlange ein
Der NVMe-Treiber stellt einen Befehl in eine Einreichungswarteschlange im Speicher und beschreibt dann die MMIO-Doorbell. Der Controller holt den Eintrag ab, überträgt die Nutzdaten per DMA und stellt einen Abschlusseintrag ein. MSI-X kann die Benachrichtigung an einen geeigneten Kern leiten.
Viele Warteschlangenpaare ermöglichen CPU-Kernen, Arbeit mit weniger Konkurrenz um gemeinsame Ressourcen einzureichen als eine einzelne flache Gerätewarteschlange.
- 14HerausforderungBetrachte eine Anfrage vor der Einreichung
Zwei benachbarte Blockleseanfragen warten im Kernel. Wo können sie zusammengefasst werden, und welche spätere Aktion teilt einem NVMe-Controller mit, dass er die eingereichte Arbeit abholen soll?
---reveal---
Die allgemeine Blockschicht kann die benachbarten Anfragen vor der Einreichung durch den Treiber zusammenfassen. Der NVMe-Treiber füllt dann einen Einreichungseintrag und beschreibt das zugehörige Doorbell-Register. Das Zusammenfassen betrifft die Anfrage; die Doorbell kündigt eingereihte Arbeit an.
- 15HerausforderungErkläre geringe CPU-Auslastung bei einem großen Lesezugriff
Ein großer Lesezugriff mit Cache-Fehlzugriff wird abgeschlossen, während ein anderer Prozess rechnet. Die CPU erledigt Einrichtungs- und Abschlussarbeit, kopiert aber nicht Wort für Wort über Geräteregister. Welche Mechanismen erklären die Beobachtung?
---reveal---
DMA überträgt die Nutzdaten direkt in den Speicher. Interruptgesteuertes Warten lässt den lesenden Prozess blockieren, während andere Berechnungen laufen. Treiber und Blockschicht organisieren Einreichung und Abschluss; keiner der beiden Mechanismen lässt die Arbeit des Speichergeräts selbst verschwinden.
- 16ZusammenfassungVerfolge die Zuständigkeit an jeder Schnittstelle
Lies den Ablauf einer Anfrage, indem du fragst, wer die Blockadresse kennt, wer das Controllerprotokoll kennt, wer die Nutzdaten überträgt und wer den Abschluss meldet.
Halte Warten, Kopieren und Scheduling auseinander, wenn du den CPU-Aufwand untersuchst. Derselbe Lesezugriff kann eine Standard-Blockschnittstelle, eine MMIO-Benachrichtigung, DMA und einen Interrupt kombinieren.
2Leite aus Festplattenbewegungen eine Leistungsschätzung ab
13 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungBeginne mit der Arbeit hinter einer Adresse
- 2ErklärungUnterscheide drei Speichergarantien
- 3HerausforderungBeurteile die Meldung eines gepufferten Schreibvorgangs
- 4BeispielRechne die Spindeldrehzahl in eine durchschnittliche Wartezeit um
- 5BeispielAddiere die Übertragung für einen kleinen Lesezugriff
- 6KernaussageVerteile die Positionierung auf mehr Daten
- 7HerausforderungSchätze eine andere zufällige Arbeitslast ab
- 8BeispielZeichne einen LOOK-Weg
- 9BeispielZähle den zirkulären Rückweg
- 10HerausforderungWende eine Strategie auf neu eintreffende Anfragen an
- 11VerbindungBetrachte mehr als die Positionierungsstrecke
- 12HerausforderungWähle, was verbessert werden soll
- 13ZusammenfassungNutze die richtige Größe für die Entscheidung
3Verfolge eine SSD-Überschreibung bis zur Rückgewinnung
14 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungBetrachte, was eine Überschreibung tatsächlich bewirkt
- 2ErklärungWähle die physische Einheit der Operation
- 3KernaussageVerbinde Speicherdichte mit Zellgrenzen
- 4HerausforderungErhalte benachbarte Seiten
- 5BeispielLeite eine logische Überschreibung um
- 6ErklärungKopiere nur, was noch gültig ist
- 7BeispielBerechne den verborgenen Programmieraufwand
- 8TippGib der Garbage Collection bessere Informationen
- 9HerausforderungGewinne einen Block mit mehr gültigen Seiten zurück
- 10ErklärungStelle genügend unabhängige Anfragen bereit
- 11BeispielRechne eine Haltbarkeitsangabe um
- 12HerausforderungDeute eine Verlangsamung im stationären Zustand
- 13HerausforderungNutze Löschinformationen, um interne Arbeit zu verändern
- 14ZusammenfassungVerbinde die physische Sicht mit der Sicht des Hosts
4Leite eine RAID-Entscheidung aus der physischen Arbeit ab
18 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungVergleiche einen Verbund anhand mehrerer Aspekte
- 2ErklärungHalte Schnittstelle und Aufbau auseinander
- 3VerbindungPlane den Zustand nach einem Ausfall
- 4HerausforderungUnterscheide Verfügbarkeit von der Wiederherstellung früherer Versionen
- 5BeispielOrdne einen Stripe mit Ein-Block-Chunks zu
- 6ErklärungErgänze gespiegelte Paare
- 7HerausforderungVerfolge einen größeren Chunk
- 8KernaussageUnterscheide einen Schreibvorgang von vielen
- 9BeispielBerechne die XOR-Parität eines Stripe
- 10BeispielStelle den fehlenden Wert wieder her
- 11BeispielAktualisiere die Parität mit dem geänderten Block
- 12ErklärungVerlagere den Engpass oder ergänze eine Gleichung
- 13HerausforderungWähle die passende Paritätsaktualisierung
- 14BeispielBerechne die Zeit, bevor du einen Wiederaufbau zusagst
- 15ErklärungUntersuche Fehler während dieses Zeitraums
- 16HerausforderungWähle zwischen Aufbauten mit gleicher Kapazität
- 17HerausforderungVerbinde Arbeitslast und Aktualisierungsphasen
- 18ZusammenfassungVerfolge den Aufbau bis zur Wiederherstellung
5Prüfe einen Block, bevor du seinen Bytes vertraust
15 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungFrag dich, was ein erfolgreicher Lesezugriff belegt
- 2ErklärungUnterscheide unlesbare von unbemerkt falschen Daten
- 3BeispielVerfolge das Ziel und die Version
- 4HerausforderungUntersuche einen erfolgreichen Lesezugriff auf veraltete Daten
- 5BeispielBerechne eine additive Prüfsumme
- 6KernaussageErkenne eine Kollision ohne zufälliges Raten
- 7BeispielBerücksichtige Positionen mit Fletcher
- 8HerausforderungWähle die richtige Prüfsummenrechnung
- 9VerbindungVerstehe, was stärkere Prüfungen ergänzen
- 10ErklärungSpeichere den Erwartungswert außerhalb des verdächtigen Werts
- 11BeispielPrüfe die Reparaturquelle
- 12TippFinde verborgene Fehler, solange Kopien bestehen
- 13HerausforderungWähle eine Prüfung für einen falsch platzierten Block
- 14HerausforderungRepariere, bevor die Redundanz aufgebraucht ist
- 15ZusammenfassungVerfolge die Belege für einen zurückgegebenen Block
Festplatten und RAID: Übungsaufgaben
Set 1: Geräte, Zeitberechnung und Schutz von Daten10 Übungsfragen
Frage 1 von 10
Antwort zeigenAntwort ausblenden
Frage 2 von 10
Antwort zeigenAntwort ausblenden
Frage 3 von 10
Antwort zeigenAntwort ausblenden
Frage 4 von 10
Antwort zeigenAntwort ausblenden
Frage 5 von 10
Antwort zeigenAntwort ausblenden
Frage 6 von 10
Antwort zeigenAntwort ausblenden
Frage 7 von 10
Antwort zeigenAntwort ausblenden
Frage 8 von 10
Antwort zeigenAntwort ausblenden
Frage 9 von 10
Antwort zeigenAntwort ausblenden
Frage 10 von 10
Antwort zeigenAntwort ausblenden
Set 2: Warteschlangen, Flash-Wartung und Wiederherstellung10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Set 3: Ordne Anfragen zu und berücksichtige verborgene Arbeit10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
volatile-Doorbell-Zeiger allein unzureichend sein?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Set 4: Erkläre Zielkonflikte bei Leistung und Integrität10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Set 5: Wähle Entwürfe unter mehreren Einschränkungen10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe
Schlüsselbegriffe
A
Additive Prüfsumme
Adresskennung
Antizipierendes Scheduling
B
Befehlsregister
Blockgerät
Blockschicht
Busmaster
C
C-LOOK
C-SCAN
Chunkgröße
D
Degradierter Betrieb
Direkter Speicherzugriff (DMA)
Doorbell-Register
Durchsatz
DWPD
E
Ende-zu-Ende-Integrität
Erwartete Fehleranzahl
F
Fail-Partial-Modell
Fail-Stop-Modell
FCFS
Fehlerkorrigierender Code (ECC)
Fehlgeleiteter Schreibvorgang
Firmware
Fixierte Speicherseite
Flash Translation Layer (FTL)
Flash-Seite
Fletcher-Prüfsumme
Force Unit Access (FUA)
Full-Stripe-Write
G
Garbage Collection (GC)
Gefährdungszeitraum beim Wiederaufbau
Geräteschnittstelle
Gerätetreiber
H
Hierarchische Datenspeicherung
Hot-Spare-Laufwerk
Hybrides Warten
I
Interruptbehandlungsroutine
Interruptbündelung
IOMMU
IOPS
K
Kapazitätseffizienz
Kryptografische Hashfunktion
L
Latenter Sektorfehler (LSE)
Leistung im stationären Zustand
Leseprüfung nach dem Schreiben
Lesestörung (Read Disturb)
Livelock
Logische Blockadresse (LBA)
LOOK
Löschblock
M
MSI-X
N
NAND-Flash
Nicht korrigierbarer Lesefehler (URE)
NVMe
O
Over-Provisioning
P
Polling
Portadressierte Ein-/Ausgabe
in und out auf Geräteregister zu.Positionierungszeit
Programmier-/Löschzyklus
Programmierte Ein-/Ausgabe (PIO)
Prüfsumme
Prüfsumme im übergeordneten Blockzeiger
Prüfsummenkollision
R
RAID
RAID-0
RAID-4
RAID-5
RAID-6
RAID-10
Read-Modify-Write
Rekonstruktion im degradierten Betrieb
Rotationslatenz
S
SCAN
Scatter-Gather-Liste
Schreibverstärkung (Write Amplification)
Scrubbing
Selbstheilung
Sequenzieller Zugriff
Speicherabgebildete Ein-/Ausgabe (MMIO)
Spiegelung
SPTF
Spur
Spurversatz
SSTF
Statusregister
Striping
T
TBW
TRIM
Ü
Übertragungszeit
U
Unbemerkte Datenkorruption
V
Verlorener Schreibvorgang
Verschleißausgleich (Wear Leveling)
W
Warteschlangentiefe
Wiederaufbau (Rebuild)
Write Hole
Write-Back-Cache
X
XOR-Parität
Z
Zeichenorientiertes Gerät
Zerrissener Schreibvorgang (Torn Write)
Zonenaufzeichnung
Zuordnungstabelle
Zyklische Redundanzprüfung (CRC)
Zylinder
Über diese Einheit
Erstelle deine eigenen Lernmaterialien
Mach aus deinen Notizen, Folien und Dokumenten Lernleitfäden, Übungsfragen, Karteikarten und 6 weitere Tools.