Em busca de um SQLite mais rápido
(avi.im)- O SQLite já é um sistema de banco de dados rápido, mas pesquisadores estão buscando formas de torná-lo ainda mais rápido
- Pesquisadores da Universidade de Helsinque e de Cambridge publicaram o artigo "co-design de runtime serverless/banco de dados por meio de I/O assíncrona", mostrando que é possível reduzir a latência de cauda em até 100 vezes. Esse artigo serve de base para o Limbo, uma reescrita do SQLite em Rust.
io_uring
-
Explicação do io_uring: o subsistema io_uring do kernel Linux fornece uma interface para I/O assíncrona. Ele reduz a sobrecarga de cópia de buffer por meio de um ring buffer entre o espaço do usuário e o espaço do kernel. A aplicação pode enviar requisições de I/O e executar outras tarefas até receber do sistema operacional a notificação de conclusão da operação.
-
Execução de consultas no SQLite: o SQLite usa arquivos para armazenar dados, abre o banco com a função
sqlite3_open()e converte instruções SQL em bytecode com a funçãosqlite3_prepare(). A funçãosqlite3_step()executa as instruções de bytecode para processar a consulta.
Premissa
-
Ascensão da computação serverless: em ambientes serverless, a latência do banco de dados pode se tornar um problema. Embutir o banco de dados diretamente no runtime de edge elimina essa latência, e o SQLite é adequado para esse tipo de ambiente.
-
Problemas do SQLite: por usar I/O síncrona, o uso de recursos não é otimizado, o que causa problemas de concorrência e multitenancy.
-
Migração para io_uring: substituir chamadas de I/O POSIX por io_uring não é algo simples; é necessário reprojetar o SQLite para se adequar a um modelo de I/O assíncrona.
Limbo
-
Suporte a I/O assíncrona: os componentes VM e BTree foram modificados para oferecer suporte a I/O assíncrona, substituindo instruções síncronas de bytecode por instruções assíncronas. A I/O assíncrona elimina bloqueios e melhora a concorrência.
-
Separação entre motor de consultas e motor de armazenamento: é proposta a separação entre o mecanismo de consultas e o mecanismo de armazenamento para maximizar o uso de recursos.
Avaliação e resultados
-
Benchmarking: foi simulado um runtime serverless multitenant em que cada tenant possui seu próprio banco de dados embutido. Ao comparar a latência de consultas entre SQLite e Limbo, o Limbo reduziu a latência de cauda em 100 vezes no p999.
-
Trabalhos futuros: estão planejados benchmarks adicionais com vários leitores e escritores, e a vantagem de desempenho se destaca principalmente apenas após o p999.
-
Código open source: o código do Limbo está disponível como open source: Limbo GitHub
1 comentários
Comentários do Hacker News
Há uma discussão sobre como certos casos de uso de computação serverless, como AWS Lambda e bancos de dados centrais, nem sempre combinam bem com apps estruturados de forma serverless
/tmpe que o runtime Python inclui SQLite, então não era necessário enviar nenhum código além da própria funçãoPode valer a pena deixar explícito que um dos dois pesquisadores é chefe do autor
Há concordância com a afirmação de que "o ganho só é perceptível acima de p999, e em p90 e p99 o desempenho é quase idêntico ao do SQLite"
O SQLite tem uma suíte de testes extensa, então é testado de forma bastante rigorosa
io_uringPara benchmarking, foi simulado um runtime serverless multi-tenant em que cada tenant tem seu próprio banco de dados embutido
Houve anteriormente uma tentativa de introduzir async io no Postgres, mas ela foi descontinuada
Há uma pergunta sobre a ideia de fazer outro trabalho enquanto o async io está em andamento
Como autor da postagem no blog, não se esperava que este texto chegasse à página principal
SQLite é open source, mas o test harness importante não é
Houve uma tentativa de encontrar um caminho simples para criar um formato parecido com JSON como subconjunto estrito do formato de arquivo do SQLite, mas sem sucesso