Linux 6.13 mit neuem Multitasking

Linux 6.13 feilt am Multitasking und bringt kritische Fixes. Feingranulare Zeitstempel und abgesichertes Virtualisieren auf ARM64 hat der neue Kernel im Gepäck.

vorlesen Druckansicht 82 Kommentare lesen
Pinguin sitzt vor einem Computer, der einen Pinguin und die Schrift "Linux" anzeigt

(Bild: Bild erstellt mit KI in Bing Designer durch heise online / dmk)

Lesezeit: 9 Min.
Von
  • Oliver MĂĽller
Inhaltsverzeichnis
close notice

This article is also available in English. It was translated with technical assistance and editorially reviewed before publication.

Pünktlich nach sieben Release-Kandidaten erschien in der Nacht von Sonntag auf Montag der neue Linux Kernel 6.13. Spannend war die Aufnahme von kritischen Patches, die auch in die Vorgänger-Kernel einfließen sollen.

Eine groĂźe Baustelle ist das erneute Feilen am Scheduler. Die Multitasking-Modi verschieben sich und schrumpfen von vier auf drei. Im PowerPC-Bereich heiĂźt es Abschied nehmen.

Jeder moderne Kernel eines Betriebssystems – wie Linux – setzt heutzutage auf "präemptives Multitasking". "Präemptiv" heißt so viel wie "zuvorkommend" oder "unterbrechend" (engl. Preemption). Um die Illusion von parallel ausgeführten Programmen zu erzeugen, erhalten die Prozesse (oder auch Threads) Zeitscheiben. In diesen Zeitscheiben laufen sie auf dem Prozessor oder einem Kern desselben. Nach dem Verstreichen des Zeitschlitzes sichert der Kernel den Zustand des aktuellen Prozesses, holt den gesicherten Zustand eines anderen Prozesses hervor und startet diesen in seinen Anteilen Rechenzeit. Dieser Vorgang ist der Kontextwechsel.

Bislang kannte der Linux-Kernel vier wählbare Modi für Preemption. PREEMPT_NONE als einfachste Form. Sie erlaubt das Umschalten zum nächsten Prozess und seiner Zeitscheibe nur dann, wenn der Zeitschlitz des anderen Prozesses abgelaufen ist. PREMPT_VOLUNTARY kann den laufenden Prozess an einer Vielzahl von vordefinierten Stellen im Kernel auch dann unterbrechen, wenn seine Zeit noch nicht abgelaufen ist.

Videos by heise

Einen Schritt weiter geht PREEMPT_FULL. Es erlaubt, einen Prozess jederzeit zu unterbrechen. Ausgenommen sind lediglich Stellen, an denen der Kernel es explizit nicht erlaubt. Dies ist beispielsweise dann der Fall, wenn der Prozess oder Thread einen Spinlock hält. Ein Spinlock ist dabei eine Sperre, um den konkurrierenden Zugriff auf Ressourcen durch mehrere Prozesse zu verhindern. Der Spinlock kann im wechselseitigen Ausschluss immer nur von einem Prozess gehalten werden. Die anderen haben zu warten, bis dieser den Spinlock aufhebt und damit die Ressource frei gibt.

Schließlich bindet PREEMPT_RT im Echtzeitbetrieb den Prozesswechsel an viele andere Kriterien. Bei PREEMPT_RT ist es auch dann möglich, einen Prozess zu unterbrechen, wenn dieser einen Spinlock hält.

Von PREEMPT_NONE bis PREEMPT_RT steigt jeweils die Reaktionsfähigkeit des System an. Das System kann schneller auf Ereignisse reagieren. Ein solches Ereignis kann ein Tastenschlag auf der Tastatur, eine Mausbewegung oder ein Interrupt sein. Erkauft wird dieses schnelle Reagieren mit einem möglich "Zerhacken" von Prozessen, insbesondere langlaufenden.

Tasks mit intensiver Prozessorlast mögen es, lange ungestört laufen zu können. Werden diese zerstückelt, sinkt der Durchsatz (Throughput) des Systems. Zudem es – je Preempt-Modus – bei jedem Unterbrechen zu neuen gesperrten Ressourcen kommen kann. Vereinfacht gesagt, muss sich der Prozess bei jedem Aussetzen des Ablaufs neu sortieren. Kurzläufer hingegen stören sich am Unterbrechen weniger. Wer kurz läuft, bietet weniger Möglichkeiten fürs "Zerhacken" der Zeitscheibe.

