Análise de Desempenho & Benchmarks


Introdução

O desempenho de um sistema computacional pode ser medido através de uma série de parâmetros quantitativos e, eventualmente qualitativos, em um processo ao qual se dá o nome de análise de desempenho. 

Através da análise, ou avaliação, de desempenho é possível comparar sistemas computacionais entre si, avaliar o custo-benefício de aquisição ou expansão de um sistema, avaliar, ou prever, o impacto de alterações na configuração do sistema para seu desempenho final. Também é possível aplicar as técnicas de análise em máquinas virtuais, comparando o desempenho do sistema virtualizado com o desempenho do sistema hospedeiro, ou de um sistema físico correspondente, bem como avaliar o ganho de desempenho de um cluster (aglomerado) computacional, em relação a um sistema componente do cluster individualmente.

Desta forma a análise de desempenho se torna importante para o planejamento estratégico e requer investimento de capital intelectual e, muitas vezes, também financeiro.

O mapa mental a seguir sintetiza alguns dos principais conceitos sobre a avaliação de desempenho:



Os benchmarks são uma das principais ferramentas para avaliação de desempenho ao potencializar a comparação entre diferentes sistemas utilizando uma carga de trabalho padronizada que pode corresponder a uma utilização real, ou a um "stress" do sistema, realizando uma análise quantitativa.

As métricas a serem usadas para avaliar o desempenho de um sistema são muito importantes. Quais métricas você analisaria ao avaliar a compra de um carro novo, um aparelho de ar condicionado, ou uma geladeira? Aqui no Brasil os selos do Inmetro e, principalmente, do Procel (Programa Nacional de Conservação de Energia Elétrica - www.procelinfo.com.br e www2.inmetro.gov.br/pbe/) nos ajudam a entender a utilidade da avaliação de desempenho para comparação de sistemas e boas métricas. Para o desempenho de sistemas computacionais precisamos escolher as métricas adequadas. Talvez algumas delas também se enquadrem no selo da Procel, mas em geral a listagem incluirá muitas outras.

Existem diversos benchmarks disponíveis, muitos cuidadosamente elaborados para aplicações específicas, outros mais simples e talvez até pouco úteis. Existem benchmarks "free and open source" e outros caríssimos.

Há sites com resultados de benchmarks que podem ser úteis para comparação de desempenho de componente (microprocessadores, placas de vídeo, HDs, etc.) como o www.cpubenchmark.net e, especialmente, a listagem dos maiores supercomputadores em atividade no planeta, referência na área de HPC (High Performance Computing), o top500.org.

