En busca de un SQLite más rápido
(avi.im)- SQLite ya es un sistema de base de datos rápido, pero los investigadores están buscando formas de hacerlo aún más rápido.
- Investigadores de la Universidad de Helsinki y Cambridge publicaron el artículo "Codesarrollo de runtime/serverless y base de datos mediante I/O asíncrona", mostrando que es posible reducir la latencia de cola hasta 100 veces. Este trabajo sirve como base de Limbo, una reescritura de SQLite en Rust.
io_uring
-
Explicación de io_uring: El subsistema io_uring del kernel de Linux proporciona una interfaz para I/O asíncrona. Esto reduce la sobrecarga de copia de buffers mediante un ring buffer entre el espacio de usuario y el espacio del kernel. Las aplicaciones pueden enviar solicitudes de I/O y seguir realizando otras tareas hasta recibir del sistema operativo la notificación de que la operación terminó.
-
Ejecución de consultas en SQLite: SQLite usa archivos para almacenar datos, abre la base de datos con la función
sqlite3_open()y convierte las sentencias SQL a bytecode con la funciónsqlite3_prepare(). La funciónsqlite3_step()ejecuta las instrucciones de bytecode para procesar la consulta.
Premisa
-
Ascenso del cómputo serverless: En entornos serverless, la latencia de la base de datos puede volverse un problema. Si la base de datos se integra directamente en el runtime del edge, no hay latencia de red, y SQLite encaja bien en este tipo de entorno.
-
Problemas de SQLite: El uso de I/O síncrona impide optimizar por completo el uso de recursos y provoca problemas de concurrencia y multitenencia.
-
Transición a io_uring: Reemplazar las llamadas de I/O POSIX por io_uring no es sencillo; SQLite debe rediseñarse para ajustarse a un modelo de I/O asíncrona.
Limbo
-
Soporte para I/O asíncrona: Se modificaron los componentes VM y BTree para admitir I/O asíncrona, sustituyendo las instrucciones síncronas de bytecode por instrucciones asíncronas. La I/O asíncrona elimina bloqueos y mejora la concurrencia.
-
Separación entre consultas y motor de almacenamiento: Se propone separar el motor de consultas y el motor de almacenamiento para maximizar el uso de recursos.
Evaluación y resultados
-
Benchmarking: Se simuló un runtime serverless multi-tenant para que cada tenant tuviera su propia base de datos embebida. Al comparar la latencia de consultas entre SQLite y Limbo, Limbo redujo la latencia de cola en p999 hasta 100 veces.
-
Trabajo futuro: Se planean benchmarks adicionales con múltiples lectores y escritores, y la ventaja de rendimiento solo destaca de forma clara a partir de p999.
-
Código open source: El código de Limbo está disponible como open source: Limbo GitHub
1 comentarios
Opiniones de Hacker News
Hay una discusión sobre cómo ciertos casos de uso de la computación serverless, por ejemplo AWS Lambda y una base de datos central, no siempre encajan bien con apps construidas de forma serverless
/tmpy que el runtime de Python incluye SQLite, así que no hacía falta subir código adicional aparte de la funciónPuede valer la pena aclarar que uno de los dos investigadores es el jefe del autor
Estoy de acuerdo con que "las ventajas solo se notan a partir de p999, y en p90 y p99 el rendimiento es casi igual al de SQLite"
SQLite tiene una suite de pruebas muy amplia, así que está probado a fondo
Para el benchmarking se simuló un runtime serverless multitenant en el que cada tenant tiene su propia base de datos embebida
Antes hubo intentos de introducir async io en Postgres, pero se abandonaron
Hay una pregunta sobre la idea de poder hacer otro trabajo mientras async io está en funcionamiento
Como autor de la entrada del blog, no esperaba que este artículo llegara a la portada
SQLite es open source, pero el test harness importante no lo es
Intenté encontrar una forma simple de crear un formato parecido a JSON como subconjunto estricto del formato de archivo de SQLite, pero fracasé