Die Neuerungen von Linux 3.18

Trends & News | Kernel-Log

Nach zwanzig Jahren und zahlreichen Ansätzen kann der Kernel nun endlich zwei Dateisysteme zu einem verknüpfen. Kleinere Anpassungen steigern den Durchsatz beim Versenden von Netzwerkpaketen enorm. Einige Kernel-Entwickler arbeiten verstärkt am Entschlacken des Kernels, damit er sich wieder besser für leistungsschwache Systeme eignet.

Linus Torvalds hat den Linux-Kernel 3.18 freigegeben. Eine seiner größten Neuerungen ist das Overlay Filesystem (OverlayFS), mit dem sich ein Dateisystem über ein anderes legen lässt. Solch eine Herangehensweise verwenden beispielsweise Live-Linuxe, um das Dateisystem einer schreibgeschützten DVD mit dem Dateisystem eines beschreibbaren USB-Sticks zu einem regulär nutzbaren Dateisystem zu verknüpfen; die im Live-Linux geschriebenen Daten landen dann auf dem USB-Stick und überdauern so auch Neustarts.

Aufs zeigt im Zusammenspiel mit Docker einige Probleme, wie ein Entwickler der Container-Software in einem Vortrag auf der LPC 2014 erläuterte. (Bild: Thorsten Leemhuis)

Auch die Container-Software Docker und viele Embedded-Linuxe überlagern ein Dateisystem mit anderen. Mit dem Standard-Kernel gelingt das bislang allenfalls über einem Umweg mit dem Device Mapper, indem den einen Datenträger als Overlay für einen anderen nutzt. Das hat aber einige Nachteile im Vergleich zu Lösungen auf Dateisystemebene, an denen seit über 20 Jahren gearbeitet wird. In der Zeit sind eine ganze Reihe von Lösungen entstanden, von denen es aber keine in den offiziellen Linux-Kernel geschafft hat, weil sie alle die Qualitätsansprüche der Kernel-Entwickler nicht erfüllen konnten. Das gilt auch für das von vielen Distributionen verwendete Aufs, das oftmals mit Docker eingesetzt wird, obwohl es eine Reihe bekannter Probleme zeigt.

OverlayFS hat die Aufnahme nach über vier Entwicklungsjahren nun geschafft; um das zu erreichen, hat der Entwickler zuvor einige Grundlagen im Kernel geschaffen und sich auf einen eher simplen Ansatz beschränkt. Der hat dadurch einige Eigenarten, welche die Dokumentation erläutert; darunter etwa Probleme mit Hard- und Softlinks und Einschränkungen mit NFS.

Beim Versenden vieler kleiner Netzwerkpakete erreicht Linux bislang oft nur Durchsatzwerte, die um einiges unter dem theoretischen Maximum der jeweiligen Ethernet-Verbindung liegen; besonders deutlich zeigt sich das bei Systemen mit schwachen CPUs. Einige vergleichsweise kleine Umbauarbeiten sollen dieses Manko nun ausräumen, indem der Kernel beim Versenden von Daten nachsieht, ob bereits weitere Daten zum Versand bereitliegen; wenn ja, bildet es kurz vor der Übergabe der Daten an den Netzwerkchip größere Datenansammlungen, um die Pakete in größeren Schüben statt jeweils separat zu verarbeiten. Das reduziert den Overhead pro versendetem Netzwerkpaket und steigert so den Datendurchsatz .

Ein an den Änderungen beteiligter Entwickler erklärte, er konnte nach diesen Umbauten eine 40-Gbit-Verbindung auslasten, selbst wenn die von Linux schon länger unterstützte Optimierungstechnik TCP Segmentation Offload (TSO) ausgeschaltet war. Die neue Verfahrensweise funktioniert allerdings nur mit Netzwerktreibern, die das neu eingeführte Flag xmit_more unterstützen. Darunter sind alle 40- und 10-Gigabit-Ethernet-Treiber mit Ausnahme des Treibers bnx2x für Broadcom/Qlogic-Chips. Details und Hintergründe zur neuen Arbeitsweise liefern der Merge-Kommentar zu den wichtigsten Änderungen am Netzwerksubsystem, ein Blog-Beitrag eines der beteiligten Entwickler und ein Artikel bei LWN.net.

Der Radeon-Treiber des Kernels bietet nun Schnittstellen, durch die ein in Mesa enthaltener AMD-Treiber den Video-Beschleuniger UVD nutzen kann, den einige ältere Radeon-GPUs enthalten; darunter die Grafikkerne RV6xx, RS[78]80 und RV7[79]0, die auf viele der Radeon-HD-Karten mit den Modellbezeichnungen 2400 bis 4290 sitzen. Der Radeon-Treiber beherrscht nun auch die Userspace Pointer, die der Intel-Treiber seit Linux 3.16 unterstützt. Sie reduzieren den Overhead, wenn der Grafikkern auf Speicherbereiche von Userspace-Prozessen zugreift – dazu zählen nicht nur Anwendungen, sondern auch Daten von 3D-, X- und OpenCL-Treibern.

