„Auswirkung der mkinitcpio-Kompression“
Falls jemandem der Titel dieses Post bekannt vorkommen sollte: Das ist Absicht. Ein gewisser [ENC]BladeXP hatte Ende 2016 bereits einen Artikel zu dieser Thematik geschrieben, und ich wollte das Experiment mal auf einem aktuellen System wiederholen. Allerdings mit einer kleinen Ergänzung: Ich habe mir auch die Zeiten für die Dekompression angesehen.
Verwendet wurde hierfür ein System mit einer NVMe SSD, einem Intel Core i7-8550U, sowie 16GB RAM.
Erzeugen der Ramdisk + Kompression
Nach jedem Kernelupdate muss unter Archlinux mit Hilfe des Tools mkinitcpio eine neue Ramdisk erzeugt werden, welche der Kernel zum Booten benötigt.
In der Tabelle befindet sich dafür jeweils die Angabe des Kompressionsalgorithmus, die Größe der Fallback- und der Standard-Ramdisk, sowie die dafür benötigte Zeit. Der Prozentwert setzt lediglich die erzeugte Dateigröße in Relation zu einer unkomprimierten Ramdisk.
Algorithmus | Fallback (MB) | Standard (MB) | Zeit (s) | Prozent (%) |
---|---|---|---|---|
cat (none) | 127 | 66 | 12,9 | 100,0 |
gzip | 39 | 22 | 22,0 | 31,6 |
bzip2 | 37 | 21 | 26,6 | 30,1 |
lzma | 27 | 15 | 122,9 | 21,8 |
xz | 27 | 15 | 122,6 | 21,8 |
lzop | 55 | 31 | 13,4 | 44,6 |
lz4 | 58 | 31 | 13,4 | 46,1 |
zstd | 38 | 21 | 13,4 | 30,6 |
cat (none)
Erzeugung der Ramdisk ohne Kompression. Geht zwar schnell, erzeugt aber auch die größten Dateien. Einziger Nachteil ist der relativ hohe Platzverbrauch.
gzip, bzip2
Die beiden etwas älteren Kompressionsformate erzeugen zwar bereits relativ kleine Dateien, brauchen dafür aber auch grob die doppelte Zeit. Nicht zu empfehlen, zumal die Dekompression relativ langsam ist.
lzma, xz
Sowohl lzma als auch xz erzeugen sehr kleine Dateien, brauchen dafür aber auch gut die zehnfache Zeit. Für gewisse Szenarien mag das Sinn ergeben, hier allerdings nicht.
lzop, lz4, zstd
Die drei Verfahren erzeugen mit kaum wahrnehmbaren Overhead (gerade mal 0,5s im Vergleich zu cat) relativ kleine Dateien, wobei zstd auf eine ähnliche Kompressionsrate wie gzip bzw. bzip2 kommt. Leider ist zstd noch nicht fester Bestandteil des Kernels, und ein Booten einer mit zstd komprimierten Ramdisk daher nicht so einfach möglich. Auch wenn lz4 minimal größere Dateien als lzop erzeugt rate ich zu lz4, da die Dekompressionsgeschwindigkeit (wie man gleich sehen wird) bei lz4 wesentlich höher ist.
Lesen der Ramdisk + Dekompression
Die Dekompressionszeit zu messen war leider nicht ganz so einfach. Letztlich habe ich mich dafür entschieden Werte zu nehmen, die ich aus diversen Quellen zusammengetragen, und einer Plausabilitätsprüfung unterzogen habe. Außerdem ist die Dekompression alleine nicht entscheidend für den Bootvorgang, sondern muss auch in Relation zur Lesegeschwindigkeit des Speichermediums gesehen werden.
In der folgenden Tabelle habe ich meine NVMe SSD als Referenz genommen, welche lesend ca. 1,5GB/s schafft.
Algorithmus | Größe (MB) | Lesen (s) | Dekompression (MB/s) | Zeit (s) | Gesamt (s) | Prozent (%) |
---|---|---|---|---|---|---|
cat (none) | 66 | 0,044 | – | – | 0,044 | 100,0 |
gzip | 22 | 0,015 | 684 | 0,032 | 0,047 | 106,4 |
bzip2 | 21 | 0,014 | 171 | 0,123 | 0,137 | 310,9 |
lzma | 15 | 0,010 | 335 | 0,045 | 0,055 | 124,5 |
xz | 15 | 0,010 | 308 | 0,049 | 0,059 | 133,4 |
lzop | 31 | 0,021 | 950 | 0,033 | 0,053 | 121,1 |
lz4 | 31 | 0,021 | 2000 | 0,016 | 0,036 | 82,2 |
zstd | 21 | 0,014 | 1600 | 0,013 | 0,027 | 61,6 |
Wie man sehen kann ist der Lesevorgang plus die Zeit, welche die Dekompression benötigt, nur bei Einsatz von lz4 oder zstd unter der Zeit, die eine unkomprimierte Ramdisk benötigt. Bei sehr schnellen Speichermedien ist es also fraglich, ob man überhaupt eine Kompression anwenden sollte. Der einzige Vorteil sind die reduzierte Anzahl der Schreib-/Lesezyklen auf das Speichermedium, im Bootvorgang selbst macht es aber keinen Unterschied mehr. Zumal wir hier von Zeit im Bereich weniger Millisekunden reden.
Spannender wird es, wenn man ein etwas langsameres Speichermedium verwendet. Als Beispiel eine SATA-3 SSD welche "nur" 500MB/s lesend schafft:
Algorithmus | Größe (MB) | Lesen (s) | Dekompression (MB/s) | Zeit (s) | Gesamt (s) | Prozent (%) |
---|---|---|---|---|---|---|
cat (none) | 66 | 0,132 | – | – | 0,132 | 100,0 |
gzip | 22 | 0,044 | 684 | 0,089 | 0,076 | 57,7 |
bzip2 | 21 | 0,042 | 171 | 0,339 | 0,165 | 124,9 |
lzma | 15 | 0,030 | 335 | 0,125 | 0,075 | 56,6 |
xz | 15 | 0,030 | 308 | 0,136 | 0,079 | 59,6 |
lzop | 31 | 0,062 | 950 | 0,091 | 0,095 | 71,7 |
lz4 | 31 | 0,062 | 2000 | 0,045 | 0,078 | 58,7 |
zstd | 21 | 0,042 | 1600 | 0,037 | 0,055 | 41,8 |
Auch hier ist zstd wieder klar führend, gefolgt von lz4 (gzip, lzma und xz fallen aufgrund der geringen Kompressionsgeschwindigkeit bei der Erzeugung weg). Lzo ist auch nicht wirklich schlecht, aber es ist doch ein deutlicher Unterschied gegenüber lz4 erkennbar. Und bzip2 ist für heutige Anwendungsfälle einfach nicht mehr geeignet.
Fazit
Lz4 ist das Mittel der Wahl. Der Algorithmus bietet, unter Berücksichtigung des Speichermediums, der Kompressionszeit/-rate, sowie der Dekompressiongeschwindigkeit, im Moment das beste Verhältnis. Zstd wird wohl der bessere Nachfolger, ist aber zur Zeit noch nicht im Kernel enthalten.
Es bleibt allerdings fraglich, ob bei Speichermedien >500MB/s die Kompression überhaupt noch Sinn ergibt. Die Werte sind jetzt schon kaum mess- geschweige denn wahrnehmbar.