dWing — die Welt ist nicht gerecht

sign in

Tagesrückblick 2010-03-29

Habe mein vServer Paket hochgestuft, nun steht mir vier mal so viel Hauptspeicher zur Verfügung. Habe ein dist-upgrade auf die Lucid Beta versucht, ohne Erfolg. vServer neu installiert mit Hardy. Backups über rsync einspielen, Software auf Server installieren.

dWing wollte anfangs nicht. Update auf die aktuelle Entwicklungsversion. Bug behoben, dass bei fehlgeschlagener SQL Verbindung das Passwort im Stack Trace angezeigt wurde.

Die OpenID Bibliothek hat viel Stress verursacht. Im Endeffekt hat das php5-gmp Paket gefehlt. Die Bibliothek sagt allerdings nichts und produziert einfach falsche Ergebnisse. Viel Zeit mit der Lösungssuche verloren, geht nun.

Die Bibliothek selbst hat dringend eine Neuprogrammierung von null auf nötig.

Server bietet nun 160 Zugriffe/Sekunde, 530 für einfache Seiten.

Freie Video Formate und Idealismus

Die letzte Woche ist ein sehr positiver Trend zu erkennen. Sowohl Youtube als auch Vimeo stellen auf HTML5 <video> um. Somit sind die Tage von Flash hoffentlich gezählt.

Was allerdings bei beiden Diensten negativ auffällt ist die Fixierung auf H264. An sich ist es ein super Codec der qualitativ hochwertige und hochauflösende Inhalte bietet. Einen nachteil hat er allerdings: Der Codec verwendet patentierte Technologie. Dies ist auch der Grund warum Mozilla ihn nicht einsetzen will.

Robert O'Callahan erläutert die Gründe nochmals im Detail. Die Lizenzen für H264 sehen nicht nur Abgaben für Softwarehersteller wie Mozilla vor, die De- und Encoder entwickeln. Weiterhin sollen auch die Ausstrahlung mit einer Gebühr belegt werden.

Angesichts dessen ist es für mich noch weniger verständlich wieso Video Portale auf H264 setzen, wenn sie für die Ausstrahlung solcher Videos gebühren bezahlen müssen. Die Lizenzpolitik der MPEG-LA ist darüberhinaus sehr verwirrend und ändert sich Anfang nächsten Jahres grundlegend.


Besonders gefallen hat mir an Rocs Eintrag, dass Mozilla als Idealist hervorgehoben wird, dem die Freiheit des Web und dessen Benutzer am Herzen liegt. Noch ein Grund mehr, dass ich die Zweifel an mir selbst endlich überwinden muss und doch diese Richtung einschlagen sollte.

Die Kontakt- bzw. Rekrutierungsmesse an der FH am Donnerstag war interessant. Ich konnte einige technische Diskussionen mit Firmenvertretern führen. Alle samt waren sie daran interessiert technisch hochwertige Software zu schreiben und sagten, dass sie mitdenkende Mitarbeiter eher wünschen als welche die nur nach Befehlen handeln. Dennoch habe ich bei keinem der anwesenden Unternehmen eine Art Idealismus verspürt die (Software-)Welt in Richtung mehr Freiheit zu verändern.

Mein fünftes Semester dauert noch vier Tage lang, es stehen mir noch einige Klausuren bevor. Ich bin froh wenn es endlich vorbei ist. Leider habe ich größtenteils schlechte Gefühle wenn ich an mein bevorstehendes Praktikum denke.

Backups mit btrfs und rsync

Seit langer Zeit wollte ich schon, das Linux Dateisystem der nächsten Generation ausprobieren, nun habe ich es endlich gemacht. Die Rede ist von Btrfs. Ich habe mir also auf meiner externen auf einer Truecrypt verschlüsselten ext3 Partition einen 20G Container erzeugt und dieses per losetup eingebunden. Die Erzeugung des btrfs Dateisystems war blitzschnell. Dieses habe ich dann mit der compress Option eingebunden. Nachdem ich dann ein Subvolume erstellt hatte, habe ich ein altes Backup nach dem anderen per rsync in diesen Ordner geladen und danach jeweils einen Schnappschuss erstellt. Dank der copy-on-write Struktur von btrfs sind Schnappschüsse Sekundenschnell erstellt und verbrauchen keinen zusätzlichen Speicherplatz. Durch rsync dauert der Kopiervorgang auch nicht ganz so lang. Es werden nur geänderte Dateien kopiert. Leider ist der langsame Part allerdings das auflisten von zehntausenden kleinsten Dateien in zig Ordnern, bei dem selbst rsync nicht helfen kann.

Durch copy-on-write, Schnappschüsse und transparente Kompression kann ich an die 24G auf einem 9G btrfs Dateisystem speichern.

Die Geschwindigkeit ist akzeptabel, auch wenn sie unter der Schachtelung im losetup, ext3 und truecrypt leidet. Es wäre an der Zeit das Dateisystem auch auf einer echten Partition mal auszuprobieren. Leider unterstützt es noch keine transparente Kompression. Dies wäre sicherlich noch ein Killerfeature. Ich kann mir grad nicht vorstellen, wie man vor allem den eingebetteten Volume Manager mit Verschlüsselung zum Laufen kriegen sollte.

Auch ist es mir schon direkt aufgefallen, dass ich mit dem 31-er Kernel noch keine Schnappschüsse oder Subvolumes löschen kann. Da werde ich noch eine Zeit drauf warten müssen. Ich bin auch sehr gespannt wann btrfs bei der Installation von Ubuntu angeboten wird. Meine bisherigen Versuche eine VM nach Installation zu konvertieren sind leider fehlgeschlagen.

Alles in allem ist btrfs allerdings seinem Ruf gewachsen, das Linux Dateisystem der nächsten Generation zu sein. Ich freue mich drauf.

Malloc Überprüfungen

Zwei Blog Einträge die ich kürzlich gelesen habe veranlassten mich dazu ein weit verbreitetes Problem in der Softwareentwicklung kritisch zu hinterfragen. Ich empfehle jedem Interessierten sich die Einträge und deren Verweise durchzulesen, dennoch fasse ich einige Punkte zusammen die mich selbst sehr überrascht haben.

Worum geht es denn überhaupt? Wenn man anfängt C zu lernen und zum Thema Speicherverwaltung übergeht wird immer darauf hingewiesen, dass die Funktion malloc() welche Speicher reserviert in Ausnahmefällen auch NULL zurückliefern kann. Dieser Ausnahmefall tritt auf, wenn das System keinen Speicher mehr hat, sagt man. Man solle also immer brav den Rückgabewert von malloc(), realloc() und calloc() auf NULL überprüfen damit man keine Speicherverletzung, also den Zugriff auf nicht vorhandenen Speicher produziert in welchem Fall das Programm abstürzen würde. Mehr dazu später.

Sehr überrascht hat es mich zu erfahren, dass ein scheiterndes malloc() gar nicht die Situation des aufgebrauchten Speichers beschreibt. Vielmehr bedeutet es, dass der Adressraum nicht ausreicht um die geforderte Menge Speicher zu adressieren. Bei heutigen 64bit Systemen ist dies praktisch unmöglich. Selbst wenn ich alle meine Festplatten und Speichermedien in einen 64bit Adressraum abbilde wäre noch reichlich Adressraum vorhanden und malloc() würde nicht fehlschlagen. Bei 32bit Programmen die leicht über die Grenze von 2G kommen können wie beispielsweise rechen- und speicherintensiven Spielen ist die allerdings ein recht akutes Problem. Der Umstieg auf 64bit Systeme schafft Abhilfe und ist zumindest im Windows und Spieleumfeld lange überfällig.

Was passiert denn wirklich im Falle von erschöpftem Speicher, der fälschlicherweise als Grund für ein fehlschlagendes malloc() angenommen wird? Zumindest in einer Linux Umgebung schaltet sich der sogenannte OOM Killer ein. Dieser tötet ganz einfach einen beliebigen Prozess auf dem System um sich dessen Speicher zu holen. Bevor der OOM Killer allerdings überhaupt aktiv wird, wird bereits der Großteil der Programme auf den swap ausgelagert, wodurch die Performance vor allem eines Desktops sowieso in den Keller geht.

Weiters wird erwähnt, dass die Überprüfung des malloc Rückgabewertes meist sehr entwicklungsintensiv ist und in vielen Fällen gar nicht getestet wird. Bei einem Fehlschlag wird das Programm meist sowieso beendet. Ob dies nun durch einen Speicherzugriffsfehler geschieht oder weil man selbst das Programm beendet ist in dem Fall egal, das Ergebnis ist das selbe.


Eine weitere interessante Überlegung die ich vor längerer Zeit gelesen habe und erwähnenswert ist: malloc() macht nur einen geringen Teil von Speicherreservierung aus. Viel öfter wird durch Funktionsaufrufe ein neuer Stack angelegt und Platz für lokale Funktionsvariablen reserviert. Würde in solch einem Fall der Speicher aus gehen hätte man sowieso keine Möglichkeit etwas zu retten und das Programm stürzt sowieso ab. Und solche implizite Speicherreservierung tritt im Laufe eines Programmes viel öfter auf als die explizite Reservierung mittels malloc().

Was bringt ureadahead

Nachdem readahead in Jaunty durch sreadahead in Karmic ersetzt wurde gab es heute ein Update auf ureadahead in karmic-proposed.

Jedes dieser Systeme sollte die Startzeit verkürzen indem Dateien bevor sie benutzt werden bereits in den RAM gelesen werden.

sreadahead sollte vor allem SSD Speicher beschleunigen und ist parallel zum normalen Startvorgang gelaufen. Leider hatte es bei mechanischen Festplatten den gegenteiligen Effekt. Da es parallel gelaufen ist, hat es selbst andere Prozesse beim Festplattenzugriff ausgebremst und der Startvorgang wurde insgesamt langsamer.

ureadahead ist eine Weiterentwicklung dessen. Dabei unterscheidet ureadahead zwischen SSDs und mechanischen Festplatten. Bei mechanischen erstellt er zuerst eine Liste aller Dateien, die beim starten benötigt werden, sortiert diese dann gemäß ihrer physikalischen Position auf der Festplatte und liest diese dann beim nächsten Start der Reihe nach aus. Die Sortierung stellt sicher, dass der Lesevorgang möglichst sequenziell abläuft um Bewegungen der Leseköpfe zu minimieren und Datendurchsatz zu maximieren. Dabei warten andere Prozesse bis dieser Vorgang beendet ist.


Wenn ich meinen eben erstellten Bootchart mit einem älteren vergleiche sieht man gleich, dass die Startzeit um fast 15 Sekunden verkürzt wurde. Kleine Erklärung: In den Grafen oben bedeutet das Rosa, dass die Festplatte ausgelastet ist bzw. dass Prozesse auf Daten von der Festplatte warten. Blau bedeutet, dass der Prozessor wirklich Arbeit verrichtet. Die grüne Linie bedeutet Datendurchsatz. Ist weder Rosa noch Blau vorhanden dann passiert nichts, die Festplatte ist inaktiv und der Prozessor hat nichts zu berechnen.

Und da fallen mir gleich zwei Probleme auf, die verbessert werden müssen.

Alles in allem bin ich aber mit dem heutigen Update sehr zufrieden und hoffe darauf, dass in Zukunft noch mehr in diese Richtung unternommen wird.


older posts