GNU/Linux >> Znalost Linux >  >> Linux

Linux – Jak Pdflush, Kjournald, Swapd, atd. spolupracují?

Nedávno jsem viděl otázku, která vyvolala tuto myšlenku. Zde nebo prostřednictvím stroje Google jsem skutečně nenašel odpověď. V podstatě mě zajímá, jak je architektura I/O jádra vrstvená. Například kjournald odeslat do pdflush nebo naopak? Můj předpoklad je, že pdflush (je obecnější k I/O velkokapacitního úložiště) by seděl na nižší úrovni a spouštěl příkazy SCSI/ATA/cokoli, co je nezbytné k provedení zápisu, a kjournald zpracovává datové struktury souborového systému vyšší úrovně před zápisem. Viděl jsem to ale i obráceně, s kjournald přímé propojení s datovými strukturami souborového systému a pdflush každou chvíli se probouzet a zapisovat do zařízení špinavé stránky mezipaměti pomocí kjournald . Je také možné, že tito dva spolu z nějakého jiného důvodu vůbec neinteragují.

V zásadě: Potřebuji nějaký způsob, jak vizualizovat (graf nebo jen vysvětlení) základní architekturu používanou pro odesílání I/O do velkokapacitního úložiště v rámci linuxového jádra.

Přijatá odpověď:

Než probereme specifika týkající se pdflush , kjournald, and kswapd`, pojďme nejprve získat trochu pozadí kontextu toho, o čem přesně mluvíme v souvislosti s linuxovým jádrem.

Architektura GNU/Linux

Architekturu GNU/Linuxu si lze představit jako 2 prostory:

  • Uživatel
  • Jádro

Mezi Uživatelským prostorem a Kernel Space sídlí v knihovně GNU C (glibc ). To poskytuje rozhraní systémového volání, které spojuje jádro s aplikacemi v uživatelském prostoru.

Prostor jádra lze dále rozdělit do 3 úrovní:

  • Rozhraní systémového volání
  • Architectural Independent Kernel Code
  • Architectural Dependent Code

Rozhraní systémového volání jak název napovídá, poskytuje rozhraní mezi glibc a jádro. Architectural Independent Kernel Code se skládá z logických jednotek, jako je VFS (Virtual File System) a VMM (Virtual Memory Management). Architectural Dependent Code jsou komponenty, které jsou kódem specifickým pro procesor a platformu pro danou hardwarovou architekturu.

Schéma architektury GNU/Linux

Po zbytek tohoto článku se zaměříme na logické jednotky VFS a VMM v prostoru jádra.

Subsystémy jádra GNU/Linux

Podsystém VFS

S konceptem vysoké úrovně struktury jádra GNU/Linux se můžeme ponořit trochu hlouběji do subsystému VFS. Tato komponenta je zodpovědná za poskytování přístupu k různým blokovým úložným zařízením, která se nakonec mapují na souborový systém (ext3/ext4/atd.) na fyzickém zařízení (HDD/atd.).

Schéma VFS

Tento diagram ukazuje, jak write() z uživatelského procesu prochází VFS a nakonec se propracuje až k ovladači zařízení, kde je zapsán na fyzické paměťové médium. Toto je první místo, kde se setkáváme s pdflush . Toto je démon, který je zodpovědný za vyprázdnění špinavých dat a bloků vyrovnávací paměti metadat na paměťové médium na pozadí. Diagram to neukazuje, ale existuje další démon, kjournald , který se nachází vedle pdflush , provádějící podobnou úlohu zapisování špinavých bloků žurnálu na disk. POZNÁMKA: Žurnálové bloky je způsob, jakým souborové systémy jako ext4 a JFS sledují změny na disku v souboru předtím, než k těmto změnám dojde.

Související:Cheat Sheet příkazů CLI pro Linux

Výše uvedené podrobnosti jsou dále diskutovány v tomto dokumentu.

Přehled funkce write() kroky

Abychom poskytli jednoduchý přehled operací I/O sybsystému, použijeme příklad, kde funkce write() je volána aplikací uživatelského prostoru.

  1. Proces požaduje zapsání souboru pomocí write() systémové volání.
  2. Jádro aktualizuje mezipaměť stránky namapovanou na soubor.
  3. O vyprázdnění mezipaměti stránek na disk se stará vlákno jádra pdflush.
  4. Vrstva souborového systému spojuje každý blokový buffer do bio struct (viz 1.4.3, „Vrstva blokování“ na straně 23) a odešle požadavek na zápis do vrstvy blokového zařízení.
  5. Vrstva blokového zařízení přijímá požadavky z vyšších vrstev a provádí operaci výtahu I/O a umísťuje požadavky do fronty požadavků I/O.
  6. O operaci zápisu se postará ovladač zařízení, například SCSI nebo jiné ovladače specifické pro zařízení.
  7. Firmware diskového zařízení provádí hardwarové operace, jako je vyhledávací hlava, rotace a přenos dat do sektoru na plotně.

Podsystém VMM

Pokračujeme v hlubším ponoru a nyní se můžeme podívat do subsystému VMM. Tato komponenta je zodpovědná za udržování konzistence mezi hlavní pamětí (RAM), swapem a fyzickým paměťovým médiem. Primárním mechanismem pro udržení konzistence je bdflush . Protože jsou stránky paměti považovány za nečisté, je třeba je synchronizovat s daty, která jsou na paměťovém médiu. bdflush bude koordinovat s pdflush démony pro synchronizaci těchto dat s paměťovým médiem.

Schéma VMM

Vyměnit

Když dojde k nedostatku systémové paměti nebo vyprší časovač swapování jádra, kswapd démon se pokusí uvolnit stránky. Pokud počet volných stránek zůstane nad free_pages_high , kswapd neudělá nic. Pokud však počet volných stránek klesne níže, pak kswapd zahájí proces obnovení stránky. Po kswapd označil stránky pro přemístění, bdflush se postará o synchronizaci všech zbývajících změn na paměťovém médiu prostřednictvím pdflush démoni.

Odkazy a další informace

  • Konceptuální architektura linuxového jádra
  • Linuxový I/O Stack Diagram – ver. 0.1, 2012-03-06 – popisuje linuxový I/O stack od jádra 3.3
  • Aktualizace místního souborového systému – konkrétně snímek č. 7
  • Interaktivní mapa jádra Linuxu
  • Porozumění virtuální paměti v Red Hat Enterprise Linux 4
  • Pokyny pro výkon a ladění Linuxu – konkrétně strany 19–24
  • Anatomie linuxového jádra
  • Případ pro sémantické vědomé vzdálené replikace

Linux
  1. Jak zvládnout paniku linuxového jádra

  2. Jak upgradovat jádro na ploše Linuxu

  3. Jak zkontrolovat verzi jádra v Linuxu

  1. Jak nainstalovat Linux Kernel 5.0 na CentOS 7

  2. Linux – Jak správně znovu načíst modul jádra?

  3. Jak kódovat modul jádra Linuxu?

  1. Jak linuxové jádro zpracovává přerušení

  2. Jak může být linuxové jádro tak malé?

  3. Jak zjistím, zda je v linuxu povoleno KPTI?