Über eine neu eingeführte Funktion markiert der Intel-Treiber den Kernel nun als "tainted" (beschmutzt/befleckt), wenn bestimmte, für Entwickler gedachte Funktionen über Module-Parameter aktiviert werden. Darunter sind nicht nur Semaphoren, die die Performance verbessern können, sondern auch die Stromsparfunktionen FBC (Frame Buffer Compression); auch eine zu aggressive Einstellung für die Stromsparfunktionen RC6 kann zur Taint-Kennzeichnung führen.

Einige Entwickler arbeiten nun unter dem Schlagwort "tinification" gezielter an Änderungen, um kleinere und ressourcenschonendere Kernel zu ermöglichen, damit sich Linux wieder besser für schwache Hardware eignet. Ein erster Schwung dahingehender Änderungen ist in 3.18 eingeflossen. Eine von ihnen führt das Make-Target 'tinyconfig' ein, das eine Grundkonfiguration für einen möglichst kleinen Kernel erzeugt. Durch eine andere Änderung kann man die Syscalls madvise() and fadvise() deaktivieren, wenn etwa bekannt ist, dass die Software eines Embedded-Gerätes diese Funktionsaufrufe ohnehin nicht benötigt. Das Linux-Kernel-Tinification-Wiki listet weitere Anpassungen, mit denen die Entwickler schlankere Kernel ermöglichen wollen. Manchmal stoßen die Entwickler solcher Änderungen aber auf Widerstand, weil andere Entwickler Probleme fürchten; Hintergründe dazu zeigt ein LWN.net-Artikel aus dem Mai und eine jüngst auf der Liste der Linux-Entwickler geführte Diskussion.

Unabhängig davon entstanden Anpassungen, durch die Kernel-Module nun direkt bei der Installation komprimiert werden können. Erneut gab es Änderungen, um den Kernel bald mit Clang kompilieren zu können, das auf der Compiler-Infrastruktur LLVM aufbaut. Es sind aber noch weitere Patches nötig, bis das gelingt; zudem sind derzeit auch noch Anpassungen an LLVM erforderlich, wie Torvalds im Merge-Kommentar mit den Änderungen schreibt.

Die Kernel-Entwickler haben den Extended Berkeley Packet Filter (eBPF) aus dem Netzwerksystem herausgelöst und um den Funktionsaufruf bpf() erweitert (u. a.1, 2, 3, 4, 5). Dadurch können Userspace-Programme nun eBPF-Programme in den Kernel laden, um von Letzterem verarbeitete oder erzeugte Daten zu verarbeiten.

Damit können Programme beispielsweise ohne viel Overhead bestimmte Netzwerk-Datenströme abgreifen, wie es Tcpdump schon lange mit dem klassischen BPF-Interpreter des Kernels macht. Aus ihm ist im letzten Jahr der eBPF hervorgegangen, der nicht nur schneller arbeiten kann, sondern auch flexibler und mächtiger ist; er wird daher gelegentlich auch als "universelle virtuelle Maschine im Linux-Kernel" bezeichnet. Es fehlen aber weiterhin noch Eingriffspunkte, durch die der eBPF an weitere Datenströme gelangt; darunter jene, um die manchmal immensen Datenmengen abgreifen und verarbeiten zu können, die bei der Ablaufverfolgung mit dem Function Tracer (Ftrace) entstehen. Weitere Details zum neuen Syscall und den Möglichkeiten liefern zwei LWN.net-Artikel (1, 2).

Auch der ARM64-Code enthält nun einen Just-In-Time-Compiler für den eBPF. Zum Crypto-Subsystem stieß die Multibuffer Crypto Infrastructure, die den Durchsatz bei Verschlüsselung und Prüfsummenbildung steigern kann, indem es die Eingabedaten mehrere Quellen annimmt und parallel statt nacheinander verarbeiten lässt; Kernel 3.18 nutzt diesen Möglichkeit aber nur bei SHA1 (u. a. 1, 2, 3). Unter den zahlreichen Änderungen an Perf-Subsystem sind einige, die die Unterstützung für die Performance-Counter verbessern, die den Uncore-Bereich moderner Intel-Prozessoren überwachen; dort sitzen der Speichercontroller und andere Funktionen, auf die alle Kerne eines Prozessors zurückgreifen.

