Pesquisa de site

Melhore o desempenho da rede com esta estrutura de código aberto


Use o Pbench para prever o rendimento e a latência para cargas de trabalho específicas.

Na era da Internet de alta velocidade, a maioria dos grandes sistemas de informação são estruturados como sistemas distribuídos com componentes executados em máquinas diferentes. O desempenho desses sistemas é geralmente avaliado pelo seu rendimento e tempo de resposta. Quando o desempenho é ruim, a depuração desses sistemas é um desafio devido às interações complexas entre os diferentes subcomponentes e à possibilidade de o problema ocorrer em vários locais ao longo do caminho de comunicação.

Nas redes mais rápidas, o desempenho de um sistema distribuído é limitado pela capacidade do host de gerar, transmitir, processar e receber dados, que por sua vez depende do seu hardware e configuração. E se fosse possível ajustar o desempenho da rede de um sistema distribuído usando um repositório de execuções de benchmark de rede e sugerir um subconjunto de parâmetros de hardware e sistema operacional que sejam mais eficazes para melhorar o desempenho da rede?

Para responder a essa pergunta, nossa equipe usou o Pbench, uma estrutura de benchmarking e análise de desempenho desenvolvida pela equipe de engenharia de desempenho da Red Hat. Este artigo percorrerá passo a passo nosso processo de determinação dos métodos mais eficazes e implementação deles em uma ferramenta de ajuste de desempenho preditivo.

Qual é a abordagem proposta?

Dado um conjunto de dados de execuções de benchmark de rede, propomos as seguintes etapas para resolver este problema.

  1. Preparação de dados: Reúna as informações de configuração, carga de trabalho e resultados de desempenho para o benchmark de rede; limpe os dados; e armazene-o em um formato fácil de trabalhar
     
  2. Encontrar recursos significativos: Escolha um conjunto inicial de parâmetros de sistema operacional e hardware e use vários métodos de seleção de recursos para identificar os parâmetros significativos
     
  3. Desenvolva um modelo preditivo: Desenvolva um modelo de aprendizado de máquina que possa prever o desempenho da rede para um determinado sistema e carga de trabalho de cliente e servidor
     
  4. Recomendar configurações: Dado o desempenho de rede desejado pelo usuário, sugira uma configuração para o cliente e o servidor com o desempenho mais próximo no banco de dados, juntamente com dados mostrando a janela potencial de variação nos resultados
     
  5. Avaliação: determine a eficácia do modelo usando validação cruzada e sugira maneiras de quantificar a melhoria devido às recomendações de configuração

Coletamos os dados para este projeto usando Pbench. O Pbench recebe como entrada um tipo de benchmark com sua carga de trabalho, ferramentas de desempenho para execução e hosts nos quais o benchmark será executado, conforme mostrado na figura abaixo. Ele gera os resultados do benchmark, os resultados da ferramenta e as informações de configuração do sistema para todos os hosts.

(Hifza Khalid, CC BY-SA 4.0)

Dos diferentes scripts de benchmark executados pelo Pbench, usamos dados coletados usando o benchmark uperf. Uperf é uma ferramenta de desempenho de rede que usa a descrição da carga de trabalho como entrada e gera a carga de acordo para medir o desempenho do sistema.

Preparação de dados

Existem dois conjuntos disjuntos de dados gerados pelo Pbench. Os dados de configuração dos sistemas em teste são armazenados em um sistema de arquivos. Os resultados de desempenho, juntamente com os metadados da carga de trabalho, são indexados em uma instância do Elasticsearch. O mapeamento entre os dados de configuração e os resultados de desempenho também é armazenado no Elasticsearch. Para interagir com os dados no Elasticsearch, utilizamos o Kibana. Usando esses dois conjuntos de dados, combinamos os metadados da carga de trabalho, os dados de configuração e os resultados de desempenho para cada execução de benchmark.

Encontrando recursos significativos

Para selecionar um conjunto inicial de especificações de hardware e configurações de sistema operacional, usamos guias de configuração de ajuste de desempenho e feedback de especialistas da Red Hat. O objetivo desta etapa foi começar a trabalhar com um pequeno conjunto de parâmetros e refiná-lo com análises adicionais. O conjunto foi baseado em parâmetros de quase todos os principais subcomponentes do sistema, incluindo hardware, memória, disco, rede, kernel e CPU.

Depois de selecionar o conjunto preliminar de recursos, usamos uma das técnicas de redução de dimensionalidade mais comuns para eliminar os parâmetros redundantes: remover parâmetros com valores constantes. Embora esta etapa tenha eliminado alguns dos parâmetros, dada a complexidade da relação entre as informações do sistema e o desempenho, decidimos usar métodos avançados de seleção de recursos.

Seleção de recursos baseada em correlação

A correlação é uma medida comum usada para encontrar a associação entre dois recursos. Os recursos têm uma alta correlação se forem linearmente dependentes. Se os dois recursos aumentarem simultaneamente, sua correlação será +1; se diminuirem simultaneamente, é -1. Se os dois recursos não estiverem correlacionados, sua correlação será próxima de 0.

Usamos a correlação entre a configuração do sistema e a variável alvo para identificar e reduzir ainda mais recursos insignificantes. Para isso, calculamos a correlação entre os parâmetros de configuração e a variável alvo e eliminamos todos os parâmetros com valor inferior a |0,1|, que é um limite comumente usado para identificar os pares não correlacionados.

Métodos de seleção de recursos

Como a correlação não implica causalidade, precisávamos de métodos adicionais de seleção de características para extrair os parâmetros que afetam as variáveis alvo. Poderíamos escolher entre métodos wrapper, como eliminação recursiva de recursos, e métodos incorporados, como Lasso (Least Absolute Shrinkage and Selection Operator) e métodos baseados em árvore.

