Exemplarisch lässt sich dies an der Entwicklung eines Linux-Treibers zur Entgegennahme von Daten demonstrieren, die von einem externen Gerät gestreamt werden. Zwar enthält der Linux-Kernel native Mechanismen, um sicherzustellen, dass der Treiber korrekt funktioniert, aber das Debugging und das Evaluieren der Performance ist alles andere als trivial. Hier lohnt sich ein Blick auf neue Trace-Tools, die Support für Embedded Linux bieten. Kann beispielsweise Tracealyzer gute Dienste leisten – sowohl bei der Analyse von Treibern und Interrupt-Handlern als auch bei der Untersuchung der Userspace-Applikationen und der Compiler-Optionen?
Trace-Tool mit einer auf Yocto basierenden Linux-Distribution
Klären lässt sich diese Frage, indem man das Trace-Tool mit einer auf Yocto basierenden Linux-Distribution nutzt, wobei zunächst ein individueller Layer auf einem Board-Support-Package erstellt wird, um die open-source verfügbare LTTng-Bibliothek nutzen zu können. Hierdurch stehen mehrere hilfreiche Optionen für die Ausführung des Treibers als Bestandteil des Linux-Systems, einschließlich des Kernels, zur Verfügung. Außerdem wird eine ganzheitlichere Sicht auf den Treiber geboten, um die Ursachen möglicher Engpässe zu finden oder sicherzustellen, dass Engpässe gar nicht erst entstehen.
Ein zu Diagnosezwecken dienendes Trace-Tool kann auch beim Aufdecken von Performance-Problemen im IRQ-Handler helfen, ohne dass auf die ungeliebte printk-Anweisung zurückgegriffen werden muss. So könnte es zum Beispiel notwendig werden, den Device-Interrupt über den I2C-Bus zu bestätigen, um ein Thrashing zu verhindern. Ohne das Trace-Tool hätte man diesen Bug überhaupt nicht oder erst kurz vor dem Release-Datum beim Entfernen der externen printk-Aufrufe entdeckt. Deutlich werden mit dem Tool auch die gravierenden Auswirkungen, die das Einbinden von printk-Anweisungen in einen Interrupt-Handler hat. Mit dem Einsatz des Trace-Tools werden Modifikationen am Treiber in einer späten Phase vermieden, die zu deutlichen Verzögerungen und Mehrkosten führen können.
Best-Effort-Algorithmus des Linux-Kernels
Mithilfe des Trace-Tools lässt sich ferner überprüfen, wie sich das Festlegen der CPU-Affinität auf die Leistungsfähigkeit eines Prozesses auswirkt. Eine Analyse der Wechselwirkungen zwischen den verschiedenen Verarbeitungselementen – sowohl unter normalen Bedingungen als auch bei Belastung – lässt den Best-Effort-Algorithmus des Linux-Kernels erkennen und es wird deutlich, welche Bereiche des Schedulers im Linux-Kernel und der iperf-Codebasis genauer zu untersuchen sind.
Noch besser können Trace-Tools ihre Leistung ausspielen, wenn die Performance von Userspace-Applikationen evaluiert werden soll. Indem die Ausgabe des Trace-Tools mit LTTng-Tracepoints zusammengeführt wird, erhält man eine wertvolle Möglichkeit, die Performance der Applikation zu ermitteln, etwaige Fälle abnormalen Verhaltens aufzudecken und eine abstrakte Timing-Statistik einzuholen. Anschließend kann das Tool zur Behebung etwaiger Timing-Probleme und zur Verbesserung der Applikations-Performance genutzt werden.
Mit der Kombination aus Trace-Tool und LTTng-Bibliothek lässt sich ebenfalls schneller verstehen, wie sich bestimmte Compiler-Optionen auf die Leistungsfähigkeit von Userspace-Applikationen auswirken, die Gleitkomma-Berechnungen ausführen. Meist werden derartige Analysen erst nachträglich (und mit erheblichem Zeitaufwand) vorgenommen, wenn die Performance der Applikation hinter den Erwartungen zurückbleibt. Besser ist es, das Tool bereits während der Entwicklung zum Verifizieren des Software-Timings einzusetzen.
Mit Trace-Tools Leistungsfähigkeit von Embedded-Linux-Systemen optimieren
Insgesamt können Trace-Tools wie Tracealyzer überaus hilfreich sein, um verborgene Fehler zu entdecken und die Leistungsfähigkeit von Embedded-Linux-Systemen zu optimieren. Ausgehend von abstrakten Übersichtsdarstellungen lassen sich genauere Analysen vornehmen, die beispielsweise Prozess-Interaktionen, das Verzweigen von Prozessen, die Auslastung der CPU-, RAM- und I/O-Ressourcen, die Dateinutzung, Zustandsautomaten und anwenderdefinierte Metriken näher beleuchten. Dabei werden aussagefähige, intuitive Trace-Ansichten mit den nötigen Details erzeugt.
Mithilfe einer individualisierbaren Ereignis-Interpretation erfolgt eine Anpassung an bestimmte Anwendungsfälle, und es lassen sich so benutzerdefinierte Datensätze, wie etwa Intervalle und Zustandsautomaten, mit weitreichend konfigurierbaren Ansichten darstellen. Die quelloffene LTTng-Bibliothek bietet hier zusätzlich eine Fülle von Möglichkeiten zur Erkundung der unterschiedlichsten Aspekte eines Embedded-Linux-Designs – von den Treibern und Interrupt-Handlern bis zu den Userspace-Applikationen und Compiler-Optionen. Der Einsatz einer solchen Kombination schon während des Entwicklungsprozesses sorgt für mehr Transparenz, und ermöglicht auch eine frühzeitigere Problembehebung. Dies führt dazu, dass sich verborgene Bugs gar nicht erst einschleichen und spart im weiteren Verlauf eines Projekts sowohl Kosten als auch Zeit.
Autor
Mohammed Billoo ist Gründer von MAB Labs