Wie arbeiten pdflush, kjournald, swapd usw. zusammen?

17

Kürzlich sah eine Frage, die diesen Gedanken auslöste. Konnte hier oder über die Google-Maschine keine Antwort finden. Grundsätzlich interessiert mich, wie die Kernel-E / A-Architektur geschichtet ist. ZB kjournaldVersand nach pdflushoder umgekehrt? Ich gehe davon aus, dass pdflush(generischer für Massenspeicher-E / A) die SCSI / ATA / whatever-Befehle, die zum tatsächlichen Ausführen der Schreibvorgänge erforderlich sind, auf einer niedrigeren kjournaldEbene abgelegt werden und vor dem Schreiben Dateisystemdatenstrukturen auf höherer Ebene verarbeitet werden. Ich konnte es aber auch anders herum sehen, indem ich kjournalddirekt mit den Dateisystemdatenstrukturen verbunden war und ab und zu pdflushaufwachte, um schmutzige Pagecache-Seiten auf das Gerät zu schreibenkjournald. Es ist auch möglich, dass die beiden aus einem anderen Grund überhaupt nicht interagieren.

Grundsätzlich: Ich brauche eine Möglichkeit, um die grundlegende Architektur für das Versenden von E / A an den Massenspeicher im Linux-Kernel zu visualisieren (Grafik oder nur eine Erläuterung).

Bratchley
quelle
1
Ist es das, wonach du suchst? oss.org.cn/ossdocs/linux/kernel/a1/index.html
slm
1
Außerdem gibt es diese Präsentation: 7. Folie in: slideshare.net/LukCzerner/local-file-systems-update
slm
1
Es gibt dieses Diagramm, das ich auch gefunden habe: thomas-krenn.com/de/oss/linux-io-stack-diagram/…
slm
1
Ich habe diese interaktive Kernel-Map gefunden, die zeigt, wie die verschiedenen Komponenten des Kernels zusammenpassen: makelinux.net/kernel_map
slm
1
Eine weitere Ressource, Seiten 19-24: Linux Performance and Tuning Guidelines . Dieser sieht genau so aus, wie Sie es suchen.
SLM

Antworten:

21

