Ein Blog von Eduard Dopler

Artikel-Schlagworte: „Performance“

Zurück zur Gesamtübersicht auf der Startseite.

Kurztest: LZO-Komprimierung

Donnerstag, 6. Januar 2011

Kurz nach meinem ausführlichen Benchmark der Kompressions­algorithmen 7z, bzip2, gzip und ZIP fand ich das Lempel-Ziv-Oberhumer-Verfahren (LZO). Es bekam mit dem gerade veröffentlichten Kernel 2.6.37 eine neue Rolle. Dank der überaus großen (De-)Kompressionsgeschwindigkeit komprimiert es nun den Arbeits­speicher­inhalt, wenn dieser beim Hibernate („Ruhezustand“) auf die Festplatte geschrieben wird. Das Ziel ist es, weniger Schreiboperationen zu erzeugen und somit das Schlafenlegen und Aufwachen zu beschleunigen.
Grund genug, diesen vielversprechenden Algorithmus auf meine Testdaten loszulassen!

Das nenne ich schnell!

Da die Testkonfiguration im letzten Artikel bereits ausreichend beschrieben ist, kommen wir gleich zum Ergebnis: Die gesamten 279,4 Megabyte waren in gerade einmal 5 Sekunden gepackt! Das ist etwa dreimal so schnell wie der bisherige Geschwindigkeitssieger gzip.

Und die Kompressionsrate?

Bei diesem Tempo kann man sich schon denken, dass die Kompressionsrate dementsprechend mager ausfallen muss. 85 Megabyte bleiben übrig, was eine Rate von ca. 3,3 ergibt. Trotzdem schneidet LZO in dieser Kategorie kaum schlechter ab als ZIP, welches siebenmal länger für den Datensatz benötigt.

Fazit

Im Fazit ist LZO also immer dann zu empfehlen, wenn Daten besonders schnell ge- und wieder entpackt werden müssen.

Meine Geschwindigkeitsempfehlung lautet schließlich LZO.

Wermutstropfen

Leider gilt auch bei LZO, wie schon beim Sieger 7z in der anderen Kategorie, dass der Algorithmus standardmäßig in Ubuntu nachinstalliert werden muss (Paket lzop) und damit nur bedingt für die Weitergabe an andere geeignet ist. Aber dafür ist dieses Verfahren wohl eh nicht gedacht.

Der große Kompressions-Vergleichstest (Ubuntu-Standardverfahren)

Mittwoch, 5. Januar 2011

Das klassische ZIP? Oder lieber tar-gepackt in Kombination mit bzip2 oder gzip? Oder doch lieber modern mit 7zip? Diese Frage stellte ich mir jedes Mal, wenn ich Nautilus’ Kontextmenü-Eintrag zum Komprimieren von Daten nutzte. Warum also nicht ein pseudo-wissenschaftlicher, empirischer Test?

Welche Formate testen wir?

Dieser Vergleichstest soll weder eine detaillierte Studie werden noch soll sie möglichst viele Kompressionsalgorithmen testen. Ich habe mich bei meiner Auswahl dazu entschlossen nur eine Hand voll Komprimierungsverfahren zu prüfen und auch nur diejenigen, die bei der Ubuntu-Standardinstallation dabei sind. Eine Ausnahme bildet 7zip. Da seine Kompressionsstärke überall gefeiert wird und eine Nachinstallation in Ubuntu kinderleicht ist (empfohlenes Paket: p7zip-full), hat es dieser Algorithmus auch in die Auswahl geschafft. Es treten also gegeneinander an:

  • 7z 9.04 beta
  • bzip2 1.05
  • gzip 1.3.12
  • ZIP 3.0

Ich denke, die Begründung für bzip2 und gzip sind einleuchtend; es gibt kaum andere Formate, die in der Unix-Welt häufiger vorkommen. ZIP hingegen wird von vielen als Quasi-Standard angesehen – Wir überprüfen, ob diese Annahme berechtigt ist.
Man könnte sich nun fragen, warum nicht mehr Formate aufgenommen wurden. Nun, mir war wichtig, gängige Algorithmen zu nehmen und nicht exotische, die auf den meisten Systemen Probleme verursachen. Meiner Meinung nach ist bei komprimierten Daten wichtig, dass sie fast so leicht wie nicht-komprimierte zu handhaben sind. Die Mühe lohnt häufig nicht, wenn die Zeit-/Volumenersparnis beim Empfänger des Archivs durch eine nötige Nachinstallation zunichte gemacht wird.

Welche Einstellungen?

Ähnlich sieht die Begründung für die vorgenommenen Einstellungen aus. Ich verwende für alle Tools die Standardeinstellungen. Das sind auch genau die, die das Ubuntu-Programm file-roller anwendet. Das hat den Vorteil, dass nur ein Rechtsklick auf die Datei(en) und einer auf Komprimieren… notwendig ist, um ein verkleinertes Archiv zu erhalten. Ich vermute, dass das die häufigste Variante des Komprimierens bei Ubuntu-Nutzern ist.
Um es einmal deutlich zu sagen: Es geht nicht darum, für jedes Verfahren die optimalen Optionen zu verwenden und diese dann miteinander zu vergleichen. Ich behaupte, dass die Standardeinstellungen schon hinreichend vernünftig sind und dass sich vor allem der Normalbenutzer selten die Mühe macht, die passende Konfiguration zu suchen, sondern eben die vorgegebenen Werte nimmt. Natürlich bleibt es weiterhin jedem selbst überlassen, sein Lieblingstool so zu verwenden, wie es ihm/ihr behagt.

Welche Daten?

Als zu komprimierenden Datensatz habe ich mich für ein Quellcode-Paket von Firefox entschieden. Dieses Paket enthält neben Bildern vor allem ASCII-Dateien, mit denen sich die Algorithmen austoben können, um ihre Stärken und Schwächen offenzulegen. Außerdem halte ich diese Daten auch für alltagstauglich. Das belegen auch einige anschließenden Nachtests, die ähnliche Ergebnisse lieferten wie mit diesem Paket. Direkt zu beziehen ist die Datei von dem Mozilla-FTP-Server.

Die Testumgebung

Dieser Benchmark wurde auf einem mobilen Computer mit Intel Core 2 Duo P8400-Prozessor (2,26 Ghz) auf einer tmpfs-Partition ausgeführt. Eine solche RAM-Partition liest und speichert Dateien nicht auf einer Festplatte, sondern dem Arbeitsspeicher. Somit konnte ich langsame Schreiboperationen vermeiden. Das Betriebssystem ist Ubuntu 10.10 Maverick mit Ubuntu-Kernel 2.6.35-24-generic.

Die Methode

Zum Hauptthema, dem Vergleich der einzelnen Verfahren. Untersucht wurden zwei Eigenschaften: die benötigte Zeit zum Packen der Dateien (Geschwindigkeit) und die letztendliche Größe des entstandenen Archivs (Kompressionsgrad). Wie gesagt, um das Ubuntu-Standardverfahren zu erhalten, wurde file-roller aufgerufen. Die Dauer wurde (nach Anlaufschwierigkeiten) mit time ermittelt. Um leichte Schwankungen auszugleichen, muss jeder Algorithmus fünfmal ran. Diese Arbeit erledigt ein selbstgeschriebenes Bash-Script für mich.

#!/bin/bash 
#analyze time needed to compress data with several compression algorithms 
#using file-roller and time 
 
ARCHIVES='7z tar.bz2 tar.gz zip' 
INPUT='data/' 
MAXITER=5 
TIMEOPTS='-a -o stat -f "%C\t%e"' 
 
for (( I=1; $I <= $MAXITER; I++ )) 
do 
	for TYPE in $ARCHIVES; do 
		echo "Round #$I compressing $TYPE..."
		/usr/bin/time $TIMEOPTS file-roller -a archive$I.$TYPE $INPUT 
	done 
	echo '---' 
done

Die Variable $ARCHIVES enthält die zu nutzenden Algorithmen, $INPUT die Quelldaten, während $MAXITER die Anzahl an Durchgängen bestimmt und $TIMEOPTS die Optionen für time festlegt. In meinem Fall wird hier die Zeitmessung in eine Datei stat geschrieben und fortlaufend ergänzt (-a) und zwar in meinem bestimmten Format, bestehend aus dem ausgeführten Befehl, einem Tabulator und der effektiven Zeit. (Sämtliche Formatierungen finden sich in der man-page von time.)

So viel zur Geschwindigkeit. Der zweite Aspekt, der Kompressionsgrad, wurde anschließend mit

ls -l

bestimmt.

Das Ergebnis

Kommen wir nun endlich zum Ergebnis des Tests.
7z: 7,4; bz2: 6,1; gz: 4,9; zip: 3,4 (mal kleiner als Originaldateien) 7z: 107s; bz2: 76s; gz: 16s; zip: 36s

Damit lassen sich folgende Schlüsse aus den Daten ziehen:

  • 7z bietet die beste Leistung, dauert aber auch am längsten.
  • ZIP lohnt sich nicht. gz ist deutlich schneller und komprimiert besser.
  • bz2 erweist sich als schlechter Kompromiss aus 7z und gz, denn je nach Geschwindigkeits- oder Leistungspräferenz bieten sich eher die Konkurrenten an.

Persönliche Einschätzung

