libmdbx 0.12.3 já foi lançada e essas são as novidades

libmdbx

libmdbx é um banco de dados de valor-chave transacional extremamente rápido, compacto, poderoso, integrado e com licença permissiva.

O lançamento da nova versão do libmdbx 0.12.3 (MDBX) uma implementação de um banco de dados de chave-valor embutido compacto e de alto desempenho.

libmdbx é uma reformulação profunda do LMDB DBMS e supera seu antecessor em termos de confiabilidade, conjunto de recursos e desempenho. Comparado ao LMDB, o libmdbx coloca muita ênfase na qualidade do código, estabilidade da API, testes e autoverificações.

Principais novos recursos do libmdbx 0.12.3

Nesta nova versão, podemos encontrar que implementou uma escolha dinâmica entre gravação simultânea em disco e gravação normal seguido por fdatasync(), controlado pela opção MDBX_opt_writethrough_threshold. Em modos duráveis, os dados podem ser liberados para o disco de duas maneiras: gravação simultânea por meio de um descritor de arquivo aberto com O_DSYNC e gravação normal seguida por fdatasync().

O primeiro método é mais conveniente ao escrever um pequeno número de páginas e/ou se o canal de comunicação com o disco/mídia tiver um atraso próximo a zero. O segundo método é conveniente se você precisar escrever muitas páginas e/ou o canal de interação tiver um atraso significativo (data centers, nuvens). A opção MDBX_opt_writethrough_threshold incluída permite definir um limite no tempo de execução para selecionar dinamicamente o método de gravação com base no volume e nas condições de uso específicas.

Outra mudança que se destaca é que adicionou uma opção de compilação MDBX_MMAP_USE_MS_ASYNC que permite desabilitar o uso de uma chamada de sistema msync(MS_ASYNC), que não é necessária na grande maioria dos sistemas operacionais atuais.

Além disso padronizado para MDBX_MMAP_USE_MS_ASYNC=0(Desativado) no Linux e outros sistemas com cache de página unificado. Esse comportamento (sem usar msync(MS_ASYNC)) corresponde à lógica LMDB codificada. Como resultado, em benchmarks simples/ingênuos, libmdbx supera o LMDB da mesma forma que no uso real.

Por via das dúvidas, vale a pena notar/lembrar mais uma vez que no Windows, espera-se que libmdbx fique atrás de LMDB em cenários com muitas transações pequenas, já que libmdbx usa deliberadamente bloqueios de arquivo no Windows, que são lentos (mal implementados). o sistema operacional), mas permite que você proteja os usuários do grande número de ações erradas que levam à corrupção do banco de dados.

No modo de alocação/reutilização MDBX_WRITEMAP, as páginas geram uma falha de página e a página é lida do disco, mesmo que o conteúdo da página não seja necessário (será substituído). Isso é uma consequência do trabalho do subsistema de memória virtual, e o método regular de tratamento MADV_REMOVE não funciona em todos os sistemas de arquivos e geralmente é mais caro do que a economia resultante.

Além disso, vale ressaltar também que libmdbx agora usa "write-ahead" de tais páginas, que em sistemas com um cache de página unificado faz com que os dados sejam "empurrados", eliminando a necessidade de leitura do disco ao acessar essa página da memória. A nova funcionalidade funciona em conjunto com o tratamento automático do cache de leitura antecipada e estado de presença de página na RAM, via mincore().

Também é mencionado que a gravação antes da falha foi implementada ao alocar páginas para alocações de leitura e gravação. Isso leva a uma redução múltipla nos custos do sistema e a um aumento significativo no desempenho nos casos de uso relevantes, quando: o tamanho do banco de dados e a quantidade de dados são significativamente maiores que a RAM; O modo MDBX_WRITEMAP é usado; Transações não pequenas (muitas centenas ou milhares de páginas são alocadas no decorrer de uma transação).

Das outras mudanças que se destacam:

  • Adicionado controle para a ausência de arquivos LCK com nomes alternativos.
  • Suporte aprimorado para mesclagem automática de registros GC dentro de page_alloc_slowpath().
  • Envolvia um único cursor para pesquisar o GC. Sinalizadores internos modificados relacionados à paginação do GC.
  • Melhor preparação da reserva antes de atualizar o GC com BigFoot ativado.
  • Otimizou o uso de pnl_merge() para casos de listas mescladas não sobrepostas.
  • Suporte otimizado para lista ordenada de páginas em dpl_append().
  • Desempenho aprimorado de mdbx_chk ao processar a entrada do usuário em @MAIN.
  • Marcações LRU modificadas
  • Controle de "inconsistência" do cache de página unificado reprojetado para reduzir a sobrecarga.
  • A instalação automática forneceu MDBX_opt_rp_augment_limit dependendo do tamanho do banco de dados.
  • Adicionada a opção MDBX_opt_prefault_write_enable para forçar a ativação/desativação da gravação pré-falha.
  • Adicionado suporte para nomes não imprimíveis para subDb.
    Adicionada uma opção explícita tls_model("local-dynamic") para corrigir um problema de "relocação R_X86_64_TPOFF32 contra FOO não pode ser usado com -shared" devido a um bug no Clang que fazia com que o modo ls_model errado fosse usado.

Finalmente, se você estiver interessado em saber mais sobre isso, você pode verificar os detalhes no link a seguir.