Optamos por trabalhar com métodos embarcados baseados em árvore por sua simplicidade, flexibilidade e baixo custo computacional em comparação aos métodos wrapper. Esses métodos possuem métodos integrados de seleção de recursos. Entre os métodos baseados em árvore, tínhamos três opções: árvore de classificação e regressão (CART), Random Forest e XGBoost.

Calculamos nosso conjunto final de recursos significativos para os sistemas cliente e servidor tomando uma união dos resultados recebidos dos três métodos baseados em árvore, conforme mostrado na tabela a seguir.

Parameters client/server Description
Advertised_auto-negotation  client If the linked advertised auto-negotiation
CPU(s) server Number of logical cores on the machine
Network speed server Speed of the ethernet device
Model name client Processor model
rx_dropped server Packets dropped after entering the computer stack
Model name server Processor model
System type server Virtual or physical system

Desenvolver modelo preditivo

Para esta etapa, utilizamos o modelo de predição Random Forest (RF), pois ele tem desempenho melhor que o CART e também é mais fácil de visualizar.

Random Forest (RF) constrói múltiplas árvores de decisão e as mescla para obter uma previsão mais estável e precisa. Ele constrói as árvores da mesma forma que o CART, mas para garantir que as árvores não estejam correlacionadas para proteger umas às outras de seus erros individuais, ele usa uma técnica conhecida como bagging. O Bagging usa amostras aleatórias dos dados com reposição para treinar as árvores individuais. Outra diferença entre as árvores em uma Floresta Aleatória e uma árvore de decisão CART é a escolha dos recursos considerados para cada divisão. CART considera todos os recursos possíveis para cada divisão. No entanto, cada árvore em uma Floresta Aleatória escolhe apenas um subconjunto aleatório de características. Isso leva a ainda mais variação entre as árvores da Floresta Aleatória.

O modelo FR foi construído separadamente para ambas as variáveis alvo.

Recomendar configurações

Para esta etapa, dados os valores desejados de throughput e tempo de resposta, juntamente com a carga de trabalho de interesse, nossa ferramenta pesquisa no banco de dados de execuções de benchmark para retornar a configuração com os resultados de desempenho mais próximos do que o usuário necessita. Ele também retorna o desvio padrão para diversas amostras dessa execução, sugerindo variação potencial nos resultados reais.

Avaliação

Para avaliar nosso modelo preditivo, usamos uma técnica repetida de validação cruzada K-Fold. É uma escolha popular obter uma estimativa precisa da eficiência do modelo preditivo.

Para avaliar o modelo preditivo com um conjunto de dados de 9.048 pontos, utilizamos k igual a 10 e repetimos o método de validação cruzada três vezes. A precisão foi calculada usando as duas métricas fornecidas abaixo.

  • Pontuação R2: A proporção da variância na variável dependente que é previsível a partir das variáveis independentes. Seu valor varia entre -1 e 1.
  • Erro quadrático médio (RMSE): Mede a diferença quadrada média entre os valores estimados e os valores reais e retorna sua raiz quadrada.

Com base nos dois critérios acima, os resultados para o modelo preditivo com rendimento e latência como variáveis alvo são os seguintes:

  • Taxa de transferência (trans/seg):

    • Pontuação R2: 0,984
    • REQM: 0,012
  • Latência (usec):

    • Pontuação R2: 0,930
    • REQM: 0,025

Como é a ferramenta final?

Implementamos nossa abordagem em uma ferramenta mostrada na figura a seguir. A ferramenta é implementada em Python. Toma como entrada o conjunto de dados que contém as informações sobre as execuções do benchmark como um arquivo CSV, incluindo configuração do cliente e do servidor, carga de trabalho e os valores desejados para latência e taxa de transferência. A ferramenta usa essas informações para prever os resultados de latência e taxa de transferência para o sistema cliente-servidor do usuário. Em seguida, ele pesquisa no banco de dados de execuções de benchmark para retornar a configuração que apresenta resultados de desempenho mais próximos do que o usuário exige, juntamente com o desvio padrão para essa execução. O desvio padrão faz parte do conjunto de dados e é calculado usando amostras repetidas para uma iteração ou execução.

(Hifza Khalid, CC BY-SA 4.0)

Quais foram os desafios dessa abordagem?

Ao trabalhar neste problema, enfrentamos vários desafios. O primeiro grande desafio foi coletar dados de benchmark, o que exigiu o aprendizado do Elasticsearch e do Kibana, as duas ferramentas industriais usadas pela Red Hat para indexar, armazenar e interagir com dados do Pbench. Outra dificuldade foi lidar com as inconsistências nos dados, dados faltantes e erros nos dados indexados. Por exemplo, os dados da carga de trabalho para as execuções de benchmark foram indexados no Elasticsearch, mas um dos parâmetros cruciais da carga de trabalho, o tempo de execução, estava faltando. Para isso, tivemos que escrever código extra para acessá-lo a partir dos dados brutos de benchmark armazenados nos servidores Red Hat.

Depois de superarmos os desafios acima, gastamos grande parte de nosso esforço testando quase todas as técnicas de seleção de recursos disponíveis e descobrindo um conjunto representativo de parâmetros de hardware e sistema operacional para desempenho de rede. Foi um desafio compreender o funcionamento interno destas técnicas, as suas limitações e as suas aplicações e analisar porque é que a maioria delas não se aplicava ao nosso caso. Devido às limitações de espaço e à falta de tempo, não discutimos todos esses métodos neste artigo.

Artigos relacionados: