2025-01-17

TPC-H auf einem Raspberry Pi

Gábor Szárnyas

Update: Das hier beschriebene Setup kann alle TPC-H-Queries auf den Datensätzen SF100, SF300 und SF1.000 mit DuckDB v1.2.2 und neueren Versionen ausführen. Die Zeiten in diesem Blogbeitrag stammen vom Januar 2025 mit DuckDB v1.2-dev.

Einleitung

Der Raspberry Pi ist eine Initiative für günstige, leicht programmierbare Mikrocomputer-Boards. Das erste Modell 2012 hatte einen einzelnen CPU-Kern mit 0,7 GHz, 256 MB RAM und einen SD-Karten-Slot – eine tolle Bildungsplattform. Mit der Zeit hat die Raspberry Pi Foundation immer leistungsfähigere Modelle vorgestellt. Das aktuelle Modell, der Raspberry Pi 5, hat eine 2,4-GHz-Vierkern-CPU und kann – mit Extra-Anschlüssen – sogar NVMe-SSDs als Speicher nutzen.

Letzte Woche gab es ein weiteres Upgrade für den Pi 5: Er ist jetzt mit 16 GB RAM erhältlich. Das DuckDB-Team experimentiert gern mit DuckDB in ungewöhnlichen Setups, etwa Smartphones in Trockeneis, und wollte einen neuen Raspberry Pi 5 in die Finger bekommen. Immerhin entsprechen 16 GB Speicher der Median-Gaming-Maschine laut Steam-Umfrage vom Dezember 2024. Also sollte der Pi ein paar Dutzend GB Daten schaffen, oder? Wir wollten es herausfinden.

Setup

Unser Setup bestand aus folgenden Komponenten, insgesamt 300 $:

Komponente Preis (USD)
Raspberry Pi 5 mit 16 GB RAM 120.00
Raspberry-Pi-27-W-USB-C-Netzteil 13.60
Raspberry-Pi-microSD-Karte (128 GB) 33.40
Samsung 980 NVMe SSD (1 TB) 84.00
Argon ONE V3 Case 49.00
Gesamt $300.00

Wir haben die Kühlkörper montiert, die SSD eingesetzt und das Gehäuse zusammengebaut. Hier ein Foto unserer Maschine:

Raspberry 5 im Argon-ONE-v3-Gehäuse

Experimente

Was schafft diese kleine Box? Wir haben die TPC-H-Last genutzt, um das herauszufinden.

Zuerst haben wir Raspberry Pi OS (ein Fork von Debian Linux) auf die aktuelle Version 2024-11-19 aktualisiert. Dann haben wir DuckDB Version 0024e5d4be nach den Raspberry-Pi-Build-Anweisungen gebaut. Damit die Queries einfach laufen, haben wir die TPC-H-Erweiterung in den Build aufgenommen:

Terminal window
GEN=ninja BUILD_EXTENSIONS="tpch" make

Dann haben wir DuckDB-Datenbankdateien mit den TPC-H-Datensätzen in verschiedenen Scale Factors (SF) heruntergeladen:

Terminal window
wget https://blobs.duckdb.org/data/tpch-sf100.db
wget https://blobs.duckdb.org/data/tpch-sf300.db

Wir haben für beide Scale Factors zwei Speicheroptionen genutzt. Im ersten Lauf lagen die Datenbankdateien auf der microSD-Karte – dem Speicher, den die meisten Raspberry-Pi-Setups haben. Die Karte reicht für OS und Programme und kann auch DuckDB-Datenbanken speichern, ist aber eher langsam, besonders bei schreibintensiven Operationen, einschließlich Spill auf die Platte. Deshalb lagen die Datenbankdateien im zweiten Lauf auf der 1-TB-NVMe-SSD.

Für die Messungen haben wir unser Skript tpch-queries.sql genutzt, das einen Cold Run aller TPC-H-Queries von Q1 bis Q22 ausführt.

`tpch-queries.sql` ```sql PRAGMA version; SET enable_progress_bar = false; LOAD tpch; .timer on PRAGMA tpch(1); PRAGMA tpch(2); PRAGMA tpch(3); PRAGMA tpch(4); PRAGMA tpch(5); PRAGMA tpch(6); PRAGMA tpch(7); PRAGMA tpch(8); PRAGMA tpch(9); PRAGMA tpch(10); PRAGMA tpch(11); PRAGMA tpch(12); PRAGMA tpch(13); PRAGMA tpch(14); PRAGMA tpch(15); PRAGMA tpch(16); PRAGMA tpch(17); PRAGMA tpch(18); PRAGMA tpch(19); PRAGMA tpch(20); PRAGMA tpch(21); PRAGMA tpch(22); ```

