Ungeschriebene Software #1: Adaptive GZip

Mir schwirren Ideen für einige Progamme im Kopf rum, die ich zwar gerne schreiben würde, aber leider keine Zeit dafür habe. Eine Idee wäre ein adaptives GZip oder auch Max-Throughput GZip.

Problem

gzip ist ein Streamkompressor, es komprimiert einfach einen Strom von Daten ohne auf eine besondere Struktur oder auf besondere Inhalte acht zu geben, kurz was es komprimiert, das ist  ihm egal. Meist wird explizit oder implizit in einer Pipe verwendet, also Quelle  | gzip  | Ziel. Beispielsweise tar -c irgendwas | gzip | netcat anderer_rechner um ein Backup auf einem anderen Rechner zu speichern. Statt tar könnte man jetzt auch dd nehmen, oder netcat einfach durch eine Datei ersetzen. Nutzt man tar mit der -z Option,  dann macht es implizit eine interne Pipe auf.

Hier hat man schon zwei Ziele:

  • Höchstmöglichste Kompression
  • Kurzmöglichste Laufzeit (aka Geschwindigkeit, Durchsatz/Throughput)

Hier ist schon der erste Gegensatz, heutige PCs sind selten schnell genug um beides zu liefern. Zu den Beschränkungen (Randbedingungen) gehören

  • Geschwindigkeit der Quelle (wie schnell kann ich lesen)
  • Geschwindigkeit des Ziel (wie schnell kann ich schreiben)
  • Geschwindigkeit der Komprimierung (wie schnell sind CPU/Speicher)
  • Art der Daten (gut komprimierbarer Text, schlecht komprimierbare Binärdaten)
  • Geschwindigkeit der Pipes, der Einfachheit halber den Geschwindigkeiten der Quelle und des Ziels zugeschlagen.
  • Einstellbarer Kompressionsgrad (bei gzip -1 bis -9)

Das bringt uns dann zu folgenden Extremen:

  • Die Quelle ist langsamer als der Kompressor -> stärkere Kompression möglich da Kompressor nicht ausgelastet ist
  • Das Ziel ist langsamer als der Kompressor -> stärkere Kompression möglich, da Kompressor nicht ausgelastet ist
  • Der Kompressor ist langsamer als die Quelle und/oder Ziel -> Kompression runterschalten um den Durchsatz nicht zu bremsen

Natürlich kann sich auch alles während der Ausführung ändern, beispielsweise weil die Daten sich ändern (Text führt zu weniger komprimierten Bytes, Ziel muss weniger entgegennehmen), andere Prozesse dem Kompressor die Rechenleistung stehlen, oder Quelle und Ziel ihre Geschwindigkeit ändern, weil beispielsweise in langsamere Bereiche der Festplatten geschrieben werden.

Der Nutzer kann zwar eine Vermutung anstellen, was die Hardware schaffen könnten und eine angemesse Kompressionsstufe wählen, aber ich bezweilfe dass er jemals das Optimum treffen wrd. Und oftmals werden Backups unter Zeitdruck angefertigt, die möglichst kurze Ausführungzeit ist da Pflicht..

Die Lösung

Adaptive gzip sollte automatisch die Kompressionsstufe anpassen können, sobald es merkt, dass die CPU nicht ausgelastet ist, weil Quelle und/oder Ziel nicht mitkommen, oder es merklich bremst und daher schneller und mit weniger Kompression laufen sollte. Optimalerweise sollte es heutzutage auch multi-threaded sein umd mehrere Prozessoren und Kerne nutzen zu können.

Meines Wissens nach sind mehrere aneinandergefügte gzip Ströme oder Dateien auch ein gültiger gzip Stream, so das man quasi  bei Änderung der Kompressionsstufe einfach den alten Stream abschliesst und einen neuen Stream anfängt und diesen bis zur nächsten Änderung bei behält. Dabei muss natürlich immer ein Blick auf den Füllstand der Ein- und Ausgabepuffer geachtet werden. Die Verarbeitung sollte dabei immer Blockweise geschehen und nach Abarbeitung eins Blocks und vor verarbeiten des nächsten Blocks sollte überprüft werden ob eine Änderung der Kompressionsstufe sinnvoll wäre, basierend auf Pufferfüllstand und wie lange die Puffer bereits gefüllt sind, also warten.  Hier könnte sich schon eine threadbasierte Lösung für Eingabe, Verarbeitung, Ausgabe anbieten.