Ich muss sagen, für mich brachte der Test neue Erkenntnisse. Während ich bisher Dateien häufig mit bz2 komprimierte, werde ich jetzt wohl so oft wie möglich auf gz vertrauen, weil es die Daten schon recht effizient stauchen kann. Nur in den Fällen, wo eine möglichst starke Kompression vonnöten ist, wird 7z weiterhin mein Favorit bleiben. Zu ZIP bleibt dann nicht mehr viel zu sagen, nur, dass ich hoffe, diesen Quasi-Standard (ähnlich MP3) langsam aber sicher vom digitalen Spielfeld/aus dem Internet verschwinden zu sehen.

Eine kleine Anmerkung zu gz: Als einziges der getesteten Verfahren ist gz nicht „md5sum-sicher“, d. h. allein anhand eines veränderten MD5-Hashes lässt sich nicht darauf schließen, ob die Daten im Archiv verändert wurden oder identisch sind.

Download

Hier gibt es die Rohdaten und das Bash-Script zum Download.
compresstest.sh (399B text/x-shellscript) oder
compresstest.sh.gz (319B application/x-gzip)
comprtest_output.txt (1,4KB text/plain) oder
comprtest_output.txt.gz (321B application/x-gzip)

Nachtrag

→ Beachten Sie auch den anschließenden Kurztest des vielversprechenden Kompresssionsverfahrens LZO.

Update am 06.01.2011 13:50

USEA #1 GRUB-Wartezeit anpassen

Mittwoch, 3. November 2010

Grub-Logo von Karol Krenski

Meiner Meinung nach sind zehn Sekunden eine viel zu lange Zeit, die GRUB auf einen wartet, bevor der oberste Eintrag aus der Liste geladen wird. Natürlich kann man das durch ein Tippen auf beschleunigen, doch wäre es nicht komfortabler, wenn man nach dem Startknopf nicht mehr an den Rechner/die Tastatur muss und das System trotzdem schnell startet? Deswegen verkürze ich die GRUB-Wartezeit immer.

Konfiguration ändern

Bei GRUB ging es noch einfach über die Konfigurationsdatei. Für GRUB2 muss man diese anschließend noch einlesen lassen. Also zuerst die Datei /etc/default/grub anpassen: Der Wert hinter

GRUB_TIMEOUT=

muss auf die gewünschte Zeit in Sekunden gesetzt werden. Meines Erachtens reicht hier eine Sekunde. In der Regel startet man die zusätzlichen Kernel-Konfigurationen und Betriebssysteme ja selten genug, sodass man in einem solchen Fall auch direkt eingreifen, also eine Taste drücken, kann, damit der Timer stoppt.

Konfiguration übernehmen

Wie erwähnt muss seit Version 2 die Einstellung noch eingelesen und geschrieben werden. Das erledigt der folgende Befehl.

sudo update-grub

Nun sollte die gesamte passive Bootdauer um einiges kürzer sein.

[ This blog entry is also available in English. ]

Maverick – „Upgrade des Todes“ oder: Der Zweite Versuch

Dienstag, 2. November 2010

Bild von einem Erdmännchen. von b r e n t (cc-by)

Obwohl das Upgrade-System Ubuntus ja eigentlich ausgereift sein sollte, erlebte ich vergangenen Monat beim Umstieg von Lucid auf Maverick gleich mehrere unangenehme Überraschungen:

  • periodische Aussetzer und System-Freezes
  • Knackser bei der Audioausgabe nach längerer Inaktivität
  • langsamer Systemstart

Vor allem das erste Phänomen führte zu einem Computer, der nicht mehr produktiv eingesetzt werden konnte. Alle paar Sekunden fror er komplett ein – und zwar so lange, bis man die Maus bewegte. Getipptes wurde ab einigen Buchstaben nicht mehr angezeigt, erst das Bewegen des Mauszeigers aktualisierte den Bildschirm. Das Problem müsste übrigens auf den Bug 30032 zurückzuführen sein.

Hilft ja alles nichts, ne

All diese Umständen zwangen mich nun also, Ubuntu komplett neu aufzusetzen. Schnell noch die Backups auf den neusten Stand gebracht, das Ubuntu Maverick-Image auf den USB-Stick gezogen und installiert.

Da bei mir nach einer Neuinstallation immer die gleichen Schritte anfallen, habe ich mich dazu entschlossen, dazu eine Themenreihe hier im Blog zu starten; USEA! Ubuntu-Standard-Einstellungen-Anpassen. Damit entfällt, nach einer Neuinstallation immer wieder die gleichen Tricks mühsam aus dem Netz zusammensuchen zu müssen.

Los geht’s!

[ This blog entry is also available in English. ]