Das Skript haben wir so ausgeführt:

Terminal window
duckdb tpch-sf${SF}.db -f tpch-queries.sql

Es gab keine Abstürze, Fehler oder falschen Ergebnisse. Die folgende Tabelle enthält die aggregierten Laufzeiten:

Scale Factor Speicher Geometrisches Mittel Gesamtlaufzeit
SF100 microSD-Karte 23.8 s 769.9 s
SF100 NVMe-SSD 11.7 s 372.3 s
SF300 microSD-Karte 171.9 s 4,866.5 s
SF300 NVMe-SSD 55.2 s 1,561.8 s

Aggregierte Laufzeiten

Für den SF100-Datensatz lagen die geometrischen Mittel bei 23,8 Sekunden mit der microSD-Karte und 11,7 Sekunden mit der NVMe-Platte. Letzteres ist nicht weit von den 7,5 Sekunden entfernt, die wir mit dem Samsung S24 Ultra erreicht haben – 8 CPU-Kerne, die meisten mit höherer Taktung als die Raspberry-Pi-Kerne.

Beim SF300-Datensatz musste DuckDB wegen des begrenzten Systemspeichers mehr auf die Platte spillen. Das führte zu relativ langsamen Queries auf der microSD-Karte mit einem geometrischen Mittel von 171,9 Sekunden. Der Wechsel auf die NVMe-Platte brachte eine 3-fache Verbesserung: das geometrische Mittel sank auf 55,2 Sekunden.

Einzelne Query-Laufzeiten

Die einzelnen Query-Laufzeiten finden Sie unten.

Query-Laufzeiten (in Sekunden)
QuerySF100 / microSDSF100 / NVMeSF300 / microSDSF300 / NVMe
Q181.115.6242.055.1
Q27.92.427.87.9
Q331.511.8218.952.7
Q440.211.4157.540.9
Q532.212.3215.954.1
Q61.61.4155.932.7
Q712.112.3255.269.6
Q825.019.2298.077.8
Q974.050.1337.2147.7
Q1054.724.3234.982.6
Q117.82.334.014.9
Q1243.113.6202.950.5
Q1359.251.7207.4177.2
Q1433.09.7269.759.0
Q1511.17.1157.239.6
Q168.78.733.427.1
Q178.37.6249.466.2
Q1873.940.9374.7177.1
Q1966.017.8317.973.8
Q2022.48.4273.156.0
Q2166.935.2569.5172.5
Q229.28.434.126.7
Geomean23.811.7171.955.2
Total769.9372.34,866.51,561.8

Einordnung

Um die Ergebnisse einzuordnen, haben wir historische TPC-H-Ergebnisse angesehen: Mehrere Enterprise-Lösungen von vor 20 Jahren hatten ähnliche Query-Performance und meldeten oft über 60 Sekunden als geometrisches Mittel ihrer Query-Laufzeiten. Damals kosteten diese Systeme – inklusive Softwarelizenz und Wartung – rund 300.000 $! Das heißt: Ignoriert man die Wartung, hat sich die „Bang for your Buck“-Kennzahl (Preis-Leistungs-Verhältnis) für TPC-Lesequeries in den letzten 20 Jahren um etwa den Faktor 1.000 verbessert. Ein schönes Beispiel dafür, was kontinuierliche Innovation in Hardware und Software in modernen Systemen ermöglicht.

Hinweis: Die hier gezeigten Ergebnisse sind keine offiziellen TPC-H-Ergebnisse und umfassen nur die Lesequeries von TPC-H.

Zusammenfassung

Wir haben gezeigt, dass Sie DuckDB in einem Raspberry-Pi-Setup für 300 $ nutzen können, das alle Queries auf dem TPC-H-SF300-Datensatz in unter 30 Minuten ausführt.

Wir hoffen, der Beitrag hat Ihnen gefallen. Wenn Sie ein interessantes DuckDB-Setup haben, teilen Sie es mit uns!

Haben Sie ein cooles DuckDB-Setup? Wir würden gern davon hören! Schreiben Sie darüber in den sozialen Medien oder mailen Sie Gábor Szárnyas.