Parallele Programmierung auf dem Raspberry Pi

Durch seine Multicore-Architektur ist der aktuelle Raspberry Pi eines der günstigsten Geräte für die parallele Programmierung. Ein wenig Tuning hilft dem Python-Code zusätzlich auf die Sprünge.

Werkzeuge  –  3 Kommentare
Parallele Programmierung auf dem Raspberry Pi

Als der Einplatinencomputer Raspberry Pi Anfang 2012 das Licht der Welt erblickte , wussten seine Macher nicht, dass ihr Rechner-Baby ein großer Markterfolg wird. Die Idee der britischen Raspberry Pi Foundation war, einen einfach aufgebauten günstigen Heimcomputer zu schaffen, um jungen Menschen den Erwerb von Programmier- und Hardwarekenntnissen zu erleichtern. Deswegen setzten sie den Preis niedrig an – je nach Modell auf etwa 35 Euro.

Bis Anfang März 2016 wurden über acht Millionen Geräte verkauft, was den Computerzwerg zum bestverkauften Computer aller Zeiten des Vereinten Königreichs machte. Die Macher stellten Raspberry Pi 2 im Februar 2015 vor und kündigten ein Jahr später das Model Raspberry Pi 3 an. Beide besitzen einen Vierkernprozessor auf ARM-Cortex-Basis. Die Multicore-Architektur macht den kleinen Einplatinencomputer zu einem der günstigsten Geräte für die parallele Programmierung und ermöglicht das Experimentieren in diesem Gebiet auch ohne Rechner mit vielen Prozessoren.

Paralleler Zwerg

Vielleicht klingt das ein wenig übertrieben, aber der Computerzwerg schuf alle Voraussetzungen, um getestet zu werden. Das "Pi" steht für "Python interpreter" und das empfohlene Betriebssystem Linux-Rasbian besitzt einen vorinstallierten Python-Interpreter. Sein multiprocessing-Modul kann das Problem des Global Interpreter Lock (GIL) umgehen, weil es die Python-Prozesse unabhängig voneinander startet. Dadurch entsteht keinen Overhead zur internen Kommunikation zwischen einzelnen Threads wie beim Modul threading und die Implementierung für den praktischen Einsatz ist relativ einfach. Es ist durchaus möglich, den kleinen Rechner als ein autonomes System wie einen Roboter oder eine Wetterstation einzusetzen. Dabei sammelt er die Daten und führt die erste Analyse in parallelen Prozessen durch.

Im letzten Jahr testete der Autor das MapReduce-Verfahren unter Verwendung des Moduls auf einem Laptop mit Intel-i7-Prozessor zur Analyse der Oracle-TNSLISTENER-Log-Dateien. Das wirft die Frage auf, wie performant das ähnliche Verfahren auf dem Einplatinencomputer läuft. Dabei sollen einige Programmiertechniken und die C-Extensions für Python, Cython zum Performance-Tuning beitragen, was unten detaillierter betrachtet wird.

Beschreibung des Problems

Die Oracle-Datenbank ist eine komplexe Software und verfügt über mehrere Komponenten, die ihre Log-Dateien schreiben. Eine entscheidende Komponente namens TNSLISTENER ist für die Kommunikation zwischen den Oracle-Clients und dem Datenbankserver zuständig. TNSLISTENER schreibt die Log-Einträge im Text- und XML-Format. Die Abbildung 1 zeigt das Format der TNSLISTENER-XML-Einträge.

Ein Beispiel einer TNSLISTENER XML-Log-Datei (Abb. 1)


Standardmäßig sind die XML-Dateien 10 MByte groß. Der Autor hatte knapp über 3000 Dateien, was einem Datenvolumen von etwa 30 GByte entspricht. Die geplante Analyse auf dem Raspberry Pi sollte die Anzahl der Verbindungen je Programm und Client ermitteln (s. Abb. 2). Für diese Aufgabe passt das MapReduce-Entwurfsmuster sehr gut. Es taugt für die parallele Verarbeitung der Daten und ist einfach in Python zu implementieren.

Das Ergebnis der Analyse der TNSLISTENER-XML-Log-Dateien (Abb. 2)