Melhorar o desempenho de aplicativos MPI que usam PSM3

Esta página descreve os parâmetros de configuração do PSM3 que recomendamos usar com aplicativos MPI em execução em instâncias de computação H4D e no Cloud RDMA.

Para informações sobre todos os parâmetros de configuração do PSM3 disponíveis, consulte o Guia do usuário do software do host do Intel Ethernet Fabric Suite.

Recomendações para aplicativos com fluxos de dados instáveis ou tráfego UD intenso

Aplicativos que sofrem picos repentinos de tráfego ou dependem muito do modo de datagrama não confiável (UD) podem sobrecarregar a interface de rede, levando a perdas de pacotes na origem.

  • Solução: configure o sistema de contrapressão baseado em crédito para regular os picos de transmissão e evitar a perda de pacotes na camada de transporte. Uma instância H4D do Compute Engine fornece 256 créditos totais. Recomendamos que você aloque um crédito fixo mínimo para cada vCPU, com a capacidade restante colocada em um pool compartilhado.
  • Configuração recomendada (exemplo para 192 classificações por nó): para uma operação com 192 classificações por nó, se cada vCPU receber um crédito fixo, o pool compartilhado será de 256 a 192 = 64.

    IRDMA_SHARED_UD_CREDITS=64
    IRDMA_TRANSPARENT_UD_QD_OVERRIDE=1
    

Aumentar a contagem total de créditos além dos limites recomendados pode levar a quedas de transmissão na origem. Embora a superinscrição (definir créditos totais maiores que os disponíveis) possa melhorar a performance de cargas de trabalho com padrões de tráfego estáveis e de baixa densidade, ela normalmente degrada a performance de cargas de trabalho caracterizadas por picos repentinos ou tráfego UD intenso.

As variáveis de ambiente que podem ser usadas para ajustar a performance do Cloud RDMA são as seguintes:

  • IRDMA_SHARED_UD_CREDITS: especifica o tamanho de um pool global de créditos UD que estão disponíveis para todos os processos em um único nó. Com um valor de 64, isso significa que há uma reserva compartilhada de 64 créditos que qualquer processo pode usar.
  • IRDMA_TRANSPARENT_UD_QD_OVERRIDE: limita a profundidade da fila para pares de filas (QPs) que usam UD no driver irdma. Quando definido como 1, ele funciona com IRDMA_SHARED_UD_CREDITS para aplicar a contrapressão da camada de transporte e evitar estouros de fila de transmissão em cargas multiprocesso pesadas.

Recomendações para aplicativos com alta confiabilidade ou requisitos de memória altos

Para garantir a confiabilidade dos pacotes UD no lado do receptor, os aplicativos RDMA precisam alocar buffers de recebimento suficientes e manter slots disponíveis na fila de conclusão (CQ).

  • Recomendação padrão para alta confiabilidade: use as seguintes variáveis de ambiente para especificar profundidades de fila mais altas como um esforço para evitar quedas de pacotes UD da fila de recebimento (RX).

    PSM3_NUM_RECV_WQES=32767
    PSM3_NUM_RECV_CQES=65536
    
  • Exceção para requisitos de memória altos: se o aplicativo enfrentar problemas de falta de memória (OOM), reduza os tamanhos da fila, mas mantenha a mesma proporção entre os dois valores.

    Aplicativos como gradientes conjugados de alta performance (HPCG) têm requisitos de memória enormes. O uso das configurações para a recomendação padrão de alta confiabilidade pode resultar em erros de OOM. PSM3_NUM_RECV_WQES determina o número de entradas de fila de trabalho (WQEs) de RX e buffers de retorno ansiosos alocados por endpoint local. Valores mais altos resultam em um overhead de memória maior.

As variáveis de ambiente que podem ser usadas para melhorar a confiabilidade ou a utilização da memória são:

  • PSM3_NUM_RECV_WQES: define o número de WQEs de RX a serem alocadas. O QP UD é dimensionado em PSM3_NUM_RECV_WQES + 1032 WQEs. Esse parâmetro também define o número de buffers de retorno ansiosos de recebimento de UD (cada um de tamanho PSM3_MTU) que são alocados para cada endpoint local.

  • PSM3_NUM_RECV_CQES: controla o número de entradas de fila de conclusão (CQEs) para operações de recebimento. Esse parâmetro ajuda a garantir a confiabilidade dos pacotes UD no lado do receptor, garantindo que sempre haja slots disponíveis na fila de conclusão. Uma profundidade de fila maior, por exemplo, 65536, ajuda a evitar quedas de pacotes UD de RX, mas usa memória e pode resultar em erros de OOM para aplicativos com uso intenso de memória.

Recomendações para aplicativos que não reutilizam buffers

Alguns aplicativos, como o LINPACK de alta performance (HPL), alocam e liberam buffers de comunicação temporários com frequência, em vez de mantê-los e reutilizá-los. Esse ciclo contínuo de solicitação e liberação de memória força o sistema a registrar e cancelar o registro de páginas de memória constantemente, criando um gargalo de performance significativo.

  • Solução: use um alocador de memória personalizado, como jemalloc, como solução alternativa. jemalloc é um alocador de memória de uso geral de alta performance (malloc) projetado para enfatizar o escalonamento de simultaneidade e evitar a fragmentação de memória. Ao forçar a reciclagem eficiente de buffers de comunicação grandes (maiores que 128 KB), essa solução ignora ciclos de realocação de kernel caros e restaura a performance do PSM3.

  • Configuração recomendada:

    1. Instale jemalloc. Por exemplo, no Rocky Linux, é possível executar os seguintes comandos que usam os pacotes extras para o repositório do Enterprise Linux (EPEL):

      sudo dnf install epel-release
      sudo dnf install jemalloc
      
    2. Faça o pré-carregamento de jemalloc e aplique limites de cache otimizados antes de executar o aplicativo:

      LD_PRELOAD="/usr/lib64/libjemalloc.so.2"
      export MALLOC_CONF="dirty_decay_ms:-1,muzzy_decay_ms:-1,lg_tcache_max:26"
      

O comando de configuração usa as seguintes configurações:

  • LD_PRELOAD: especifica as bibliotecas compartilhadas a serem carregadas antes de iniciar um processo.
  • MALLOC_CONF: configura o comportamento de alocação de memória para jemalloc.
  • dirty_decay_ms:-1 e muzzy_decay_ms:-1: instrui jemalloc a nunca retornar memória não utilizada para o SO. Isso mantém as páginas registradas permanentemente para reutilização imediata.
  • lg_tcache_max:26: aumenta o limite de cache em memória por linha de execução para 64 MB, o que garante que buffers de comunicação grandes sejam armazenados em cache de forma agressiva.

A seguir