Uma "fragilidade" dos benchmarks é que eles podem não representar plenamente a aplicação a ser usada, ou a forma como o sistema será usado. Ao tomarmos as partes medidas pelo todo o resultado da avaliação pode não corresponder à realidade. É preciso ter uma boa ideia do profile (perfil) da aplicação ou do uso do sistema para escolher o benchmark ou os testes adequados. Outro ponto fraco é que sistemas e aplicações podem ser otimizadas para benchmarks "padrão" de forma a mascarar seu desempenho. Um bom exemplo é destacado na nota explicativa da "aposentadoria" do benchmark de JavaScript Optane (https://v8.dev/blog/retiring-octane). Os autores relatam que estavam sendo feitas otimizações para o código do benchmark e não para todas as aplicações, o que os levou a descontinuarem o projeto pois já haviam levado um grande benefício à comunidade ao incentivar a melhoria das "JavaScript engines", mas mantê-lo no ar começava a ser prejudicial. Resumindo o ponto, a análise quantitativa pode não corresponder à análise qualitativa!

É possível realizarmos alguns testes com benchmarks facilmente acessíveis. Seguem alguns exemplos para avaliação de desempenho de sistemas e também de redes. Ao final desta página há referências, bibliografia e links úteis.


Medindo o desempenho de sistemas

Dois programas muito populares que incorporam pequenas ferramentas de benchmark de CPU são a feramenta de compactação de arquivos open source 7zip (www.7-zip.org) e a ferramenta de identificação de hardware freeware CPU-Z (www.cpuid.com). No primeiro caso a métrica utilizada é MIPS, ou Milhões de Instruções Por Segundo, tanto para a compressão como para a descompressão, o que, aliado aos parâmetros que podem ser variados e as outras informações fornecidas é bastante compreensível e comparável, embora limitada a esse tipo de processamento. Já no caso do CPU-Z o resultado é um valor numérico de difícil interpretação. Por mais que seja possível comparar o resultado com uma referência no programa, ou outro sistema, não há muita informação sobre o que de fato esse número significa e seu uso deve ser feito com certa parcimônia.

Para avaliar o desempenho de discos no Windows a Microsoft disponibiliza a ferramenta DISKSPD em seu GitHub: https://github.com/microsoft/diskspd. Há também o Crystal Disk Mark, disponível em https://crystalmark.info/en/software/crystaldiskmark/.

O sysbench (System Benchmark) é muito popular no Linux e outros Unix, e pode ser usado até no Windows com o WSL. Há opções de teste de I/O (E/S), CPU, memória e outros. Alguns exemplos:
  • sysbench cpu run
    • Executa o teste de CPU que envolve cálculo de números primos.
    • Para ajustar o número de threads use: sysbench --threads=4 run
  • sysbench memory run
    • Executa o teste de memória.
    • Também é possível ajustar a quantidade de threads utilizada da mesma forma que no item anterior
  • Consulte a ajuda para verificar testes de I/O e banco de dados.
O hdparm serve para obter parâmetros e configurar discos nos sistemas Linux e também possui opções para a realização de testes de performance. Use:
  • hdparm -t /dev/sda
    • para testar o desempenho de leitura do disco.
  • hdparm -T /dev/sda
    • para testar o desempenho de leitura do cache de disco.
O comando dd também permite realizar testes de disco. Outros comandos Linux úteis para benchmark, ou simplesmente coleta de informações e estatísticas do sistema são procinfo, vmstat, iostat, mpstat e pidstat. O kernel do Linux possui uma ferramenta de profiling e benchmark no comando perf.

Veja mais opções abaixo, na seção de links.


Medindo o desempenho de rede


iPerf 
  • iPerf3 - https://iperf.fr/
  • Ferramenta de testes de desempenho de redes para os protocolos TCP, UDP e SCTP disponível para quase todos os sistemas operacionais.
  • Tendo 2 sistemas disponíveis com o iPerf servidor um teste bem simples pode ser feito executando no terminal:

    • No sistema que será o servidor do teste:
      • iperf3 -s
    • No sistema que será o cliente:
      • iperf3 -c 192.0.2.1
        • Substitua pelo IP do servidor.
    • O resultado será algo como:
$ iperf3 -c 10.0.2.14
Connecting to host 10.0.2.14, port 5201
[  5] local 10.0.2.15 port 59010 connected to 10.0.2.14 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec   148 MBytes  1.24 Gbits/sec  327    259 KBytes       
[  5]   1.00-2.00   sec   162 MBytes  1.36 Gbits/sec  502    238 KBytes       
[  5]   2.00-3.00   sec   148 MBytes  1.24 Gbits/sec  254    239 KBytes       
[  5]   3.00-4.00   sec   157 MBytes  1.32 Gbits/sec  344    174 KBytes       
[  5]   4.00-5.00   sec   230 MBytes  1.93 Gbits/sec  1755    223 KBytes       
[  5]   5.00-6.00   sec   245 MBytes  2.06 Gbits/sec  1633    180 KBytes       
[  5]   6.00-7.00   sec   171 MBytes  1.43 Gbits/sec  661    199 KBytes       
[  5]   7.00-8.00   sec   166 MBytes  1.39 Gbits/sec  490    191 KBytes       
[  5]   8.00-9.00   sec   161 MBytes  1.35 Gbits/sec  293    185 KBytes       
[  5]   9.00-10.00  sec   157 MBytes  1.32 Gbits/sec  165    181 KBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  1.70 GBytes  1.46 Gbits/sec  6424             sender
[  5]   0.00-10.00  sec  1.70 GBytes  1.46 Gbits/sec                  receiver
iperf Done.
    • Para selecionar UDP, ao invés do TCP padrão, use a flag -u. Veja as demais opções na ajuda do iperf3, é possível selecionar tempo de teste, carga, parâmetros do TCP, formatação de exibição dos resultados, etc.

Um pouco de teoria e prática sobre a aceleração de sistemas


A Lei de Ahmdal nos permite avaliar como a aceleração (ou melhoria) de uma parte específica de um sistema afeta o desempenho global do sistema e também abre caminho para discutir o equilíbrio de um sistema em termos de desempenho. Ela pode ser usada para avaliar uma melhoria dentro de um sistema, ou através de paralelismo em sistemas distribuídos como clusters e grids. Essa melhoria pode ser um simples upgrade, ou até uma nova tecnologia. A fórmula da Lei de Ahmdal é a seguinte:


Um exemplo de aplicação prática da Lei de Ahmdal: Qual é o impacto no desempenho de um sistema na troca de um HDD por um SSD?

Há algum tempo fiz o upgrade de um notebook trocando o HDD, que virou HD externo com um case USB 3.0, por um SSD. Antes e depois da troca usei alguns dos benchmarks de disco mencionados anteriormente. Calculando a média de algumas rodadas de benchmark o ganho de desempenho de disco médio foi de 7,67 vezes. Mas este é o ganho de desempenho obtido no disco!

Na minha avaliação qualitativa o desempenho realmente fez parecer um novo notebook. Usuário completamente satisfeito e isso importa muito. Mas, e quantitativamente!? Mas e se eu precisasse avaliar isso antes de fazer o upgrade para ter certeza que o investimento valeria a pena!? O custo realmente compensa o benefício? E se fosse uma situação menos óbvia do que a troca de um HDD por um SSD? Ou um sistema de maior porte ainda sendo projetado onde está sendo avaliada justamente as diferentes possibilidades de construção?

A Lei de Ahmdal acaba nos salvando dessas perguntas. Eu poderia obter o ganho de desempenho de disco através dos datasheets, antes de adquirir um dispositivo novo, por exemplo. E a aceleração geral dependerá do quanto o disco é usado no sistema. Geralmente em servidores isso é mais facilmente mensurável. Em sistemas desktop de múltiplos usos isso é literalmente uma incógnita. Aplicando então a Lei de Ahmdal tendo a aceleração usada como 7,67 e variando a parcela de aceleração utilizada de 0 a 90% obtém-se o gráfico abaixo.


Note que se o uso do SSD chegar perto de 40% do uso do sistema, a aceleração geral já estará na casa de 50%. A aceleração geral já corresponderá ao dobro do sistema original se o uso do SSD se aproximar de 60% de uso do sistema. Ou seja, o impacto é realmente bastante relevante.

Seria possível levar esse exercício adiante comparando o "custo x benefício" de se fazer um upgrade de processador, ou mesmo avaliar se uma troca de peças ainda não compensa em relação a um computador completamente novo. Note, porém, que essas últimas perguntas já envolvem mais do que a Lei de Ahmdal, incluindo custos, ou requisitos mínimos para a realização de determinadas tarefas computacionais, por exemplo. Outra situação seria um upgrade da quantidade de memória principal (DRAM) que não traria uma aceleração direta, mas alteraria o balanço de uso de CPU, memória principal e memória secundária, diminuindo o uso desta última, geralmente mais lenta, e induzindo o aumento de desempenho a partir desse rebalanceamento.

Referências, bibliografia e links úteis


Orientei um projeto de Iniciação Científica entre 2015 e 2016 sobre Análise de desempenho em máquinas virtuais. No trabalho foi avaliado e comparado o desempenho dos sistemas computacionais host e guest (virtualizado). O trabalho foi realizado, muito bem, diga-se de passagem, pelos hoje cientistas da computação Eder de Oliveira, Thais de Farias, Wilber Costa e Weine de Oliveira. Os resultados do trabalho foram apresentados na 7ª Escola Regional de Alto Desempenho de São Paulo (ERAD-SP), promovida pela SBC, com o título de "Análise de Desempenho de Máquinas Virtuais" e no 1º Seminário em Tecnologia da Informação Inteligente (SeTII), promovido pelo Programa de Pós-graduação em Informática e Gestão do Conhecimento (PPGI) da UNINOVE, com o título de "Análise de Desempenho de Máquinas Virtuais Executadas Simultaneamente em um Mesmo Sistema Hospedeiro", onde foi avaliado o desempenho com mais de uma máquina virtual em execução simultânea. O artigo do ERAD pode ser lido neste site em Publicações disponíveis, enquanto o do SeTII pode ser lido em http://www.setii.net/2016/anais-setii-2016-v01.pdf.

Nas bibliografias de Arquitetura de Computadores e Sistemas Operacionais há livros excelentes que abordam o tema de análise de Desempenho:
  • Arquitetura e Organização de Computadores - 10a edição - William Stallings - Editora Pearson Education - 2018.
  • Arquitetura de Computadores - 5ª edição - José Delgado e Carlos Ribeiro - LTC Editora - 2017. 
  • Arquitetura de Computadores - Uma Abordagem Quantitativa - 5a edição - John L. Hennessy e David A. Patterson - Elsevier - 2013.
  • Organização e Projeto de Computadores – A Interface Hardware/Software - 4ª edição - David A. Patterson e John L. Hennessy - Elsevier - 2013.
  • Arquitetura de Microprocessadores - Do Simples Pipeline ao Multiprocessador em Chip - Jean-Loup Baer - Editora Gen-LTC - 2013.
  • Avaliação de Desempenho de Sistemas Computacionais - Thienne Johnson e Mauro Margalho - LTC - 2011.
  • Arquitetura de Computadores - De Microprocessadores a Supercomputadores - Behrooz Parhami - Editora McGraW-Hill - 2007
  • Sistemas Operacionais - 3ª edição - H.M Deitel, P.J. Deitel, D.R. Choffnes - Pearson Education - 2005.
  • Arquitetura de Computadores - Coleção Schaum - Nicholas Carter - Editora Bookman - 2003.

O site do Top500 traz um ótimo material sobre benchmarks em https://www.top500.org/resources/frequently-asked-questions/.

Nessa bibliografia indicada você também encontrará outros aspectos não abordados aqui nesta pequena introdução. 

Mais links úteis de benchmarks:
    • Os benchmarks da Netlib são usados no TOP 500!
  • Maxon Cinebench: benchmark produzido por um empresa que fabrica software para cinema (produção de filmes em 3D). Windows e Mac OS X;
  • Phoronix Test Suite:  suite de benchmarks open source. Linux, Solaris, Mac OS X, Windows & BSD;
  • Benchmark de discos:
Sobre o perf, ferramenta de profiling e benchmark do Linux, consulte https://perf.wiki.kernel.orgwww.brendangregg.com/perf.html e www.pixelbeat.org/programming/profiling/.

Finalmente, o site especializado Opensourcetesting.org e o artigo da Wikipedia traz uma boa relação de benchmarks também.