Testes de desempenho
Os testes de desempenho medem operações comuns do sistema em cada parte da infraestrutura, como a CPU, o banco de dados, o disco e o IDO, que é a API do Engine responsável pelos bancos de dados locais, como o cache local e os bancos temporários dos DataSets. Cada caso de teste mede uma operação específica, como a latência de uma consulta mínima ao banco de dados, o que permite identificar qual parte da infraestrutura é responsável por uma lentidão.
Os principais usos dos testes são:
- Comparar infraestruturas: executar os testes no ambiente do cliente e em um ambiente de referência e comparar os resultados, identificando se o disco, a CPU ou o banco de dados do cliente estão muito diferentes do habitual.
- Comparar runtimes: executar os testes nos runtimes Ije e V8.
- Acompanhar a evolução do sistema: executar os testes periodicamente, como antes do fechamento de cada versão, e comparar com as execuções anteriores para identificar degradações de desempenho.
- Avaliar otimizações: medir o impacto de uma alteração no Engine em operações comuns, como as de DataSets, de filtros e do cache local.
Processo Testes de desempenho
Caminho: Administração do sistema > Diagnósticos > Testes de desempenho.
Na tela inicial são informadas as opções da execução:
- Categorias: categorias de testes a serem executadas. Por padrão, todas são selecionadas.
- Tempo de medição (s): tempo aproximado das medições de cada caso. Não inclui a preparação dos dados, o aquecimento e a limpeza. Casos com operações lentas podem ultrapassá-lo, pois cada caso coleta um número mínimo de amostras. Tempos maiores reduzem a variação dos resultados, mas aumentam a duração total dos testes. O padrão de 2 segundos resulta em poucos minutos para todas as categorias.
- Semente: semente dos dados gerados pelos testes. Execuções com a mesma semente utilizam os mesmos dados, o que é necessário para compará-las.
- Comentário: comentário opcional gravado com o resultado, útil para localizar depois uma execução específica, como uma realizada antes de uma alteração no sistema.
- Gravar no histórico: indica se o resultado deve ser gravado no histórico de execuções.
O botão “Executar testes” executa as categorias selecionadas e exibe o resultado ao final. Os testes geram carga no servidor e no banco de dados enquanto estão em execução, por isso devem ser evitados nos horários de maior uso do sistema.
Resultado
O resultado apresenta os dados do ambiente em que os testes foram executados, como a versão do Engine, o runtime, o sistema operacional, a memória, a configuração do cache do IDO e a versão do banco de dados, seguidos de uma tabela com os casos de cada categoria. Ao posicionar o mouse sobre o nome de um caso, é exibida a descrição da operação medida. As colunas da tabela são:
- Mediana: tempo mediano de uma operação. É a principal medida para comparação, pois é pouco afetada por medições isoladas mais lentas.
- p95: tempo abaixo do qual estão 95% das medições. Uma diferença grande entre a mediana e o p95 indica variações frequentes de desempenho.
- Mínimo: menor tempo medido para uma operação.
- Operações/s: quantidade de operações por segundo, calculada a partir da mediana.
- Amostras: quantidade de medições realizadas.
- Observações: métricas adicionais do caso, como linhas lidas por segundo, tempo por registro e índices criados, ou o motivo pelo qual o caso falhou ou não foi executado. Medições em que boa parte das amostras se afasta da mediana são indicadas como “medição instável” e devem ser repetidas. Amostras lentas isoladas, como as afetadas por outros processos do servidor, não tornam a medição instável, mas aumentam o p95.
O botão “Exportar JSON” gera um arquivo com o resultado completo, que pode ser importado em outra base de dados para comparação.
Histórico e comparação
O botão “Histórico” exibe as execuções gravadas no período informado, com a data, o usuário, a versão do Engine, o runtime, a plataforma, o computador, a versão do banco de dados, a duração, se a execução foi concluída, as categorias executadas e o comentário. As execuções selecionadas podem ser:
- Comparadas: o botão “Comparar” exibe os dados do ambiente e os tempos de cada execução lado a lado. A execução mais antiga é utilizada como referência, e a razão entre o tempo de cada execução e o da referência é destacada quando a operação ficou mais lenta (razão acima de 1,2) ou mais rápida (razão abaixo de 0,8). Os dados do ambiente que diferem da referência também são destacados.
- Exportadas: o botão “Exportar selecionadas” gera um arquivo JSON para cada execução.
- Excluídas: a exclusão de registros da grade remove as execuções do histórico.
O botão “Importar JSON” permite incluir nas comparações os resultados exportados em outra base de dados, como os de um ambiente de referência. Os arquivos importados não são gravados no histórico e podem ser descartados pelo botão “Limpar importados”.
Execuções de versões anteriores do sistema podem não conter todos os casos de teste. Nesses casos, a comparação indica os casos ausentes e calcula a razão somente para os casos existentes nas duas execuções. Os casos também podem ser revisados entre as versões do sistema, como na alteração da operação medida. A razão não é calculada entre resultados de revisões diferentes de um caso, que são indicados como “caso alterado”.
Categorias de testes
CPU e runtime
Operações de JavaScript puro, sem acesso a disco, rede ou banco de dados, como laços aritméticos, concatenação de strings, serialização e interpretação de JSON, expressões regulares, criação de objetos e ordenação. Permitem comparar CPUs e os runtimes Ije e V8.
Banco de dados
Latência de uma consulta mínima e tempo de leitura de 5.000 linhas geradas pelo próprio banco de dados, com textos repetitivos, que favorecem a compressão dos dados trafegados, e com textos pouco compressíveis.
Também são medidas, na tabela iBenchmark, a inserção unitária e em lote, a inserção com campos memo, a leitura, a alteração em lote e a exclusão em lote com e sem a verificação de integridade referencial. Os registros gravados são removidos ao final da categoria. Registros de execuções interrompidas há mais de uma hora também são removidos.
Disco
Escrita sequencial em blocos de 64 KB e escrita aleatória em blocos de 4 KB, o tamanho da página dos bancos IDO, cada uma medida sem e com a gravação física de cada bloco no disco. Os pares permitem avaliar o custo da gravação física, que é o principal fator no desempenho dos bancos IDO persistentes. Também são medidas a leitura sequencial em blocos de 64 KB e a leitura de linhas de arquivos de texto nas codificações windows-1252 e UTF-8.
Os testes utilizam arquivos temporários criados no diretório de dados do Engine, que normalmente está no mesmo disco do cache local. As escritas sem gravação física e as leituras podem ser favorecidas pelo cache de arquivos do sistema operacional.
Bancos IDO temporários
Operações em DataSets de bancos IDO temporários com 50 mil registros: inclusão, navegação com
leitura de campos, pesquisa com e sem índice, faixas de registros com setRange e criação de
índice. Os bancos temporários, como os utilizados pelos DataSets criados pelos scripts, não forçam
a gravação dos dados em disco nem mantêm arquivos de segurança contra corrupção.
Bancos IDO persistentes
Inclusão, varredura e reabertura de um banco IDO persistente, criado exclusivamente para a execução e removido ao final dela. Ao contrário dos bancos temporários, os persistentes forçam a gravação dos dados em disco e mantêm arquivos de segurança contra corrupção, como o cache local. O cache local do Engine não é modificado.
Filtros do DataSet
Aplicação de filtros em DataSets temporários com 50 mil registros, com o filtro de classes, com filtros JavaScript e com sequências de configuração de índice e filtros, incluindo a quantidade de índices criados por cada forma de configuração. Também é medido o reaproveitamento de um índice filtrado já existente.
Desabilitar a execução dos testes
Em ambientes de hospedagem, a execução dos testes pode ser desabilitada no Engine pela variável
de ambiente NGIN_BENCHMARK_ENABLED, informada com os valores “0” ou “OFF”. Com a variável, o
processo deixa de oferecer a execução e as APIs que executam os testes recusam a execução,
inclusive quando chamadas por scripts. As execuções gravadas continuam disponíveis para consulta e
comparação. Mais detalhes em
Variáveis de ambiente
.
Recomendações
- Para comparar execuções, utilize a mesma semente e o mesmo tempo de medição.
- Execute os testes com o servidor em uso normal, mas fora dos horários de pico, e repita a execução quando os resultados apresentarem medições instáveis.
- Medições instáveis em vários casos, com o p95 próximo do dobro da mediana, costumam ser causadas pela economia de energia do computador, que alterna a frequência do processador ou, nos processadores híbridos, os núcleos utilizados. Em computadores portáteis, execute os testes conectados à energia e com o modo de energia de melhor desempenho.
- Compare ambientes com a mesma versão do Engine e o mesmo runtime, pois as diferenças entre versões e runtimes podem ser maiores que as diferenças de infraestrutura.
- Os casos de banco de dados medem também a latência entre o Engine e o servidor de banco de dados. Por isso, execute os testes no Engine cujo desempenho se deseja avaliar.