Anleitung

Geschwindigkeit von overpass-rust und Overpass API

overpass.ch beantwortet Abfragen auf aktuelle Daten mit overpass-rust, einer Neuimplementierung der Overpass API in Rust. In einem Test mit den Abfragen unserer Kunden war sie bei Antworten unter 100 KB typischerweise 84-mal schneller als Overpass API 0.7.62.11 auf derselben Hardware, und in der Gesamtzeit 14-mal schneller.

Auf dieser Seite steht «C++» für Overpass API, die Software der öffentlichen Overpass-Server, und «Rust» für overpass-rust. Rust gibt dieselben Antworten wie C++, deshalb funktionieren Overpass Turbo, QGIS, OSMnx und andere Programme ohne Änderung. Abfragen auf alte Daten laufen mit C++.

Der Test

Der Test lief auf einem AMD Ryzen 9 3900 mit 128 GB RAM und NVMe-Laufwerken, mit Rust und C++ auf derselben Maschine und denselben Planet-Daten, minütlich aktualisiert. Er verwendete die Abfragen unserer Kunden. Nachdem Rust eine Abfrage beantwortet hatte, ging dieselbe Abfrage an C++, höchstens zwei gleichzeitig und innerhalb von 5 Minuten, und die beiden Antworten wurden verglichen. Es zählen nur Abfragen mit identischen Antworten. Gemessen wurde auf beiden Seiten bis zum letzten Byte der Antwort; bei Rust ist die Zeit, in der auf den Client gewartet wurde, nicht enthalten.

Abfragen vom 11. November 2026, 05:34, bis 12. November, 06:00 UTC:

Median95. Perzentil99. Perzentil
C++295 ms6,8 s20,5 s
Rust4 ms0,22 s2,6 s
Abfrage für Abfrage verglichen brauchte C++ im Median 56-mal so lange wie Rust, beim 10. Perzentil 11-mal und beim 90. Perzentil 689-mal. Bei Antworten unter 100 KB betrug der Faktor im Median 84. Über alle Abfragen brauchte C++ 14-mal so viel Zeit, und Rust war bei 99,96 % davon schneller.

C++ wurde bei einer Wiederholung gemessen, während die Maschine andere Last hatte. Die beiden Server teilen keine Dateien, deshalb profitiert die Wiederholung nicht vom Lauf von Rust. Die Datenbank von C++ enthält zudem 341 GiB Verlaufsdaten für Abfragen auf alte Daten.

Die Zahlen hängen von der Mischung der Abfragen ab. In der Nacht auf den 12. November, mit mehr schweren Gebietsabfragen, ergibt dieselbe Methode im Median einen Faktor von 58 (Antworten unter 100 KB) und in der Gesamtzeit von 9.

Warum Rust schneller ist

C++ startet für jede Anfrage einen neuen Prozess, und dieser meldet sich beim Dispatcher an, bevor er Daten liest. Im Test brauchten die schnellsten Antworten von C++ etwa 50 ms. Rust beantwortet alle Abfragen in einem Serverprozess, der eine LMDB-Datei per Memory-Mapping liest. Jede Abfrage erhält einen eigenen Snapshot, während ein einzelner Schreiber die Diffs einspielt, und die schnellsten Antworten brauchten weniger als 1 ms.

Die Datenbank ist weniger als halb so gross. Die Elemente liegen in lz4-komprimierten Blöcken von bis zu 16 KiB, mit spaltenweise gespeicherten Koordinaten und einem Tag-Wörterbuch pro Block, und die Indizes sind delta-kodiert. Der Planet mit Metadaten und Gebieten belegt in Rust 190 GiB und in C++ 428 GiB, ohne Verlaufsdaten. Bei 128 GB RAM entscheidet das, ob die benutzten Teile der Datenbank im Page Cache bleiben oder von der Platte gelesen werden.

Die Daten sind nach räumlicher Zelle und dann nach ID sortiert, und der Tag-Index verweist auf Zelle und ID. So werden die Elemente eines Tags in der Reihenfolge gelesen, in der sie auf der Platte liegen. Jeder Way und jede Relation speichert ihre Bounding Box. Bei (bbox), around, poly und Gebieten entscheidet die Box die meisten Fälle, ohne Koordinaten von Nodes zu laden, und out center und out bb kommen direkt aus ihr.

Ein Planer wählt, wo jede Anweisung beginnt (IDs, eine Eingabemenge, der Tag-Index oder räumliche Zellen, je nachdem, was am günstigsten ist), und fängt mit dem selektivsten Filter an. Tags werden geprüft, bevor ein Element dekodiert wird. Ein Gebiet wird in Bereiche von Zellen umgerechnet, und nur diese Zellen werden gelesen. Dekodieren, Geometrietests, Ausgabe und Suchen im Tag-Index laufen innerhalb einer Abfrage auf bis zu 8 Threads; C++ verwendet einen Thread pro Abfrage.

Warum der Abstand mit den Daten wächst

DatenMessungRust schneller um
Synthetisch, 640'000 Nodes, ein Prozess pro Abfrage17 Abfragen, gesamt2,5×
Luxemburg, 4,9 Millionen ElementeTypische Abfragen1,8× bis 17×
Deutschland, 515 Millionen Elemente, beide im RAM212 Abfragen, gesamt (geometrisches Mittel)3,7× (12×)
Planet, Abfragen von KundenGesamt (Median)14× (56×)

Bei kleinen Daten geht auf beiden Seiten die meiste Zeit in den Start eines Prozesses und das Parsen der Abfrage. Bei grossen Daten geht sie ins Lesen von Indizes und Daten. Beim Planeten ist die Datenbank von C++ für aktuelle Daten mehr als dreimal so gross wie das RAM, deshalb warten viele Abfragen von C++ auf die Platte. Die Zeilen beruhen auf verschiedenen Abfragen und lassen sich nur grob vergleichen.

Der Lauf mit Deutschland verwendete den Auszug von Geofabrik vom 1. November 2026 mit Metadaten, auf einem Xeon E3-1275 v5 mit 8 Threads, 64 GB RAM und NVMe. C++ lief als Image wiktorn/overpass-api:v0.7.62.11, und beide Server wurden über HTTP abgefragt.

C++Rust
Import mit Metadaten90 min17,5 min
Datenbank28 GB9,8 GB
60 minütliche Diffs des Planeten97 s7,9 s
212 handgeschriebene Abfragen, warm, Summe der Mediane393 s106 s
500 generierte Abfragen mit mehreren Anweisungen (foreach, for, make, if)775 s49 s
Durchsatz, 8 Clients, Abfragen unter 2 s13,7 pro s56,5 pro s

Gleiche Antworten

Die Semantik von Rust folgt Spezifikationen, die aus den Quellen von C++ gewonnen wurden. Wo sich das Verhalten von C++ in der Ausgabe zeigt, etwa beim Formatieren von Zahlen, bei der Reihenfolge oder bei der Geometrie von Gebieten, ist es übernommen. Von 598 Testabfragen über zehn Datensätze liefern 528 eine byte-identische Ausgabe, und 41 werden von beiden mit demselben Fehler abgelehnt. 12 hängen vom Timing ab. Die übrigen 17 weichen absichtlich ab, etwa wo C++ nach der Änderung eines Nodes veraltete Daten behält. Beim Auszug von Deutschland blieben die Antworten über 36 Stunden mit Diffs identisch, ausser wo die Datenbank von C++ selbst inkonsistent wurde.

Quellcode

overpass-rust ist Open Source unter der GNU Affero General Public License, auf GitHub, mit einem Changelog der Versionen. Es beruht auf Overpass API von Roland Olbricht et al.

Wechsel zu overpass.ch

Abfragen, Bibliotheken und Programme laufen ohne Änderung; nur die Server-URL ist eine andere:

https://overpass-api.de/api/interpreter
→ https://api.overpass.ch/v1/IHR_API_SCHLÜSSEL/interpreter

Die Dokumentation zeigt die Einstellung für Overpass Turbo, JOSM, QGIS, Python, R und JavaScript.