Ein Überblick über Benchmark-Programme und deren Nutzung ist ein Bestandteil des Linux Performance Analyse & Tuning-Kurses, den ich halte. Gerade I/O Benchmarks sind mir dabei besonders wichtig, da es besonders im Storage-Bereich große Herausforderungen in Bezug auf die Performance gibt. Flashspeicher trägt zwar massiv dazu bei, diese Herausforderungen zu meistern. Die Datenmengen werden jedoch immer größer und Flashspeicher ist immer noch teurer als Festplatten.
Schon vor langem stieß ich dabei auf ein Programm, das besonders flexibel arbeitet: Der Flexible I/O Tester. Jens Axboe, Maintainer des Block Layers, der Schicht im Linux-Kernel, die blockweise auf Massenspeicher zugreift, schrieb diesen Benchmark. Er wollte sich nicht mehr für jeden Benchmark im Storage-Bereich, der für seine Arbeit sinnvoll ist, das passende Programm heraussuchen. Daher schrieb er ein Programm für alle möglichen Benchmarks. Der Flexible I/O Tester, kurz Fio, verwendet daher eine Job-Beschreibung, die den zu testenden Workload beschreibt. Es führt diesen Workload anschließend aus und misst IOPS, Bandbreite und Latenzen.
Das Programm ist ein sehr praktisches Werkzeug für den Kurs und einen eigenen Blog-Post wert. Allerdings gab es damals kein fertiges Paket für Debian. Also entschied ich mich bereits 2009 einfach selbst eins zu erstellen, das ich bis heute betreue. Im November 2015 baute ich auch das Erstellen eines Binär-Paketes für das grafische Frontend Gfio in das Quelltext-Paket ein.
Ein Paket erstellen
Ein Paket für Debian zu erstellen bedeutet, den Original-Quelltext des Programms auf eine Weise zu verpacken, die dem hohen Qualitätsanspruch und strengen Regeln der Debian Community entspricht. Dazu gehören unter anderem
- das Festlegen der Abhängigkeiten zu anderen Paketen, die beispielsweise Funktionsbibliotheken enthalten,
- das Erstellen einer Beschreibung,
- das Führen eines Changelogs für das Paket
- und die genaue Aufzeichnung des Copyrights und der Lizenzen für die Quelltext-Dateien.
Gerade letzteres ist mitunter recht aufwendig, da oft mehrere Autoren an einem Projekt arbeiten und für einige Teile des Projekts mitunter eine andere, kompatible Lizenz zum Einsatz kommt als für das eigentliche Projekt selbst. Diese Aufstellung ist jedoch wichtig, um zu dokumentieren, dass sich das Programm via Debian verteilen lässt.
Da es immer wieder neue Versionen gibt, paketierte ich wieder einmal die aktuelle Version für den Entwicklungszweig von Debian, der den bezeichnenden Namen „unstable“ trägt. Fio 2.10 ist damit seit Ende Mai im Archiv verfügbar.
Streng, aber gerecht? Debian´s Lintian
Es ist gute Praxis, am Ende das Debian-Werkzeug Lintian auf das gebaute Paket los zu lassen. Diese statische Analyse-Werkzeug prüft ein Debian-Paket und meldet gängige Fehler sowie Verstöße gegen die Debian Richtlinien.
So empfiehlt es einige Maßnahmen, um den Bau der Binärprogramme im Paket zu härten. Dazu gehört das sofortige Linken des Programms gegen die verwendeten Bibliotheken. Die Global Offset Table (GOT) leitet positionsunabhängige Adressen für Funktionen in der ausführbaren Datei oder der Bibliothek auf absolute Adressen. Das sofortige Linken ermöglicht die GOT vor Schreibzugriffen zu schützen. Zusammen mit den positionsunabhängigen Adressen (Position Independent Executable aka PIE) lässt sich das Layout der Adressen für den Prozess auf zufällige Weise ändern. Das Address Space Randomization (ASLR) genannte Feature dient als Schutz gegen Buffer Overflow-Angriffe (siehe Blog-Artikel meiner Kollegin Miriam Wiesner).
Während ich das sofortige Linken problemlos einschalten konnte, meldete der Linker beim Aktivieren von PIE einen Fehler:
1 2 3 |
/usr/bin/ld: crc/crc16.o: relocation R_X86_64_32S against `crc16_table' can not be used when making a shared object; recompile with -fPIC |
Diese zunächst etwas kryptische Meldung sagt letztlich nur aus, dass der Linker versucht, mit PIE zu linken, während der GCC Compiler aber nicht dafür gebaut hat. Den Grund dafür fand ich schließlich im Makefile: Es setzte die Compiler-Flags einfach hart und überschrieb die im Debian-Bauprozess gesetzten zusätzlichen Hardening-Optionen. Daher ist jetzt auch klar, wie ich auch diese Funktion in einem zukünftigen Paket aktivieren kann. Einen Patch reichte ich beim Upstream-Projekt bereits ein.
Neben diesen Empfehlungen fand Lintian auch noch Rechtschreibfehler im ausführbaren Programm und in der Manpage, die es auf typische Fehler prüft. Die behob ich gleich in einem Fork des Upstream-Repositories und sandte die Änderungen an Jens Axboe zurück, der sie bereits aufgenommen hat. In Bezug auf die fehlenden Manpages für einige Zusatzprogramme und Skripte, die Lintian ebenfalls erwähnt hat, habe ich indes noch nichts unternommen.
Sie möchten Support für Ihre Linux-Server?
Ich hoffe, ich konnte damit einen kleinen Einblick in die Arbeit als Paket-Maintainer bei Debian bieten. Eine gute Zusammenarbeit mit dem Upstream-Projekt erleichtert mir einerseits die Arbeit, da es die Änderungen, die ich lokal betreuen muss, reduziert. Andererseits trägt sie auch zum Upstream-Projekt selbst bei. Es ist eine solche Zusammenarbeit im Bereich der freien Software, die beständig dazu beitragen kann, die Qualität zu verbessern. Dazu tragen auch kleine Änderungen wie die Korrektur von Rechtschreibfehlern bei.
Betreiben Sie eigene Linux-Server? – Von Analysen des Ist-Zustands über Umbau-Maßnahmen, Neu-Installationen und Pakete bauen, bis hin zu Aktualisierungen und Wartungsarbeiten via Managed Services unterstützen wir Sie gerne dabei.