Linux 5.16 beschleunigt Spiele und steigert die Systemleistung

Linux 5.16 steht im Zeichen von Leistungssteigerung, Optimierung und Modernisierung. Neu hinzukommen sind unter anderem futex2 und DAMON Operation Schemes.

In Pocket speichern vorlesen Druckansicht 112 Kommentare lesen

(Bild: J0hnTV/Shutterstock.com)

Lesezeit: 13 Min.
Von
  • Oliver Müller
Inhaltsverzeichnis

Linux 5.16 ließ sich eine Woche länger Zeit als ursprünglich erwartet. Linus Torvalds entschied sich, dem Kernel etwas mehr Zeit zum Reifen zu geben. Auslöser waren nicht etwa Probleme oder alarmierende Testergebnisse, sondern schlicht die Sorge, das Testen könnte infolge der Feiertage und der Woche "zwischen den Jahren" zu knapp kommen.

Tatsächlich kamen in der zusätzlichen Woche mit rc8 keine großen Änderungen mehr auf den Tisch. Der neue Kernel erblickte in der Nacht zum Montag das Licht der Welt und war eher als Wartungsrelease erwartet worden. Dennoch bietet der 5.16 einige interessante Neuerungen wie den Einstieg in futex2, aktives Alarmieren von Dateisystemfehlern auf Kernel-Ebene, einen "cluster-bewussten" CPU-Scheduler und erhöhte Sicherheit. Auch eine Mammutaufgabe durch Folio-Pages für eine effiziente und leistungssteigernde Speicherverwaltung geht der neue Kernel an.

Linux 5.16 gibt den Startschuss für futex2 und verspricht insbesondere bei der Emulation von Windows-Spielen bessere Performance. futex2 soll auf lange Sicht den in die Jahre gekommenen und historisch gewachsenen System-Call futex() ablösen. Futex steht für "Fast User Mutex". Es erlaubt Mutexes, also Sperren für den konkurrierenden Zugriff, nicht nur im Kernel-Space auch im Userspace zu verwenden.

Das Konzept wurde bereits 2003 im Kernel 2.6.0 in Form des System-Calls futex() eingeführt. Erste zentrale Anwendung fand der System-Call fürs Steuern der Nebenläufigkeit von POSIX-Threads. Zuvor konnten Userspace-Prozesse lediglich auf Semaphoren beispielsweise über eventfd() beim Zugriff auf gemeinsam genutzte Ressourcen bauen.

Semaphoren bieten einen Mechanismus, um frei gewordene Ressourcen zu "signalisieren". Ein auf eine frei werdende Ressource wartender Prozess oder Thread prüft regelmäßig, ob der Zugriff nun möglich ist. Mutexes hingegen sperren Ressourcen, bis diese wieder frei werden. Ein Aufruf von futex() blockiert den Prozess beziehungsweise Thread solange, bis die betreffende Ressource frei wird. Mutexes sind daher grundsätzlich in der Anwendung schlanker und im Kernel CPU-defensiver als Semaphoren.

Durch die Beliebtheit von futex() kommt der System-Call in vielen Anwendungsszenarien zum Einsatz. Daher wurden Rufe nach einem Reengineering des Calls lauter, um anwendungsfallbezogene einzelne Funktionen oder zumindest Wrapper in der libc zu erhalten. Als Reaktion folgte vor rund zwei Jahren der futex2-Ansatz von André Almeida mit dem Ziel einen flexibles Futex-Subsystem zu schaffen.

Von einem Ersatz für das alte futex() ist futex2 auch in Linux 5.16 noch weit entfernt. Der eingeflossene Ansatz ist eine Light-Variante, der ein spezifisches Problem adressiert. Das bisherige futex() ist in seiner Funktion beschränkt. Es kann lediglich einen Futex abfragen. Sind mehrere zu berücksichtigen, geht das nur hintereinander. Mit dem Manko in mehrere blockierende Aufrufe von futex() in Serie zu laufen. Das hat gerade bei portierten Windows-Spielen Nachteile, die Emulationsschichten wie WINE oder Protons Steam Play nutzen.

Die Windows-API bietet die Funktion WaitForMultipleObjects(), die das Abfragen mehrerer Objekte erlaubt. Diese Objekte lassen sich analog zu den Ressourcen und Futexes in Linux verwenden. Windows kann die Abfrage aber in einem Aufruf parallel durchführen. Linux bislang nicht. An dieser Stelle setzt Linux 5.16 mit dem ersten futex2-Patch an. Der Kernel führt den System-Call futex_waitv() ein, der – anders als futex() – auf mehrere Mutex beziehungsweise deren Freigabe warten kann. Damit kann Linux 5.16 in Emulationsschichten WaitForMultipleObjects() eleganter und effizienter nachbilden. Portierte Spiele profitieren von einem Geschwindigkeitsgewinn.

André Almeida sieht womöglich das Potential, auch native Linux-Spiele mithilfe des neuen System-Calls zu beschleunigen: "Native Game-Engines werden ebenfalls davon profitieren, vorausgesetzt dieses Wait-Muster ist üblich für Spiele." Eine Dokumentation von futex2 und futex_waitv() findet sich in den entpackten Kernel-Sourcen unter Documentation/userspace-api/futex2.rst, alternativ auch im betreffenden Patch.