Que conselho você pode dar-me para escrever uma referência significativa?

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

  •  11-07-2019
  •  | 
  •  

Pergunta

Eu desenvolvi um quadro que é usado por várias equipes em nossa organização. Esses "módulos", desenvolvido em cima deste quadro, pode se comportar de forma bastante diferente, mas eles são todos os recursos bonitas que consomem, embora alguns são mais do que outros. Todos eles recebem dados de entrada, analisar e / ou transformá-lo e enviá-lo ainda mais.

Nós planejado comprar um novo hardware e meu chefe me pediu para definir e implementar um ponto de referência com base nos módulos, a fim de comparar as diferentes ofertas que temos.

A minha ideia é simplesmente começar a sequencialmente cada módulo com um grupo bem escolhido de dados como entrada.

Você tem algum conselho? Quaisquer comentários sobre este procedimento simples?

Foi útil?

Solução

A sua pergunta é bastante ampla, por isso, infelizmente, a minha resposta não vai ser muito específico também.

Em primeiro lugar, o benchmarking é difícil. Não subestime o esforço necessário para produzir, resultados de alta confiança repetíveis significativas.

Em segundo lugar, qual é a sua meta de desempenho? É o throughput (transações ou operações por segundo)? É latência (tempo que leva para executar uma transação)? Você se importa com o desempenho médio? Eu me preocupo com pior desempenho caso? Você se preocupa com o pior caso absoluto ou eu me importo que 90%, 95% ou alguns outros percentil obter um desempenho adequado?

Dependendo de qual objetivo que você tem, então você deve projetar seu ponto de referência para medir contra esse objetivo. Então, se você estiver interessado em rendimento, você provavelmente vai querer enviar mensagens / transações / entrada em seu sistema a uma taxa prescrita e ver se o sistema é manter-se.

Se você está interessado em latência, você iria enviar mensagens / transações / entrada e medida de quanto tempo leva para processar cada um.

Se você está interessado em pior desempenho caso você irá adicionar carga para o sistema até que até que você considera "realista" (ou o que o projeto do sistema diz que deve apoiar.)

Em segundo lugar, você não diz se esses módulos vão ser vinculado à CPU, I / O ligado, se eles podem tirar proveito de múltiplas CPUs / núcleos, etc Como você está tentando avaliar soluções de hardware diferentes que você pode achar que seus benefícios de aplicativos mais de um grande I / O subsistema vs. um grande número de CPUs.

Em terceiro lugar, o melhor índice de referência (e mais difícil) é colocar carga realista para o sistema. Significado, você grava dados de um ambiente de produção, e colocar a nova solução de hardware através deste dados. Conseguir este feito é mais difícil do que parece, muitas vezes, isso significa a adição de todos os tipos de pontos de medição no sistema para ver como ele se comporta (se você não tê-los já,) modificar o sistema existente para adicionar capacidades de gravação / reprodução, modificando o reprodução para correr em ritmos diferentes, e obter um realista (ou seja, semelhante ao de produção) ambiente para teste.

Outras dicas

A referência mais significativa é medir como seus executa código em uso todos os dias. Isso, obviamente, fornecer-lhe os números mais realistas.

Escolha vários conjuntos de dados da vida real e colocá-los através dos mesmos processos de seu org usa todos os dias. Para o crédito extra, falar com as pessoas que usam o seu quadro e pedir-lhes para fornecer algum "melhor caso", "normal", e os dados de "pior caso". Anonymize os dados se houver preocupações com a privacidade, mas tente não mudar qualquer coisa que poderia afetar o desempenho.

Lembre-se que você está aferição e comparação de dois conjuntos de hardware, não o seu quadro. Trate todo o software como uma caixa preta e simplesmente medir o desempenho do hardware.

Por fim, considere salvar os conjuntos de dados e usá-los para avaliar da mesma forma qualquer mais tarde as alterações feitas ao software.

Se você é sistema deve ser capaz de lidar com vários clientes em chamadas ao mesmo tempo, então a sua referência deve refletir isso. Note-se que algumas chamadas não vai jogar bem juntos. Por exemplo, com 25 tópicos postar o mesmo bit de informação, ao mesmo tempo pode levar a bloqueios no lado do servidor, desviando, assim, os seus resultados.

Do ponto de vista-porcas e parafusos, eu usei Perl e sua href="http://perldoc.perl.org/Benchmark.html" rel="nofollow noreferrer"> módulo Referência para reunir as informações que me interessa.

Se você está comparando hardware diferentes, então medir o custo por transação vai lhe dar uma boa comparação dos trade-offs de hardware para desempenho. Uma configuração pode dar-lhe o melhor desempenho, mas custa muito caro. Uma configuração mais barata pode dar-lhe um desempenho adequado.

