- SQLite est déjà un système de base de données rapide, mais des chercheurs cherchent encore des moyens de l’accélérer davantage.
- Des chercheurs de l’Université d’Helsinki et de Cambridge ont publié un article intitulé « co-conception runtime serverless/base de données via les E/S asynchrones », montrant qu’il est possible de réduire la latence de queue (
tail latency) jusqu’à 100 fois. Cet article sert de base à Limbo, une réécriture de SQLite en Rust.
io_uring
-
Description de io_uring : le sous-système
io_uringdu noyau Linux fournit une interface pour les E/S asynchrones. Il réduit le surcoût des copies de tampon grâce à un buffer circulaire entre l’espace utilisateur et l’espace noyau. Une application peut soumettre des requêtes d’E/S et effectuer d’autres tâches jusqu’à ce que l’OS signale la fin des opérations. -
Exécution des requêtes dans SQLite : SQLite utilise des fichiers pour stocker les données, ouvre la base avec la fonction
sqlite3_open()et convertit les instructions SQL en bytecode avecsqlite3_prepare(). La fonctionsqlite3_step()exécute ensuite les instructions du bytecode pour traiter la requête.
Prémisses
-
Essor du serverless : dans les environnements serverless, la latence de la base de données peut devenir un problème. Si la base est directement embarquée dans le runtime edge, il n’y a pas de latence réseau, et SQLite convient bien à ce type d’environnement.
-
Problèmes de SQLite : l’utilisation d’E/S synchrones empêche une utilisation optimale des ressources et pose des problèmes de concurrence et de multi-tenant.
-
Passage à io_uring : remplacer les appels d’E/S POSIX par
io_uringn’est pas simple, et il faut repenser SQLite pour l’adapter à un modèle d’E/S asynchrones.
Limbo
-
Prise en charge des E/S asynchrones : les composants VM et BTree ont été modifiés pour prendre en charge les E/S asynchrones, en remplaçant les instructions synchrones du bytecode par des instructions asynchrones. Les E/S asynchrones éliminent le blocage et améliorent la concurrence.
-
Séparation du moteur de requêtes et du moteur de stockage : il est proposé de séparer le moteur de requêtes du moteur de stockage afin de maximiser l’utilisation des ressources.
Évaluation et résultats
-
Benchmarking : un runtime serverless multi-tenant a été simulé de sorte que chaque tenant dispose de sa propre base embarquée. En comparant la latence des requêtes entre SQLite et Limbo, Limbo réduit la latence de queue au niveau p999 d’un facteur 100.
-
Travaux futurs : d’autres benchmarks incluant plusieurs lecteurs et rédacteurs sont prévus, et l’avantage en performance ne devient vraiment marqué qu’au-delà de p999.
-
Code open source : le code de Limbo est disponible en open source : Limbo GitHub
1 commentaires
Commentaires sur Hacker News
Discussion sur le fait que certains cas d’usage du serverless computing, par exemple AWS Lambda avec une base de données centrale, ne s’accordent pas toujours bien avec des applications conçues de manière serverless
/tmpet que le runtime Python inclut SQLite, donc il n’était pas nécessaire de déployer du code supplémentaire en dehors de la fonctionIl pourrait être utile de préciser que l’un des deux chercheurs est le supérieur hiérarchique de l’auteur
Accord avec l’idée que « les gains ne sont vraiment visibles qu’au-delà de p999, et qu’à p90 et p99 les performances sont presque identiques à celles de SQLite »
SQLite dispose d’une suite de tests très étendue et a donc été testé de manière approfondie
io_uringPour les benchmarks, un runtime serverless multi-tenant a été simulé, où chaque tenant possède sa propre base de données embarquée
Il y a déjà eu par le passé des tentatives d’introduire l’I/O asynchrone dans Postgres, mais elles ont été abandonnées
Question sur l’idée qu’on puisse faire autre chose pendant que l’I/O asynchrone est en cours
En tant qu’auteur du billet de blog, quelqu’un ne s’attendait pas à ce que cet article arrive en première page
SQLite est open source, mais son important harnais de test ne l’est pas
Quelqu’un a essayé de trouver une voie simple pour créer, comme sous-ensemble strict du format de fichier SQLite, un format proche de JSON, mais sans succès