Das CIFS-Dateisystem soll Microsofts Datei-, Druck- und Server-Protokoll SMB3 nun besser unterstützen.Das für Datenträger mit Flash-Speicherchips ausgelegte Dateisystem F2FS unterstützt nun größere Sektoren und beherrscht nun auch FITRIM, mit dem das Programm fstrim Datenträger über ungenutzte Speicherbereiche informiert; unter den weiteren Änderungen an F2FS sind einige, die die Robustheit des Dateisystems bei Abstürzen zu steigern versprechen; ferner sollen die neuen "Atomic writes" sicher stellen, dass eine Schreiboperation entweder komplett durchgeführt wird oder als Ganzes fehlschlägt.

Zum Xen-Code des Kernels stießen Gast- und Host-Treiber für Paravirtualized SCSI (pvSCSI), mit dem sich SCSI-Geräte an Xen-VMs überstellen lassen; das vermeidet Overhead und kann so den Datendurchsatz steigern und Latenzen reduzieren. Das bei Linux.Iscsi.Org entwickelte Linux-IO Target (LIO) kann Kommandos jetzt an Userspace-Programme durchreichen; wie die zugehörige Dokumentation erläutert, lassen sich so iSCSI-Targets als reguläre Anwendungen implementieren, ähnlich wie es FUSE (Filesystem in Userspace) mit Dateisystemen ermöglicht.

Der Kernel unterstützt in der neuen Version Data Center TCP (DCTCP), das den Datenfluss in Rechenzentren optimieren kann. Dazu nutzt es Explicit Congestion Notification (ECN), um Netzwerkübertragungen mit großen Datenmengen anders zu steuern als kleinere Übertragungen, bei denen es oft auf kurze Latenzen ankommt. Dadurch sollen sich solche Datenströme in Rechenzentren weniger ins Gehege geraten, sodass im Idealfall die Latenzen sinken und zugleich der Datendurchsatz steigt; zudem soll die Technik das als Bufferbloat bekannte Problem vermeiden, bei dem zu starkes Puffern zu hohen Latenzen und Verbindungsabbrüchen führt. Details liefert der Commit-Kommentar und eine Webseite zur Technik, die an der Stanford University entstand.

Das Netzwerksubsystem beherrscht "foo-over-udp", das beliebige Protokolle über eine UDP-Verbindung tunnelt (u. a. 1, 2); Details zu Funktionsweise und Einsatzmöglichkeiten liefert ein LWN.net-Artikel. Neu ist auch die Unterstützung für das Generic Network Virtualization Encapsulation (Geneve); ein für die Netzwerkvirtualisierung ausgelegtes Protokoll mit Draft-Status, auf das Openvswitch beim Tunneln von Netzwerkpaketen zurückgreifen kann.

Die WLAN-Treiber rtl8821ae und rtl8192ee für die gleichnamigen Realtek-Chips sind gereift, daher sind sie jetzt vom im Staging-Bereich in das Netzwerksubsystem umgezogen (1, 2). Auch der Treiber für den Gigabit-Ethernet-Adapter Agere ET-1310 konnte den Bereich verlassen, in dem unreife Treiber mit größeren Qualitätsmängeln liegen. Direkt ins Netzwerksubsystem eingezogen ist der Treiber fm10k, der Intels für Ethernet-Switches vorgesehen Chip FM10000 unterstützt (u. a. 1, 2).

Direkt nach der Freigabe der neuen Version beginnt nun das Merge Window, in dem Linus Torvalds das Gros der Änderungen für den Nachfolger annimmt; diese Phase ist typischerweise zwei Wochen lang und endet mit der Veröffentlichung einer ersten Vorabversion des Nachfolgers.

In 3.19 soll der Treiber amdkfd für AMDs Heterogeneous System Architecture (HSA) einziehen, über die unterschiedliche Bausteine eines Systems effizienter zusammenarbeiten können – etwa durch Shared Pagetable Memory, das den Austausch von Daten zwischen CPU, GPU und Crypto-Beschleuniger vereinfachen kann. Auf den neuen Kernel-Treiber greift AMDs HSA Runtime zurück, die AMD letzten Monat als Open-Source-Software veröffentlicht hat. Programme könne diese Runtime einbinden, die bestimmte Rechenaufgaben dann je nach Systemlast oder Art zur Berechnung an CPU oder GPU übergibt.

Die Kernel-Entwickler wollen zudem den NVMe-Treiber auf den Multi-Queue Block IO Queueing Mechanism des Block-Layers portieren, der effizienteren Zugriff auf Datenträger verspricht; das soll Latenzen reduzieren, CPU-Last senken und Datendurchsatz steigern. Der IPC-Mechanismus Kdbus dürfte nicht in 3.19 einziehen, denn bei einer ersten Begutachtung des Kernel-seitigen Codes des designierten Dbus-Nachfolgers fanden sich einige Kritikpunkte. Die Kdbus-Entwickler haben viele von ihnen mit einer überarbeiten Code-Fassung ausräumen können; vor einer Aufnahme dürfte es aber vermutlich noch mindestens eine weitere Begutachtungsrunde geben.

