Para LevelDB, como posso obter o desempenho das gravações aleatórias como mesmo afirmou "oficial" relatório de desempenho?

StackOverflow https://stackoverflow.com/questions/9397244

Pergunta

Um site oficial de leveldb(http://code.google.com/p/leveldb/), há um relatório de desempenho.Eu colado como abaixo.

Abaixo é de oficial leveldb referência

Aqui está um relatório de desempenho (com explicações) a partir da execução da incluídos db_bench programa.Os resultados são um pouco barulhento, mas deve ser suficiente para obter um estádio de desempenho estimativa.

Instalação

Usamos um banco de dados com um milhão de entradas.Cada entrada tem uma chave de 16 bytes, e um 100 valor de byte.Valores usados pela referência comprimir a cerca de metade do seu tamanho original.LevelDB:versão 1.1

CPU:4 x Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40 GHz

CPUCache:4096 KB

Chaves:16 bytes cada

Valores:100 bytes cada (50 bytes após a compressão)

Entradas:1000000

Matérias Tamanho:110.6 MB (estimado)

Tamanho Do Arquivo:De 62,9 MB (estimado)

Desempenho de gravação

O "preenchimento" valores de referência de criar um novo banco de dados, em qualquer sequencial, ou de forma aleatória.

O "fillsync" benchmark liberações de dados a partir do sistema operacional no disco depois de cada operação;outras operações de gravação deixar os dados sentado no sistema operacional buffer cache por um tempo."Substituir" benchmark faz gravações aleatórias de que a atualização de chaves existentes na base de dados.

fillseq :1.765 micros/op;62.7 MB/s

fillsync :268.409 micros/op;0.4 MB/s (10000 ops)

fillrandom :2.460 micros/op;45.0 MB/s

substituir :2.380 micros/op;46.5 MB/s

Cada "op" acima corresponde a uma gravação de um único par de chave/valor.I. e., uma gravação aleatória de referência vai para o cerca de 400.000 gravações por segundo.

Abaixo é de Minha leveldb referência

Eu fiz alguma referência para leveldb mas tem velocidade de gravação de 100 vezes menor do que o do relatório.

Aqui está a minha experiência configurações:

  1. CPU:Intel Core2 Duo T6670 2.20 GHz
  2. 3.0 GB de memória
  3. 32-bits do Windows 7
  4. sem compressão
  5. opções.write_buffer_size = 100MB
  6. opções.block_cache = 640 MB

O que eu fiz é muito simples:Acabei de colocar 2 milhões de {key, value} e não lê em tudo.A chave é uma matriz de bytes que tem 20 bytes aleatórios e o valor é uma matriz de bytes muito com 100 bytes aleatórios.Eu constantemente recém-aleatório {key, value} para 2 milhões de vezes, sem qualquer operação pessoa.

Na minha experiência, eu posso ver que a velocidade de escrita diminui desde o início.A velocidade instantânea (que mede a velocidade de cada 1024 escreve) oscila entre 50/s para 10, 000/s.E a minha média de velocidade de gravações para 2 milhões de pares é de cerca de 3.000/s.O pico de velocidade de gravações é de 10, 000/s.

Como o relatório afirma que a velocidade de gravações pode ser 400, 000/s, a velocidade de gravação do meu referência é de 40 a 130 vezes mais lento e eu gostaria de saber o que há de errado com a minha referência.

Eu não preciso colar a minha testes de códigos aqui como é super fácil, eu só tenho um loop while para 2 milhões de vezes, e dentro do loop, para cada iteração, eu gerar um 20 bytes de chave, e 100 bytes do valor e, em seguida, colocá-los para o leveldb banco de dados.Eu também medido o tempo gasto em {chave, valor} geração, os custos de 0 ms.

Alguém pode me ajudar com isso?Como posso alcançar 400, 000/s escreve velocidade com leveldb?Quais configurações devo melhorar para?

Obrigado

Além disso

Eu corri oficial db_bench.cc no meu machie.É 28 vezes mais lento do que o do relatório.

Eu acho que como eu usei o seu próprio programa de benchmark, a única diferença entre a minha referência, e o deles, é a máquina.

Foi útil?

Solução

Você tem 2 milhões de pares de chave-valor, e cada par de valor-chave de um total de 120 bytes, para 2 milhões * 120 bytes = 228 MB de dados!O cache é de 640 MB, então é bem possível que todos os dados ainda em memória RAM e que nunca conseguiu para o disco.Como Kitsune apontou:seu hardware é nem de perto tão rápido como o Google testado com e se o Google tinha o mesmo tamanho do cache, em seguida, que poderia facilmente produzir 30 vezes a diferença.

Outros problemas possíveis:

  • É difícil saber exatamente como "aleatório" foram as chaves:LevelDB funciona de forma diferente dependendo da distribuição de chaves (mesmo se é "aleatória").
  • 20 bytes chaves seria menos eficiente do que 16 bytes chaves, porque eles não alinhar bem.
  • Dependendo da sua unidade de disco rígido, a sua velocidade de escrita do disco, pode ser lento (você verifica seu).

Podemos mantê-vai sobre e sobre e sobre, mas há muitas variáveis a considerar.Se você postar algum código que demonstra como o teste é executado e, em seguida, podemos recomendar algumas otimizações para que você possa obter um melhor desempenho.

Outras dicas

Quando você executa a mesma referência em um hardware completamente diferente você é obrigado a ver algumas diferenças.

  • Seu CPU é ~9x mais fraco 2xCores@2.2GHz vs 16xCores@2.4GHz
  • A sua unidade de disco rígido e a unidade do oficial de benchmark não foram mencionadas (fibra NAS vs uma unidade de estado sólido SSD vs uma unidade de disco rígido HDD)

Não se pode comparar maçãs com laranjas ou maçãs para [desconhecido de frutas].

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top