É importante para emular o "pior caso" ou "hora de pico" da carga. Também é importante para testar com volumes "típicos". É um ato de equilíbrio para obter uma boa utilização do servidor, que não custa muito, que dá o desempenho necessário.

Testing através configurações de hardware rapidamente se torna caro. Outra opção viável é a primeira medida da configuração que você tem, em seguida, simular que o comportamento em sistemas virtuais usando um modelo.

Se você puder, tentar gravar alguns usuários operações (ou processos) estão fazendo com a sua estrutura, o ideal é usar um clone do sistema real. Isso dá-lhe os dados mais realistas. Coisas a considerar:

  1. Quais as funções que são mais frequentemente utilizados?
  2. A quantidade de dados é transferida?
  3. Não assuma nada. Se você pensa "que vai ser rápido / lento", não apostar nele. Em 9 dos 10 casos, você está errado.

Criar um top dez para 1 + 2 e trabalhar a partir daí.

Dito isto: Se você substituir hardware antigo com o novo hardware, você pode esperar cerca de 10% de execução mais rápida para cada ano que passou desde que você comprou o primeiro conjunto (se os sistemas são de outra maneira muito igual)

.

Se você tem um sistema especializado, os números podem ser completamente diferente, mas geralmente, novo hardware não muda muito. Por exemplo, a adição de um índice útil para uma base de dados pode reduzir o tempo de execução de uma consulta a partir de duas horas a dois segundos. Hardware nunca vai te dar isso.

A meu ver, existem dois tipos de benchmarks quando se trata de aferição software. Primeiro, microbenchmarks, quando você tenta avaliar um pedaço de código em isolamento ou como um sistema de negócios com carga de trabalho estritamente definido. Comparar dois algoritmos de ordenação escritos em Java. Comparar dois navegadores quão rápido cada um pode executar alguma operação de manipulação DOM. Em segundo lugar, existem benchmarks de sistema (eu fiz apenas o nome up), quando você tenta avaliar um sistema de software sob uma carga de trabalho realista. Comparar minha backend baseado em Python em execução no Google Compute Engine e na Amazon AWS.

Ao lidar com Java e tal como, tenha em mente que a VM precisa aquecer antes que possa dar-lhe um desempenho realista. Se você medir o tempo com o comando time, momento em que a JVM inicialização serão incluídos. Você quase sempre quer ignorar o tempo de inicialização ou acompanhar-lo separadamente.

Microbenchmarking

Durante a primeira execução, caches de CPU estão sendo preenchidos com os dados necessários. O mesmo vale para caches de disco. Durante algumas corridas posteriores a VM continua a aquecer, o que significa que compila JIT o que considera útil para compilar. Você deseja ignorar estas corridas e começar a medir mais tarde.

Faça um monte de medições e calcular algumas estatísticas. Média, mediana, desvio padrão, traçar um gráfico. Olhar para ele e ver o quanto ela muda. Coisas que podem influenciar o resultado incluem pausas do GC na VM, escala de freqüência da CPU, algum outro processo pode começar alguma tarefa em segundo plano (como verificação de vírus), OS pode decidir avançar com o processo em um núcleo de CPU diferente, se você têm arquitetura NUMA , os resultados seriam ainda mais acentuada.

Em caso de microbenchmarks, tudo isso é um problema. Matar o que processa que puder antes de começar. Use uma biblioteca de benchmarking que pode fazer parte dela para você. Como https://github.com/google/caliper e afins.

sistema de benchmarking

Em caso de aferição de um sistema sob uma carga de trabalho realista, esses detalhes não realmente lhe interessam e seu problema é "apenas" para saber o que uma carga de trabalho é realista, como gerá-lo e quais os dados a recolher. É sempre melhor se você puder instrumento um sistema de produção e os dados coletar lá. Normalmente você pode fazer isso, porque você está medindo características do usuário final (quanto tempo uma página web rendem) e estes são I / O ligado para que os dados de encontro código não abrandar o sistema. (As necessidades de página para ser enviado para o usuário através da rede, não importa se nós também log alguns números no processo).

Esteja consciente da diferença entre profiling e benchmarking. O benchmarking pode dar-lhe tempo absoluto gasto a fazer algo, perfilando dá-lhe tempo relativo gasto a fazer algo em relação a tudo o que precisava ser feito. Isso ocorre porque profilers executar programas fortemente instrumentadas (técnica comum é stop-the-mundo a cada algumas centenas de ms e salvar um rastreamento de pilha) e a instrumentação torna tudo mais lento significativamente.

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