Linus Torvalds hofft zudem, bald die Ursache eines Fehlers finden und beseitigen zu können, durch die sich vermutlich auch 3.18 gelegentlich aufhängt. Der Linux-Kernel enthält diesen Fehler offenbar seit mindestens Version 3.17; er ist aber nur sehr schwer reproduzier- und diagnostizierbar, daher tappen die Entwickler bei ihrer Suche schon seit einigen Wochen weitgehend im Dunkeln. Offenbar tritt der Fehler aber nur äußerst selten auf, daher wollte Torvalds die Freigabe von 3.18 nicht weiter verzögern – unter anderem auch, weil das Merge Window von 3.19 dann mit den Feiertagen am Jahresende kollidiert wäre.

Sofern Torvalds und seine Mitstreiter trotz des Jahreswechsels mit dem gewohnten Tempo arbeiten, dürfte 3.19 frühestens Anfang, wahrscheinlich aber eher Mitte Februar erscheinen. Ein Artikel wie dieser wird dann wieder einen Überblick über die wichtigsten Neuerungen dieser Version liefern.

Linux-
Version
Anzahl
Dateien¹
Zeilen
Quelltext
(OhneDoku)²
Entwick-
lungs-
zeitraum
Anzahl
Commits³
Diffstat⁴
3.12 44586
17726872
(16529850)
62 Tage 10927 8636files changed,
587004 insertions(+),
263408 deletions(-)
3.13

44970 17930916
(16703764)
77 Tage 12127 9843 files changed,
441474 insertions(+),
237428 deletions(-)
3.14 45935 18271989
(17002462)
70 Tage 12311 10601 files changed,
605655 insertions(+),
264576 deletions(-)
3.15 46780 18632574
(17323446)
53 Tage 13722 11427 files changed,
932110 insertions(+),
571520 deletions(-)
3.16

47425 18879129
(17527507)
56 Tage 12804 9807 files changed,
513830 insertions(+),
267276 deletions(-)
3.17 47490 18864388
(17484200)
63 Tage 12354 10605 files changed,
651466 insertions(+),
666200 deletions(-)
3.18 47971 18994096
(17586160)
63 Tage 11379 9303 files changed,
485509 insertions(+),
355800 deletions(-)
¹ find . -type f -not -regex '\./\.git/.*' | wc -l
² find . -type f -not -regex '\./\.git.*' | xargs cat | wc -l; echo "($(find . -name *.[hcS] -not -regex '\./\.git.*' | xargs cat | wc -l))"
³ git-log --no-merges --pretty=oneline v3.(x-1)..v3.(x) | wc -l
⁴ git diff --shortstat v3.(x-1)..v3.(x)

Linux herunterladen

Die neue Linux-Version steht über Kernel.org zum Download bereit; bereits kurz nach der Veröffentlichung liefern auch viele Spiegelserver den neuen Kernel aus.

Den Quellcode von Linux gibt es in Tar-Archiven, die mit Gzip und Xz komprimiert wurden. Die folgenden Befehle zeigen am Beispiel von Linux 3.1, wie Sie die Quellen herunterladen, entpacken und auf Unversehrtheit prüfen:

[thl@thl tmp]$ export linux_version=3.1
[thl@thl tmp]$ wget --quiet \
http://www.kernel.org/pub/linux/kernel/v3.0/linux-${linux_version}.tar.sign \
http://www.kernel.org/pub/linux/kernel/v3.0/linux-${linux_version}.tar.xz
[thl@thl tmp]$ xz -d linux-${linux_version}.tar.xz
[thl@thl tmp]$ gpg --verify linux-${linux_version}.tar.sign
gpg: Unterschrift vom Mo 24 Okt 2011 09:17:58 CEST mittels RSA-Schlüssel ID 00411886
gpg: Korrekte Unterschrift von "Linus Torvalds <torvalds@linux-foundation.org>"
gpg: WARNUNG: Dieser Schlüssel trägt keine vertrauenswürdige Signatur!
gpg: Es gibt keinen Hinweis, daß die Signatur wirklich dem vorgeblichen Besitzer gehört.
Haupt-Fingerabdruck = ABAF 11C6 5A29 70B1 30AB E3C4 79BE 3E43 0041 1886

Einige Hinweise zur Installation eines neuen Kernels finden Sie im Artikel "Linux-Kernel maßgeschneidert", der die Einrichtung eines Kernels mit Hilfe des Make-Targets "localmodconfig" beschreibt.

(thl)

Kommentare

Anzeige