Daher gibt es kein universell passendes Modell fürs präemptive Multitasking. Je nach Workload, also des Zeit- und Ressourcenbedarfs einer Aufgabe, ist der eine oder andere Modus im Kernel passender. Daher liefern die meisten Distributionen den Kernel mit dem Pseudomodus PREEMPT_DYNAMIC aus. Dahinter versteckt sich nichts anderes als die Möglichkeit, zwischen allen Modi zur Bootzeit umzuschalten – mit Ausnahme von PREEMPT_RT. Voreingestellt ist dabei PREEMPT_VOLUNTARY.

Wer sehen will, welcher Modus bei seinem Linux gerade aktiv ist, kann das – je nach Kernel und Konfiguration – aus /sys/kernel/debug/sched/preempt lesen. Ein einfacher cat auf die Pseudodatei liefert den Modus zurück. Ist PREEMPT_DYNAMIC aktiv, ergibt das eine Ausgabe "none (voluntary) full", wobei in Klammern der aktuelle Modus hervorgehoben ist. Der Modus beim Booten lässt sich dann auch mit dem Parameter preempt in der Kernel-Kommandozeile (cmdline) setzen. Zum Beispiel für PREEMPT_FULL mit preempt=full.

Je nach Preempt-Modus git es viele Stellen im Kernel, wo ein Kontextwechsel vor Ablauf der Zeitscheibe stattfinden könnte. Dort prüft der Kernel anhand vieler Variablen, ob der aktuelle Prozess zu unterbrechen ist. Das zerhackt den Prozessablauf jedes Mal und generiert Overhead. Das ist wenig effizient.

Mit dem neuen Kernel kommt ein neuer Modus hinzu. "Lazy Preempt" (PREEMPT_LAZY) verzögert den Kontextwechsel, wenn ein Prozess unterbrochen werden könnte, dies aber nicht dringend erforderlich ist. Statt sofort den Kontext zu wechseln, wird der Wechsel aufgeschoben, bis ein günstiger Zeitpunkt erreicht ist. Ein solcher Zeitpunkt kann etwa das Ende eines kritischen Abschnitts oder der nächste Wechsel vom Userspace zurück in den Kernelspace sein. Nur in kritischen Momenten unterbricht der Kernel den Prozess tatsächlich sofort.

Dieser neue Modus ist eine Mischung aus PREEMPT_NONE und PREEMPT_YOLUNTARY und ersetzt beide Modi. PREEMPT_FULL bleibt erhalten, ebenso PREEMPT_RT.

Ebenfalls den Scheduler betreffend ist ein in letzter Minute eingereichter kritischer Patch für den EEVDF-Scheduler. Dort sorgte der Entity-Replacement-Bug in einigen Situationen für Verzögerungen im Scheduling.

Noch am Sonntag nahm Linus Torvalds diesen kritischen Patch in den neuen Kernel auf. Das somit auf den letzten DrĂĽcker. Zudem soll dieser Patch auch in die Kernel des letzten Jahres rĂĽckportiert (Backport) und damit in diesen ebenfalls aufgenommen werden.

Zeitstempel sind für manche Anwendungen zur Synchronisation und zum Nachverfolgen von Änderungen so wichtig, dass die normale Auflösung nicht ausreicht. Ein solcher Fall ist etwa NFSv3, das über den Zeitstempel erkennt, ob ein Cache noch gültig ist. Ist die Zeit mit zu großen Abständen quantisiert, kann es dazu kommen, dass ein Client mit einem alten Stand einer Datei arbeitet. Inkonsistenzen sind da vorprogrammiert.

Andererseits führen zu feingranulare Zeitstempel dazu, dass wesentlich häufiger die Metadaten im Dateisystem zu aktualisieren sind. Werden beispielsweise nur Zeiten im Sekundentakt erfasst, schreibt das System maximal im Sekundentakt die Metadaten neu. Werden Zeiten auf Ebene von Millisekunden erfasst, muss das System im Extremfall die Metadaten tausendmal in der Sekunde aktualisieren.

