Kernel-Log – Was 2.6.38 bringt (2): Dateisysteme
Linux 2.6.38 enthält die schon seit über einem halben Jahr viel diskutierten und von Torvalds heiß erwarteten Patches, die die Skalierbarkeit des VFS verbessern. Ext3 und XFS beherrschen nun das für SSDs interessante Batched Discard; Btrfs und SquashFS unterstützten neue Kompressionstechniken.
- Thorsten Leemhuis
Am Mittwoch hat Linus Torvalds die fünfte Vorabversion der Ende März erwarteten Kernel-Version 2.6.38 freigegeben und dabei angemerkt, dass einige Fehler korrigiert worden seien, aber keine Änderung besonders hervor sticht und die Dinge ziemlich normal aussehen. Das Kernel-Log nimmt das zum Anlass, den Überblick über die wichtigsten Neuerungen von Linux 2.6.38 mit dem zweiten Teil der Mini-Serie "Was 2.6.38 bringt" fortzusetzen. Die wichtigsten Änderungen rund um Grafiktreiber hatten wir bereits im ersten Teil beschrieben; in den kommenden Wochen folgen noch Artikel zur Netzwerkunterstützung, zu Storage-Hardware, Treibern sowie Architektur- und Infrastruktur-Code.
Optimierungen am VFS
Die für 2.6.38 integrierten Optimierungen am VFS (Virtual File System), das Basis-Funktionen für alle Dateisysteme bereitstellt, waren Torvalds besonders wichtig, denn er erwähnte sie mit einer gewissen Begeisterung und recht ausführlich in der Mail zur ersten Vorabversion von 2.6.38 (u. a. 1, 2, 3, 4, 5, 6, 7). Durch diese unter Namen wie "RCU-based name lookup" entwickelten Änderungen nutzt das VFS, das allen Dateisystemen zugrunde liegt, feineres Locking mit RCU (Read Copy Update), was unter anderem einige Verzeichnisoperationen erheblich beschleunigen soll. Davon sollen nicht nur größere Server mit vielen Prozessorkernen, sondern auch Allerweltssysteme profitieren; Torvalds gibt in der Freigabemail an, bei bestimmten Tests Performance-Verbesserungen von 30 bis 50 Prozent zu sehen. Bereits in einer früheren Mail zur Aufnahme der tief greifenden Optimierungen an dem – für die zuverlässige Funktion des Kernels sehr wichtigen – VFS hatte er geschrieben, dass ein mit gefüllten Caches in seinem Home-Verzeichnis ausgeführtes Find-Kommando rund 35 Prozent schneller arbeite – und das, obwohl Find nur mit einem Thread arbeite.
Die Entwicklung der Optimierungen hatte Nick Piggin über ein Jahr lang vorangetrieben. Torvalds hätte Vorläufer der Patches, die auch unter Bezeichnungen wie "vfs-scale" und "RCU-walk" kursieren, schon bei 2.6.36 integrieren wollen – die beteiligten Entwickler einigten sich damals aber darauf, nur einige recht ungefährliche Änderungen als Grundlage zu integrieren. Weitere Änderungen folgten bei 2.6.37, wo ein anderer Entwickler ähnlich gelagerte und teilweise auf Piggins Ideen basierende Optimierungen für das VFS vorstellte, was zu Diskussionen über die beste Herangehensweise führte. Details dazu und nähere Erklärungen zur Funktionsweise der jetzt und in den vergangenen Monaten vorgenommenen VFS-Änderungen liefert lwn.net in den englischsprachigen Artikeln "VFS scalability patches in 2.6.36", "Resolving the inode scalability discussion" und "Dcache scalability and RCU-walk"; einige für Dateisystementwickler wichtige Hinweise erläutert Piggin in einer LKML-Mail.
Ext-Familie, XFS und Btrfs
Ext3 und XFS werden mit 2.6.38 das beim 37er-Kernel eingeführte Batched Discard unterstützen, das insbesondere für SSDs mit langsamer Trim-Funktion wichtig ist (1, 2, 3). In der Commit-Message zur XFS-Änderung weist Christoph Hellwig explizit darauf hin, den Batched Discard nicht während normaler Workloads anzustoßen, da die Suche nach freien Speicherbereichen größere Performance-Einbußen mit sich bringt. Einige weitere der in 2.6.37 und 2.6.38 eingeflossenen XFS-Änderungen erwähnt der Kernel-Hacker im "XFS status update for January 2011" – darunter einige Optimierungen am Locking-Code des Log-Subsystems, das dadurch deutlich besser skalieren soll.
Im Merge Window von 2.6.37 hatten die Kernel-Hacker einige Patches zum Steigern der Ext4-Performance integriert; die darunter befindliche und große Zuwächse versprechende "Multiple Page-IO Submission" mussten sie allerdings aufgrund ungelöster Probleme kurz vor Fertigstellung dieser Kernel-Version deaktivieren. Diese Fehler wurden zwischenzeitlich korrigiert – teilweise jedoch erst in der Stabilisierungsphase von 2.6.38. Die über eine Option einschaltbare Technik bleibt daher auch in 2.6.38 ausgeschaltet und soll im Merge Window von 2.6.39 wieder standardmäßig aktiviert werden.
Das weiterhin experimentelle COW-Dateisystem Btrfs kann zur transparenten Kompression neben Zlib nun auch LZO nutzen, das typischerweise erheblich schneller, aber nicht ganz so effizient packt; einige Messwerte, die das untermauern, und einen Vergleich zu einem unkomprimierten Dateisystem liefert der Commit-Kommentar (1, 2). Btrtfs beherrscht nun auch schreibgeschützte Snapshots; in seinem Haupt-Git-Pull-Request erwähnt Btrfs-Entwickler Chris Mason zudem einige Korrekturen im Code zur Unterstützung von Dateisystemen, die mehrere Datenträger überspannen.
SquashFS, UDF, Fallocate und NFS
SquashFS, UDF, Fallocate und NFS
Das von vielen Linux-Distributionen für Live- und Installationsmedien verwendete Dateisystem SquashFS unterstützt ab 2.6.38 die Komprimierung der Dateisystem-Images mit dem aus LZMA hervorgegangenen Kompressionsformat XZ (1, 2). Da das für sehr hohe Packdichten bekannt ist, dürften einige Live-Medien in Zukunft Platz für ein paar Programme mehr als zuvor bieten. Die Fedora-Entwickler wollen es bei der im Mai erwarteten Version 15 einsetzen und geben an, dass eine Live-DVD mit Spielen bei der Komprimierung mit XZ rund 8 Prozent kleiner ausfiel. Für manche Distributionen ist die neue Komprimierungsart ein alter Hut, denn sie hatten schon länger Vorläufer der jetzt integrierten Patches an Bord, obwohl Torvalds diese bei 2.6.34 nicht aufnehmen wollte.
Das bei optischen Medien wie DVD genutzte UDF-Dateisystem kommt ab 2.6.38 nun ohne das Big Kernel Lock (BKL) aus. Damit haben die Entwickler nach der BKL-Entfernungs-Aktion bei 2.6.37 nun den letzten auf typischen Systemen eingesetzten Kernel-Bestandteil vom BKL befreit. Es gibt zudem einen groben Schlachtplan, um auch die verbliebenen Nutzer des BKLs aus der Welt zu schaffen.
Über den Systemaufruf fallocate() können Programme das Dateisystem nun über ungenutzte Bereiche in der Mitte von Dateien informieren (1, 2; LWN: "Punching holes in files"). Dieser bislang nur von OCFS2 und XFS unterstützten Mechanismus sollte etwa Virtualisierungsprogramme in die Lage versetzen, nicht mehr genutzte Speicherbereiche von Festplatten-Images wieder freizugeben, die als Sparse-Dateien vorliegen – dazu müsste das Gastsystem den Host aber irgendwie über nicht mehr genutzte Speicherbereiche informieren.
Das VFS bietet nun bessere, im Rahmen eines Patch-Reviews erläuterte Unterstützung für automount (u. a. 1, 2, 3). nfsd4-Verwalter J. Bruce Fields hebt in seinem Haupt-Git-Pull-Request einige der Verbesserungen am NFS-4-Daemon hervor, die zur Server-seitigen Unterstützung von NFS 4.1 nötig sind; dabei verweist er auch auf eine Seite im NFS-Wiki, die einen Überblick über die verbleibenden für 4.1-Unterstützung benötigten Änderungen gibt.
Die kleinen Perlen
Viele kleinere, aber keineswegs unbedeutende Neuerungen finden sich in der folgenden Liste mit den englischen Commit-Überschriften der jeweiligen Änderung. Die Einträge verlinken genau wie viele der Verweise im vorangegangenen Text auf das Webfrontend des von Linus Torvalds gepflegten Git-Zweigs mit den "offiziellen" Kernel-Quellen auf Kernel.org. Der über diese Links angezeigten Commit-Kommentar und der darunter ausgegebene Patch liefern zahlreiche weitere Informationen zur jeweiligen Änderung.
Vor jedem Link finden sich in eckigen Klammern einige Buchstaben und Zahlen. Ein "C" kennzeichnet Patches mit Änderungen an Kconfig-Dateien, welche die Konfigurationsoptionen samt der zugehörigen Hilfetexte enthalten, die bei der Kernel-Konfiguration über "make menuconfig", "make xconfig" und ähnliche Werkzeuge angezeigt werden. Ein "D" steht bei Patches, die die Dokumentation verändern, die im Kernel-Zweig unterhalb von Documentation/ liegt. Ein "N" weist Änderungen aus, die eine neue Datei anlegen. Die Zahl vermittelt einen groben Eindruck zur Größe des Patches: eine "1" steht für Änderungen, die inklusive Kommentar zwischen 10 und 20 KByte groß sind, eine "2" für solche, die zwischen 20 und 30 KByte Umfang haben; Änderungen ohne Zahl sind kleiner als 10 KByte, Patches mit einer "9" hingegen 90 KByte oder größer.
- [
D] Allow d_manage() to be used in RCU-walk mode - [
1] autofs4: Add d_automount() dentry operation - [
1] autofs4: Add d_manage() dentry operation - [
] autofs4: Add v4 pseudo direct mount support - [
] autofs4: Bump version - [
] Btrfs: Add BTRFS_IOC_SUBVOL_GETFLAGS/SETFLAGS ioctls - [
] btrfs: Allow to specify compress method when defrag - [
1] btrfs: fix wrong free space information of btrfs - [
1] Btrfs: forced readonly mounts on errors - [
1] btrfs: make the chunk allocator utilize the devices better - [
] btrfs: provide simple rcu-walk ACL implementation - [
] cifs: add cruid= mount option - [
] CIFS: Add strictcache mount option - [
] CIFS: cifs: reconnect unresponsive servers - [
] cifs: move "ntlmssp" and "local_leases" options out of experimental code - [
] cifs: Support NTLM2 session security during NTLMSSP authentication [try #5] - [
D] Documentation: don't remove lock manager fl_release_private - [
D] Documentation: fl_mylease no longer exists - [
] ext2,3,4: provide simple rcu-walk ACL implementation - [
] ext2: speed up file creates by optimizing rec_len functions - [
] ext3: speed up file creates by optimizing rec_len functions - [
D 3] fallocate should be a file operation - [
D 3] fs: change d_compare for rcu-walk - [
D 1] fs: change d_delete semantics - [
D 2] fs: change d_hash for rcu-walk - [
] fs: dcache documentation cleanup - [
1] fs: dcache per-bucket dcache hash locking - [
1] fs: dcache per-inode inode alias locking - [
2] fs: dcache scale dentry refcount - [
1] fs: dcache scale d_unhashed - [
] fs: dcache scale lru - [
] fs: implement faster dentry memcmp - [
] fs: provide simple rcu-walk generic_check_acl implementation - [
D 2] fs: rcu-walk aware d_revalidate method - [
1] fs: scale inode alias list - [
2] fs: scale mntget/mntput - [
D] fs: small rcu-walk documentation fixes - [
1] fs: Use rename lock and RCU for multi-step operations - [
] fs: Use this_cpu_xx operations in buffer.c - [
] hfsplus: optimize fsync - [
N2] lockd: Introduce new-style XDR functions for NLMv3 - [
N2] lockd: Introduce new-style XDR functions for NLMv4 - [
D] nfsd4: eliminate lease delete callback - [
] nfsd4: implement secinfo_no_name - [
] nfsd4: support BIND_CONN_TO_SESSION - [
1] NFS: Introduce new-style XDR decoding functions for NFSv2 - [
3] NFS: Introduce new-style XDR decoding functions for NFSv2 - [
1] NFS: Introduce new-style XDR encoding functions for NFSv2 - [
2] NFS: Introduce new-style XDR encoding functions for NFSv3 - [
] nilfs2: fiemap support - [
D] NTFS: writev() fix and maintenance/contact details update - [
1] sanitize vfsmount refcounting changes - [
D 1] Unexport do_add_mount() and add in follow_automount(), not ->d_automount() - [
] xfs: add a lru to the XFS buffer cache - [
1] xfs: convert inode cache lookups to use RCU locking - [
1] xfs: dynamic speculative EOF preallocation - [
1] xfs: introduce new locks for the log grant ticket wait queues - [
] xfs: provide simple rcu-walk ACL implementation
Weitere Hintergründe und Informationen rund um Entwicklungen im Linux-Kernel und dessen Umfeld finden sich in den vorangegangenen Kernel-Logs auf heise open. Neue Ausgaben des Kernel-Logs werden auf den Identi.ca- und Twitter-Konten "@kernellog" erwähnt; die englischen, bei den Kollegen von "The H" erscheinenden Übersetzungen auf den Identi.ca- und Twitter-Konten "@kernellog2". Gelegentlich zwitschert der Autor des Kernel-Logs unabhängig davon über einige Kernel-Log-Themen bei Identi.ca und Twitter als "@kernellogauthor". (thl). (thl)