Bevor wir die Einzelheiten in Bezug auf diskutieren pdflush, kjournald, andkswapd`, lassen Sie uns zuerst ein wenig Hintergrund auf dem Hintergrund dessen, was genau wir reden in Bezug auf den Linux - Kernel.

Die GNU / Linux-Architektur

Die Architektur von GNU / Linux kann als zwei Räume betrachtet werden:

  • Benutzer
  • Kernel

Zwischen dem User Space und dem Kernel Space befindet sich die GNU C Library ( glibc). Dadurch wird die Systemaufrufschnittstelle bereitgestellt, die den Kernel mit den User-Space-Anwendungen verbindet.

Der Kernelraum kann weiter in 3 Ebenen unterteilt werden:

  • Systemaufruf-Schnittstelle
  • Architekturunabhängiger Kernel-Code
  • Architekturabhängiger Code

Wie der Name schon sagt, bietet die Systemaufrufschnittstelle eine Schnittstelle zwischen dem glibcund dem Kernel. Der Architectural Independent Kernel Code besteht aus den logischen Einheiten wie dem VFS (Virtual File System) und dem VMM (Virtual Memory Management). Der Architectural Dependent Code ist der prozessor- und plattformspezifische Code für eine bestimmte Hardwarearchitektur.

Diagramm der GNU / Linux-Architektur

                                 ss von gnu / linux arch.

Im weiteren Verlauf dieses Artikels konzentrieren wir uns auf die logischen VFS- und VMM-Einheiten im Kernel-Space.

Subsysteme des GNU / Linux-Kernels

                                    ss von kernel com

VFS-Subsystem

Mit einem übergeordneten Konzept der Struktur des GNU / Linux-Kernels können wir etwas tiefer in das VFS-Subsystem eintauchen. Diese Komponente ist für den Zugriff auf die verschiedenen Blockspeichergeräte verantwortlich, die letztendlich einem Dateisystem (ext3 / ext4 / etc.) Auf einem physischen Gerät (HDD / etc.) Zugeordnet sind.

Diagramm von VFS

ss von vfs

Dieses Diagramm zeigt, wie ein write()Prozess eines Benutzers das VFS durchläuft und sich schließlich zum Gerätetreiber hinunterarbeitet, wo er auf das physische Speichermedium geschrieben wird. Dies ist der erste Ort, an dem wir begegnen pdflush. Dies ist ein Daemon, der für das Leeren von fehlerhaften Daten und Metadaten-Pufferblöcken auf das Speichermedium im Hintergrund verantwortlich ist. Das Diagramm zeigt dies nicht, aber es gibt einen anderen Daemon, kjournaldder nebenan sitzt pdflushund eine ähnliche Aufgabe ausführt, indem er schmutzige Journalblöcke auf die Festplatte schreibt. HINWEIS: Dateisysteme wie ext4 und JFS Änderungen an der Festplatte in einer Datei verfolgen, bevor diese Änderungen wirksam werden.

Die obigen Details werden in diesem Papier weiter diskutiert .

Übersicht der write()Schritte

Um einen einfachen Überblick über die I / O-Sybsystem-Operationen zu erhalten, verwenden wir ein Beispiel, in dem die Funktion write()von einer User Space-Anwendung aufgerufen wird.

  1. Ein Prozess fordert an, eine Datei über den write()Systemaufruf zu schreiben .
  2. Der Kernel aktualisiert den der Datei zugeordneten Seiten-Cache.
  3. Ein pdflush-Kernel-Thread leert den Seiten-Cache auf die Festplatte.
  4. Die Dateisystemschicht fügt jeden Blockpuffer zu einem zusammen bio struct( siehe 1.4.3, „Blockschicht“ auf Seite 23 ) und sendet eine Schreibanforderung an die Blockgeräteschicht.
  5. Die Blockgeräteschicht empfängt Anforderungen von den oberen Schichten und führt eine E / A-Aufzugsoperation durch und stellt die Anforderungen in die E / A-Anforderungswarteschlange.
  6. Ein Gerätetreiber wie SCSI oder andere gerätespezifische Treiber kümmern sich um den Schreibvorgang.
  7. Eine Plattengerätefirmware führt Hardwareoperationen wie Suchkopf, Rotation und Datenübertragung zum Sektor auf dem Plattenteller aus.

VMM-Subsystem

Wir setzen unseren tieferen Tauchgang fort und können uns nun das VMM-Subsystem ansehen. Diese Komponente ist für die Aufrechterhaltung der Konsistenz zwischen Hauptspeicher (RAM), Swap und dem physischen Speichermedium verantwortlich. Der primäre Mechanismus zur Aufrechterhaltung der Konsistenz ist bdflush. Da Speicherseiten als verschmutzt gelten, müssen sie mit den Daten auf dem Speichermedium synchronisiert werden. bdflushkoordiniert mit pdflushDämonen, um diese Daten mit dem Speichermedium zu synchronisieren.

Diagramm von VMM

                ss von VMM

Tauschen

Wenn der Systemspeicher knapp wird oder der Kernel-Swap-Timer abläuft, versucht der kswapdDämon, Seiten freizugeben. Solange die Anzahl der freien Seiten oben bleibt free_pages_high, kswapdwird nichts unternommen. Wenn jedoch die Anzahl der freien Seiten kswapdgeringer ist , wird der Seitenumklärungsprozess gestartet. Nachdem kswapdSeiten für den Umzug markiert wurden, bdflushwerden alle ausstehenden Änderungen am Speichermedium über die pdflushDaemons synchronisiert .

Referenzen & weiterführende Literatur

slm
quelle
1
Ich werde einen Tag warten, bevor ich dies als Antwort akzeptiere und das Kopfgeld vergebe, damit es auf der "Kopfgeld" -Seite bleibt. Auf diese Weise hat jeder, der es schon einmal gesehen hat, die Möglichkeit, es zu bemerken, jetzt eine Antwort.
Bratchley
1
Nochmals vielen Dank, BTW. Sie haben wirklich alles getan, um das zu erforschen.
Bratchley