Linux 6.13 führt diese feingranularen Zeiten intelligent ein. Die normalen Zeitstempel in Millisekunden bleiben erhalten und werden auch durchgängig benutzt. Die feineren Stempel verwendet und aktualisiert das System nur, wenn eine Anwendung diese explizit anfragt. Damit schafft der Kernel den Balanceakt zwischen Performanz – sich nicht mit Zeitstempeln "totzuschreiben" – und der Anforderung spezieller zeitpeniblen Anwendungen.

Für XFS, Ext4 Direct I/O und einige Soft-RAID-Modi unterstützt Linux nun atomare Schreibvorgänge (atomic writes). Diese sind dann notwendig, wenn Daten geschrieben werden sollen, die größer als die hardwareseitig vorgegebene Sektorgröße des Datenspeichers sind. Es können also mehrere Sektoren in einem Schreibvorgang als ein logisch zusammenhängender Bereich aufgefasst werden. Es werden beim "atomic write" entweder alle Sektoren in einem Schreibvorgang geschrieben oder keiner.

Auf ARM64 können Linux-Gäste in abgesicherten virtuellen Maschinen (VM) ablaufen. Linux implementiert hierzu die "ARM Confidential Compute Architecture" (CCA). Damit bleibt der Speicherbereich der VM vor den Augen des Hypervisors verborgen.

AuĂźerdem unterstĂĽtzt Linux 6.13 "Guarded Control Stack" im Userspace. Das ist die Shadow-Stack-Variante von ARM.

Um den Kernel von Ballast zu befreien, setzt auch Linux 6.13 den Rotstift bei ĂĽberholten Features an. So trifft es dieses Mal den PowerPC 970FX. Vielen ist dieser Prozessor noch im "Apple-Sprech" als PowerPC G5 bekannt. Doch hier heiĂźt es aufatmen, die alten Macs mit G5 werden auch weiterhin unterstĂĽtzt.

Betroffen von dem Rauswurf aus dem Kernel sind die Evaluationsboards "Maple" mit 970FX. Neben diesen sind gemäß Commit-Message jedoch sehr wohl auch IBM Blades JS20/JS21 betroffen. Diese PowerPC-Blades haben unter Linux mittel- bis langfristig keine Zukunft mehr. Ebenso ergeht es den YDL Powerstations, denen seinerzeit "Yellow Dog Linux" Leben einhauchte.

Allerdings bleibt die vermeintlich zugeschlagene Tür ins Linux-Land einen kleinen Spalt weit offen. Gemäß der Commit-Message lassen sich die Änderungen zurückdrehen, sollte ein Aufschrei betroffener Nutzer zum Kernel-Team hallen.

Der Lazy-Modus fürs präemptive Multitasking im Scheduler verspricht mehr Effizienz und eine bessere Balance zwischen Reaktionsfähigkeit und Prozessunterbrechungen. Der Last-Minute-Patch im Scheduler ist kritisch und soll auch in ältere Kernel wandern. Darunter auch der aktuelle Kernel 6.12 mit Langzeit-Support, auf den einige Distributionen aufbauen werden. Ein ausführliches Testen dieses Patches erfolgt aufgrund des Zeitdrucks leider erst in freier Wildbahn.

Die feingranularen Zeitstempel haben es endlich in der Kernel geschafft. Sie waren schließlich schon mal für Linux 6.6 vorgesehen, flogen aber im dritten Release-Candidate 6.6-rc3 wieder heraus. Die atomaren Schreibvorgänge waren auch schon länger erwartet worden, hier liefert 6.13 konsequent nach.

Linux 6.13 bringt nicht nur neue Treiber und Fehlerbereinigungen. Es ist eine solide Weiterentwicklung und nicht nur Wartungsrelease. Bleibt zu hoffen, dass in letzter Minute aufgenommene Patches die Suppe nicht versalzen.

Der neue Kernel steht wie immer unter kernel.org im Quelltext zum Download bereit. Das ausführliche Changelog gibt Auskunft über sämtliche Änderungen am neuen Linux-Herz.

(dmk)