Ao falar sobre as características de desempenho do sistema, a maioria dos provedores de DBaaS se limita a fornecer informações sobre o hardware em que seus sistemas são provisionados. É realmente difícil falar com precisão sobre as características reais de taxa de transferência/latência de uma implantação baseada em nuvem, dado o número de variáveis em tal sistema. Ambientes virtualizados, cargas de trabalho imprevisíveis, latências de rede, diferentes geografias são apenas algumas das considerações.
No entanto, é uma boa ideia ter um bom entendimento do desempenho real de sua implantação do MongoDB:para que você possa provisionar com precisão com base nas necessidades do seu aplicativo; para que você possa realmente comparar vários provedores de DBaaS para garantir que está obtendo o maior retorno possível.
Este blog é uma cartilha sobre como executar alguns benchmarks básicos de desempenho em seu cluster MongoDB. Ele entra nos detalhes de como configurar e executar testes de benchmarks YCSB e interpretar os resultados. A inspiração para isso veio do blog recente do MongoDB sobre melhorias de desempenho no MongoDB 3.0.
YCSB é uma popular especificação de código aberto Java e um conjunto de programas desenvolvido no Yahoo! para comparar o desempenho relativo de vários bancos de dados NoSQL. Suas cargas de trabalho são utilizadas em diversos estudos comparativos de bancos de dados NoSQL.
Configurando YCSB
Esta e as seções posteriores o guiarão por um processo passo a passo para configurar, configurar e executar testes YCSB em seu sistema provedor de DBaaS favorito.
Para executar testes de carga de trabalho, você precisará de uma máquina cliente, de preferência na mesma localização geográfica que seu cluster MongoDB para evitar latências na Internet. Selecione uma configuração que tenha uma quantidade razoável de energia para executar vários threads para carregar seu cluster Mongo adequadamente. A máquina precisa ter uma versão recente do Java, Maven e git instaladas.
Etapas:
- Se Java, Maven ou git ainda não estiverem instalados em seu sistema, instale-os. Consulte a documentação disponível para seu sistema operacional específico. Certifique-se de instalar uma versão do Maven compatível com sua versão do Java. Teste se todas as dependências estão funcionando corretamente. Por exemplo,
$ javac -version javac 1.8.0_25 $ mvn -version Apache Maven 3.3.1 (cab6659f9874fa96462afef40fcf6bc033d58c1c; 2015-03-14T01:40:27+05:30) Maven home: /usr/local/Cellar/maven/3.3.1/libexec Java version: 1.8.0_25, vendor: Oracle Corporation Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre Default locale: en_US, platform encoding: UTF-8 OS name: "mac os x", version: "10.10.2", arch: "x86_64", family: "mac" $ git --version git version 1.9.5 (Apple Git-50.3)
- Como sugerido pela página do Github do YCSB, você pode obter o arquivo tar do YCSB. Mas recomendamos construí-lo a partir da fonte. As etapas estão documentadas no README do MongoDB do YCSB. Isso nos ajudará a habilitar a autenticação do MongoDB para seu provedor de nuvem posteriormente.
git clone git://github.com/brianfrankcooper/YCSB.git cd YCSB mvn clean package
- Nota:Se o seu
`mvn clean package`
ou`mvn clean install`
O comando falha devido a erros na localização do pacote "mapkeeper", exclua ou comente as 2 instâncias das entradas "mapkeeper" nopom.xml
no nível da raiz. Veja este problema do Github para obter mais informações. - Quando a compilação for bem-sucedida, você estará pronto para executar os testes YCSB!
Ativando a autenticação
A maioria dos provedores MongoDB fornece autenticação MongoDB por padrão e não há como desativá-la. Infelizmente, o YCSB atualmente não suporta autenticação MongoDB. A própria implementação do cliente usa principalmente, agora, chamadas de API obsoletas. Para atender às nossas necessidades, adicionamos uma nova propriedade YCSB específica do MongoDB, 'mongodb.auth'
juntamente com algumas linhas de código para apoiá-lo. As mudanças são muito simples e um diff pode ser encontrado aqui. As propriedades padrão do YCSB específicas do MongoDB estão listadas aqui.
Crie o pacote novamente usando mvn
novamente quando as alterações estiverem concluídas. Consulte a seção acima sobre como construir o YCSB usando o Maven.
Executando os testes
Esta seção do wiki do YCSB lista as atividades seguintes e subsequentes em detalhes. Vamos descrevê-los aqui brevemente, juntamente com outros indicadores.
- A próxima etapa é escolher o tipo de carga de trabalho que você deseja executar. Reserve um tempo para ler e entender a seção Core Workloads do wiki YCSB. Eles estão resumidos aqui:
- Carga de trabalho A:atualize a carga de trabalho pesada:50/50% do mix de leituras/gravações
- Carga de trabalho B:principalmente carga de trabalho de leitura:95/5% de mistura de leituras/gravações
- Carga de trabalho C:somente leitura:100% de leituras
- Carga de trabalho D:leia a carga de trabalho mais recente:mais tráfego em inserções recentes
- Carga de trabalho E:intervalos curtos:consultas baseadas em curto intervalo
- Carga de trabalho F:Ler-modificar-gravar:Ler, modificar e atualizar registros existentes
- Obviamente, as cargas de trabalho individuais podem ser ajustadas usando as Propriedades principais. Você pode escolher uma carga de trabalho e ajustar as propriedades para corresponder a algo que corresponda às características do seu aplicativo. (Este estudo comparativo escolheu um monte de cargas de trabalho "ajustadas" interessantes). Além disso, consulte o blog do MongoDB que mencionamos na primeira seção. (Nosso teste selecionará a carga de trabalho A com taxas de leitura/atualização padrão).
- Escolha o número de operação (Propriedade ‘operationcount’) para que o teste em si seja executado por um período de tempo apropriado. Testes que terminam em 30 minutos não podem ser bons indicadores do desempenho geral do sistema.
- Escolha o número apropriado de threads que o YCSB deve executar. Isso realmente depende de quão boas são suas máquinas clientes, quanta carga seu cluster MongoDB pode suportar e quão representativo ele é de seu aplicativo real. Executaremos nossos testes de benchmark em uma variedade de threads.
- Execute a fase de carregamento. Escolha uma contagem de registros (Propriedade ‘recordcount’) para inserir no banco de dados que seja próximo ao número de operações que você pretende executar nele. Escolha um número apropriado de threads para que a inserção não demore muito. Por exemplo,
./bin/ycsb load mongodb -s -P workloads/workloada -p recordcount=10000000 -threads 16 -p mongodb.url="mongodb://user:[email protected]:9999,server2.example.com:9999/dbname" -p mongodb.auth="true"
- '
load
' sinalizador indica que esta é uma execução de carga. - '
s
' flag imprime o status em intervalos de 10 segundos - '
recordcount
‘ está definido para 10 milhões. - '
threads
‘ define o número de threads do cliente para 16. - '
mongodb.auth
‘ é a propriedade que escrevemos para habilitar a autenticação do MongoDB.
- '
- Lembre-se de
- Redirecione o stdout para um arquivo.
- Usar '
screen
‘ ou um método equivalente para que sua sessão não seja perdida durante a execução dessas operações
- Quando a fase de carregamento de dados estiver concluída, você estará pronto para executar suas cargas de trabalho. Por exemplo,
./bin/ycsb run mongodb -s -P workloads/workloada -p mongodb.url="mongodb://user:[email protected]:9999,server2.example.com:9999/dbname" -p mongodb.auth="true" -p operationcount=10000000 -threads 2
- Repita as execuções com vários números de threads. Lembre-se de redirecionar os resultados para que você possa compará-los mais tarde. Por exemplo repetimos nossos testes para 2, 4, 8, 16 e 32 threads.
Análise de resultados
A seção final desta página wiki do YCSB fala sobre a análise de resultados. As informações mais interessantes são a taxa de transferência geral e as latências percentuais de 95/99%. Normalmente, aumentar o número de threads aumenta a taxa de transferência até o momento em que os ganhos se estabilizam e as latências se tornam inaceitáveis. Por exemplo aqui está um gráfico de taxa de transferência e latência versus número de threads para um sistema de teste que estávamos tentando comparar. A carga de trabalho selecionada foi a carga de trabalho A e cerca de 3 milhões de operações.
Pode-se concluir a partir do gráfico que 16 threads é provavelmente o “ponto ideal” do ponto de vista de carga para este servidor MongoDB:Além disso, a linha de taxa de transferência é plana, mesmo para um crescimento exponencial no número de threads, enquanto as latências crescem e se tornam inaceitavelmente grandes.
Algumas indicações:
- Para uma melhor visão do desempenho do sistema na nuvem, automatizar e repetir esses testes são vários pontos do dia. Percebemos que as características de desempenho podem variar significativamente ao longo do dia.
- Ao comparar dois provedores DBaaS em potencial, certifique-se de selecionar suas máquinas cliente e o cluster DBaaS na mesma geografia. Os clusters devem ser de configuração semelhante. Além disso, lembre-se de executar os testes em vários momentos do dia.
O que vem a seguir
Aqui estão algumas coisas que pretendemos investigar à medida que trabalhamos mais nessa área:
- Executando cargas de trabalho de várias máquinas em paralelo:Ao tentar carregar um cluster MongoDB de alta capacidade, uma única máquina cliente não será suficiente. Atualmente, o YCSB não oferece uma maneira fácil de executar cargas de trabalho de várias máquinas em paralelo. No entanto, isso pode ser feito manualmente. Isso também será útil ao tentar carregar dados em um cluster grande.
- Tamanho do conjunto de dados:O tamanho do banco de dados versus a memória dos sistemas MongoDB alterará as características absolutas de taxa de transferência/latência, uma vez que, para conjuntos de dados maiores, o MongoDB terá que atingir o disco .
- Tamanho de registros individuais:será interessante para as características de desempenho quando os tamanhos dos registros forem grandes, especialmente quando estiver próximo do tamanho máximo de registro suportado. Isso pode ser crucial para aplicativos que fazem principalmente operações de leitura-modificação-gravação (como Workload F).
- Drivers alternativos do MongoDB:como estávamos interessados em comparar dois provedores de DBaaS diferentes, não tentamos usar drivers de banco de dados mais eficientes. Obviamente, números absolutos muito melhores podem ser alcançados com os drivers mais recentes e mais eficientes. Isso será interessante para aplicativos que tentam extrair a última gota de suco de seu sistema. Este blog fala sobre medições de melhoria de desempenho por meio do YCSB usando um driver assíncrono do MongoDB.
- Ferramentas Alternativas de Benchmarking:O Sysbench para MongoDB é um que achamos interessante. Estamos analisando outros.