- SQLite ist bereits ein schnelles Datenbanksystem, doch Forschende suchen nach Wegen, es noch schneller zu machen.
- Forschende der Universität Helsinki und Cambridge veröffentlichten die Arbeit „Co-Design of Serverless Runtime/Database through Asynchronous I/O“ und zeigten damit, dass sich die Tail-Latenz um bis zu das 100-Fache reduzieren lässt. Diese Arbeit bildet die Grundlage für Limbo, eine in Rust neu geschriebene Version von SQLite.
io_uring
-
Erklärung zu io_uring: Das
io_uring-Subsystem des Linux-Kernels stellt eine Schnittstelle für asynchrones I/O bereit. Es reduziert den Overhead durch das Kopieren von Puffern über Ringpuffer zwischen User Space und Kernel Space. Anwendungen können I/O-Anfragen absenden und bis zur Benachrichtigung über deren Abschluss durch das Betriebssystem andere Aufgaben ausführen. -
Abfrageausführung in SQLite: SQLite verwendet Dateien zur Datenspeicherung, öffnet die Datenbank mit der Funktion
sqlite3_open()und wandelt SQL-Anweisungen mitsqlite3_prepare()in Bytecode um. Die Funktionsqlite3_step()führt die Bytecode-Befehle aus und verarbeitet so die Abfrage.
Annahmen
-
Der Aufstieg von Serverless-Computing: In Serverless-Umgebungen kann Datenbanklatenz zum Problem werden. Wird die Datenbank direkt in die Edge-Runtime eingebettet, entfällt diese Latenz, und SQLite eignet sich gut für solche Umgebungen.
-
Probleme von SQLite: Durch die Nutzung von synchronem I/O werden Ressourcen nicht optimal ausgenutzt, was zu Problemen bei Parallelität und Multi-Tenancy führt.
-
Der Umstieg auf io_uring: Das Ersetzen von POSIX-I/O-Aufrufen durch
io_uringist nicht einfach; SQLite muss für ein asynchrones I/O-Modell neu entworfen werden.
Limbo
-
Unterstützung für asynchrones I/O: Die VM- und BTree-Komponenten wurden angepasst, um asynchrones I/O zu unterstützen, und synchrone Bytecode-Befehle wurden durch asynchrone ersetzt. Asynchrones I/O beseitigt Blockierungen und verbessert die Parallelität.
-
Trennung von Query- und Storage-Engine: Um die Ressourcennutzung zu maximieren, wird vorgeschlagen, Query Engine und Storage Engine zu trennen.
Bewertung und Ergebnisse
-
Benchmarking: Es wurde eine mandantenfähige Serverless-Runtime simuliert, in der jeder Tenant seine eigene eingebettete Datenbank besitzt. Beim Vergleich der Abfragelatenz von SQLite und Limbo reduzierte Limbo die Tail-Latenz bei p999 um das 100-Fache.
-
Zukünftige Arbeit: Weitere Benchmarks mit mehreren Leser:innen und Schreiber:innen sind geplant; der Leistungsvorteil fällt allerdings erst ab p999 deutlich auf.
-
Open-Source-Code: Der Code von Limbo ist als Open Source verfügbar: Limbo GitHub
1 Kommentare
Hacker-News-Kommentare
Es gibt eine Diskussion darüber, dass bestimmte Anwendungsfälle von serverlosem Computing, etwa AWS Lambda und eine zentrale Datenbank, nicht immer gut zu Apps passen, die serverlos aufgebaut sind
/tmphat und SQLite in der Python-Laufzeit enthalten ist, sodass außer der Funktion kein zusätzlicher Code hochgeladen werden mussteEs könnte erwähnenswert sein, dass einer der beiden Forscher der Vorgesetzte des Autors ist
Ich stimme der Aussage zu: „Erst ab p999 und darüber hinaus ist ein Vorteil sichtbar, bei p90 und p99 ist die Performance fast identisch mit SQLite“
SQLite hat eine umfangreiche Test-Suite und ist sehr gründlich getestet
io_uringverwendetFür das Benchmarking wurde eine Multi-Tenant-Serverless-Runtime simuliert, in der jeder Tenant seine eigene eingebettete Datenbank hat
Es gab früher Versuche, asynchrones I/O in Postgres einzuführen, die aber eingestellt wurden
Es gibt eine Frage zu der Idee, während asynchrones I/O läuft, andere Arbeit zu erledigen
Als Autor des Blogposts hatte ich nicht erwartet, dass dieser Beitrag auf der Startseite landet
SQLite ist Open Source, aber der wichtige Test-Harness ist es nicht
Ich hatte versucht, einen einfachen Weg zu finden, aus einer strikten Teilmenge des SQLite-Dateiformats ein JSON-ähnliches Format zu machen, bin aber gescheitert