Von gzip existiert bereits eine parallelisierte Variante namens pigz, welches auf der zlib basiert. Alle drei Programme sind von den gleichen Entwicklern. Als Weiterentwicklung von adaptive gzip könnte man die blockweise Verarbeitung auf mehrere Threads verteilen, dabei müsste die Ausgabe wieder in der korrekten Reihenfolge serialisiert werden, da durch unterschiedliche Kompressionsstufen evt. schwächer komprimierte Blöcke vorherige stärker komprimierte Blöcke überholen könnten.

Wiederholte gzip header könnten evt. den finalen Kompressionsgrad verschlechtern.

Die Entwicklung der Fomel oder des Algorithmus für die Anpassung des Kompressionsgrad könnte durchaus interessant sein....

Leider keine Zeit

Der Teufel steckt bei der Idee wie so oft im Detail und die Details oder Features könnten überhand nehmen. Vielleicht möchte man früher oder später per Parameter die Größe der Blöcke, Puffer, min threads, max  threads und einen bereich für Kompressionsgrad angeben. Wer weiss was sonst für Probleme bei der Implementierung auftreten können. Vielleicht ist die Idee auch nicht zu Ende gedacht. So oder so. Momentan hab ich leider keine Zeit dafür sad.

Schrott des Monats: Aten IP8000 Remote Management

Mittwoch Abend ist die OCZ Vertex 2 SSD in meinem Server ausgefallen. Leider hatte ich erst Freitag Abend wieder Zugriff auf die Kiste, so das 2 Tage keine Kommunikation mit mir möglich war (Jabber, E-Mail, Web) und mir auch ein ganze Menge anderer Dienste (Terminkalender, Source Code Repositories, Musik, diverse Dateien) fehlten. Tja, passiert. Da hatte ich die Idee mir eine Remote Management Console zuzulegen um die Kiste remote warten zu können. Auswahl gibt es da nicht viel. Am vielversprechensten sah noch die "ATEN IP8000 Remote Management PCI Card" aus, die ein Webinterface mit Remote Console und die Möglichkeit remote Medien einzubinden bietet. Momentan bin ich beruflich ein bisschen von den IBM IMM Interfaces verwöhnt :) 

Ich habe die Karte seit zwei Tagen im Einsatz und ich mag sie jetzt schon nicht mehr.

  • Die letzten Updates für Karte und Clients gab es 2009.
  • Die Web-Remoteconsole wird automatisch beendet wenn man das Webinterface weiter nutzt, beispielsweise um einen Reset auszulösen.
  • Remote ein Medium einbinden funktioniert nur mit dem zu installierenden Windows-Client, nicht mit dem Webinterface.
  • Selbst das funktioniert nicht zuverlässig, es kommt immer zu Lesefehler, das Verifizieren oder Laden eines Live Images braucht man gar nicht erst zu versuchen.
  • Das Webinterface lauscht standardmässig auf https(=:443), alles andere braucht weitere Ports, beispielsweise die Remote Console standardmässig 9000 -> nicht Firewall-optimiert.
  • Im Windows-Client funktioniert der Knopf "Admin-Utility" nicht, sondern bringt die Fehlermeldung "Configuration Data format is not correct"
  • Das Remote Console Fenster wird üblicherweise zu klein gewählt, man kriegt immer Scrollleisten und muss erstmal das Fenster groß ziehen. 
  • Die ALT-Taste wird aus irgendwelchen Gründen auf F12 gemappt, womit F12 erst funktioniert, wenn man das Mapping ändert.

Alles in allem ein Fehlkauf für 180 Euro.

Einerseits sehe ich ein, das man so eine kleine Stand-Alone Karte nicht mit den integrierten IMMs der IBM Server vergleichen kann, aber andererseits sage ich mir auch, das wenn eine Firma sowas als ein spezielles Produkt anbietet, dann sollte es auch überzeugend sein. 

Rubrik: