Zwischen ein und 30 Prozent können angeblich die Einbußen der Kernel-Patches gegen die Meltdown-Lücken betragen. Wir haben mit einem Benchmark gemessen.
Seit dem Bekanntwerden der Spectre- und Meltdown-Lücken in verschiedenen superskalaren Prozessoren, insbesondere Intel-CPUs, arbeiten Betriebssystem- und Prozessorentwickler an Gegenmitteln. Während Intel die hastig herausgegebenen Microcode-Updates zwischenzeitlich wieder zurückgezogen hat, sind im Linux-Kernel 4.15 zwei Gegenmaßnahmen gelandet, die zumindest die Auswirkungen der Meltdown-Lücke eindämmen sollen. Neben dem Retpoline-Patch, der die Unterstützung des Compilers erfordert, ist dies vor allem die sogenannte Kernel page-table isolation (KPTI, vormals KAISER), die ein Ausnutzen von Meltdown verhindern soll.
In der menügeführten Konfiguration des Linux-Kernel ist KPTI unter den Security-Features zu finden und trägt die Beschreibung "Remove the kernel mapping in user mode". Die entsprechende Konfigurationsanweisung, die sich in der Kernelkonfigurationsdatei ".config" wiederfindet, lautet "CONFIG_PAGE_TABLE_ISOLATION". Die Direktive für den Retpoline-Patch lautet "CONFIG_RETPOLINE".
Immer wieder wird betont, dass die Leistungseinbußen der Anti-Meltdown-Maßnahmen stark von der verwendeten Anwendung abhängt, insbesondere davon, wie oft sie zwischen User- und Kernelspace wechselt respektive wie oft und wieviel Daten sie über die CPU kopiert. Um wenigstens einen allgemeinen Anhaltspunkt für die Performance zu bekommen, haben wir die Benchmark-Suite UnixBench verwendet, die zahlreiche CPU- und I/O-lastige Messungen durchführt. Getestet haben wir auf einem System mit Intel Core i5-4570, 3,2 GHz und 8 GByte RAM.
Dies sind die Ergebnisse:
|
Kernel 4.51 unprotected |
Kernel 4.15 mit KPTI und Retpoline Patches |
4 CPUs in system; running 1 parallel copy of tests |
||
Execl Throughput |
7167.0 lps |
6342.8 lps |
File Copy 1024 bufsize 2000 maxblocks |
1526615.0 KBps |
1065803.0 Kbps |
File Copy 256 bufsize 500 maxblocks |
408992.0 KBps |
276593.0 Kbps |
File Copy 4096 bufsize 8000 maxblocks |
3519181.0 KBps |
2838715.0 Kbps |
Pipe Throughput |
2950754.9 lps |
1559632.3 lps |
Pipe-based Context Switching |
259666.9 lps |
235455.2 lps |
Process Creation |
4399.9 lps |
4067.0 lps |
Shell Scripts (1 concurrent) |
10403.4 lpm |
9943.5 lpm |
Shell Scripts (16 concurrent) |
2138.2 lpm |
2012.9 lpm |
Shell Scripts (8 concurrent) |
3919.5 lpm |
3686.9 lpm |
System Call Overhead |
4923086.6 lps |
1292055.1 lps |
|
|
|
4 CPUs in system; running 4 parallel copies of tests |
||
Execl Throughput |
24512.5 lps |
22124.9 lps |
File Copy 1024 bufsize 2000 maxblocks |
1587433.0 KBps |
1511047.0 Kbps |
File Copy 256 bufsize 500 maxblocks |
416646.0 KBps |
393616.0 Kbps |
File Copy 4096 bufsize 8000 maxblocks |
4657377.0 KBps |
4556404.0 Kbps |
Pipe Throughput |
11215381.6 lps |
5989954.6 lps |
Pipe-based Context Switching |
1665251.7 lps |
1290998.3 lps |
Process Creation |
55744.4 lps |
50788.1 lps |
Shell Scripts (1 concurrent) |
31430.1 lpm |
29749.3 lpm |
Shell Scripts (16 concurrent) |
2503.2 lpm |
2337.6 lpm |
Shell Scripts (8 concurrent) |
4809.8 lpm |
4498.0 lpm |
System Call Overhead |
11852176.7 lps |
4473667.3 lps |
|
|
|
UnixBench Index |
5670.6 |
4525.7 |
Wie man sieht, ist ein gepatchter Kernel in allen Belangen langsamer als ein ungepatchtes System, mal mehr mal weniger. Der UnixBench-Index in der letzten Zeile gibt die Performance des Systems in Relation zu einem bestimmten Referenzsystem an und ist als absoluter Leistungswert untauglich, liefert aber bei Messungen auf demselben Rechner einen guten Anhaltspunkt. Danach ist ein KPTI-gepatches Linux in unserem Benchmark etwa 20 Prozent langsamer als ohne Schutz.
Der als "Intel-Bug" bekannt gewordene Designfehler moderner CPUs macht umfangreichere Änderungen an Betriebssystemen nötig.