Testar a performance

Os exemplos desta seção mostram comandos comuns que recomendamos para avaliar o desempenho usando a ferramenta IOR benchmark (github).

Antes de instalar o IOR, o MPI precisa ser instalado para sincronização entre processos de comparação de mercado. Recomendamos o uso da imagem HPC para VMs de cliente, que inclui ferramentas para instalar a Intel MPI 2021. Para clientes do Ubuntu, recomendamos o openmpi.

Verificar o desempenho da rede

Antes de executar a IOR, pode ser útil garantir que sua rede tenha a capacidade esperada. Se você tiver duas VMs de cliente, use uma ferramenta chamada iperf para testar a rede entre elas.

Instale o iperf nas duas VMs:

HPC Rocky 8

sudo dnf -y install iperf

Ubuntu

sudo apt install -y iperf

Inicie um servidor iperf em uma das suas VMs:

iperf -s -w 100m -P 30

Inicie um cliente iperf na outra VM:

iperf -c <IP ADDRESS OF iperf server VM> -w 100m -t 30s -P 30

Observe o número de throughput de rede entre as VMs. Para a melhor performance de um único cliente, use a rede Tier_1.

Desempenho de uma única VM

As instruções a seguir fornecem etapas e comparativos para medir o desempenho de uma única VM. Os testes executam vários processos de E/S para dentro e fora do Parallelstore com a intenção de saturar a placa de interface de rede (NIC).

Instalar a Intel MPI

HPC Rocky 8

sudo google_install_intelmpi --impi_2021

Para especificar a pilha de rede libfabric correta, defina a seguinte variável no ambiente:

export I_MPI_OFI_LIBRARY_INTERNAL=0

Em seguida:

source /opt/intel/setvars.sh

Ubuntu

sudo apt install -y autoconf
sudo apt install -y pkg-config
sudo apt install -y libopenmpi-dev
sudo apt install -y make

Instalar o IOR

Para instalar o IOR:

git clone https://github.com/hpc/ior.git
cd ior
./bootstrap
./configure
make
sudo make install

Executar os comandos IOR

Execute os comandos IOR a seguir. Para conferir os números de desempenho esperados, consulte a Visão geral do Parallelstore.

Desempenho máximo de uma única VM cliente

HPC Rocky 8

mpirun -genv LD_PRELOAD="/usr/lib64/libioil.so" -ppn 1 \
    --bind-to socket ior \
    -o "/tmp/parallelstore/test" -O useO_DIRECT=1 \
    -w -r -e -F -t "1m" -b "8g"

Ubuntu

mpirun --oversubscribe -x LD_PRELOAD="/usr/lib64/libioil.so" -n 1 \
    ior -o "/tmp/parallelstore/test" -O useO_DIRECT=1 \
    -w -r -e -F -t "1m" -b "8g"

Em que:

  • ior: comparativo real. Verifique se ele está disponível no caminho ou forneça o caminho completo.
  • -ppn: o número de processos (jobs) a serem executados. Recomendamos começar com 1 e aumentar até o número de vCPUs para alcançar o desempenho agregado máximo.
  • -O useO_DIRECT=1: força o uso de E/S direta para ignorar o cache de página e evitar a leitura de dados armazenados em cache.
  • -genv LD_PRELOAD="/usr/lib64/libioil.so": use a biblioteca de interceptação DAOS. Essa opção oferece o melhor desempenho bruto, mas ignora o cache de página do Linux para dados. Os metadados ainda estão armazenados em cache.
  • -w: realizar gravações em arquivos individuais.
  • -r: realizar leituras.
  • -e: realiza fsync após a conclusão das gravações.
  • -F: usar arquivos individuais.
  • -t "1m": leia e grave dados em blocos de tamanho especificado. Tamanhos de bloco maiores resultam em melhor desempenho de E/S de streaming de linha de execução única.
  • -b "8g": tamanho de cada arquivo

IOPS máximas de uma única VM cliente

HPC Rocky 8

mpirun -genv LD_PRELOAD="/usr/lib64/libioil.so" -ppn 80 \
    --bind-to socket ior \
    -o "/tmp/parallelstore/test" -O useO_DIRECT=1 \
    -w -r -e -F -t "4k" -b "1g"

Ubuntu

mpirun --oversubscribe -x LD_PRELOAD="/usr/lib64/libioil.so" -n 80 \
    ior -o "/tmp/parallelstore/test" -O useO_DIRECT=1 \
    -w -r -e -F -t "4k" -b "1g"

Desempenho máximo de uma única linha de execução do aplicativo

HPC Rocky 8

mpirun -genv LD_PRELOAD="/usr/lib64/libioil.so" -ppn 1 \
    --bind-to socket ior \
    -o "/tmp/parallelstore/test" -O useO_DIRECT=1 \
    -w -r -e -F -t "32m" -b "64g"

Ubuntu

mpirun -x LD_PRELOAD="/usr/lib64/libioil.so" -n 1 \
    ior -o "/tmp/parallelstore/test" -O useO_DIRECT=1 \
    -w -r -e -F -t "32m" -b "64g"

Pequena latência de E/S de uma única linha de execução do aplicativo

HPC Rocky 8

mpirun -genv LD_PRELOAD="/usr/lib64/libioil.so" -ppn 1 \
    --bind-to socket ior \
    -o "/tmp/parallelstore/test" -O useO_DIRECT=1 \
    -z -w -r -e -F -t "4k" -b "100m"

Ubuntu

mpirun -x LD_PRELOAD="/usr/lib64/libioil.so" -n 1 \
    ior -o "/tmp/parallelstore/test" -O useO_DIRECT=1 \
    -z -w -r -e -F -t "4k" -b "100m"

Testes de desempenho de várias VMs

Para alcançar os limites das instâncias do Parallelstore, é importante testar a E/S agregada que pode ser alcançada com a E/S paralela de várias VMs. As instruções desta seção fornecem detalhes e comandos sobre como fazer isso usando mpirun e ior.

Consulte o guia de IOR para conferir o conjunto completo de opções úteis para testar em um conjunto maior de nós. Há várias maneiras de iniciar VMs de cliente para testes com vários clientes usando programadores, como Batch, Slurm ou comandos em massa do Compute Engine. Além disso, o HPC Toolkit pode ajudar a criar modelos para implantar nós de computação.

Este guia usa as etapas a seguir para implantar várias instâncias de cliente configuradas para usar o Parallelstore:

  1. Crie uma chave SSH para usar na configuração de um usuário em cada VM cliente. É necessário desativar o requisito de login do SO no projeto, se ele tiver sido ativado.
  2. Receba os pontos de acesso da instância do Parallelstore.
  3. Crie um script de inicialização para implantar em todas as instâncias do cliente.
  4. Crie em massa as VMs do Compute Engine usando o script e a chave de inicialização.
  5. Copie as chaves e os arquivos de host necessários para executar os testes.

Confira os detalhes de cada etapa nas seções a seguir.

Defina as variáveis de ambiente

As seguintes variáveis de ambiente são usadas nos comandos de exemplo neste documento:

export SSH_USER="daos-user"
export CLIENT_PREFIX="daos-client-vm"
export NUM_CLIENTS=10

Atualize esses valores para os valores desejados.

Criar uma chave SSH

Crie uma chave SSH e salve-a localmente para ser distribuída às VMs do cliente. A chave é associada ao usuário SSH especificado nas variáveis de ambiente e será criada em cada VM:

# Generate an SSH key for the specified user
ssh-keygen -t rsa -b 4096 -C "${SSH_USER}" -N '' -f "./id_rsa"
chmod 600 "./id_rsa"

#Create a new file in the format [user]:[public key] user
echo "${SSH_USER}:$(cat "./id_rsa.pub") ${SSH_USER}" > "./keys.txt"

Acessar detalhes da rede do Parallelstore

Receba os endereços IP do servidor do Parallelstore em um formato que possa ser consumido pelo agente DAOS:

export ACCESS_POINTS=$(gcloud beta parallelstore instances describe INSTANCE_NAME \
  --location LOCATION \
  --format "value[delimiter=', '](format("{0}", accessPoints))")

Confira o nome da rede associada à instância do Parallelstore:

export NETWORK=$(gcloud beta parallelstore instances describe INSTANCE_NAME \
  --location LOCATION \
  --format "value[delimiter=', '](format('{0}', network))" | awk -F '/' '{print $NF}')

Crie o script de inicialização

O script de inicialização é anexado à VM e é executado sempre que o sistema é iniciado. O script de inicialização faz o seguinte:

  • Configura o agente daos
  • Instala as bibliotecas necessárias
  • Monta a instância do Parallelstore em /tmp/parallelstore/ em cada VM
  • Instala ferramentas de teste de desempenho

Esse script pode ser usado para implantar seus aplicativos personalizados em várias máquinas. Edite a seção relacionada ao código específico do aplicativo no script.

O script a seguir funciona em VMs com o HPC Rocky 8.

# Create a startup script that configures the VM
cat > ./startup-script << EOF
sudo tee /etc/yum.repos.d/parallelstore-v2-6-el8.repo << INNEREOF
[parallelstore-v2-6-el8]
name=Parallelstore EL8 v2.6
baseurl=https://us-central1-yum.pkg.dev/projects/parallelstore-packages/v2-6-el8
enabled=1
repo_gpgcheck=0
gpgcheck=0
INNEREOF
sudo dnf makecache

# 2) Install daos-client
dnf install -y epel-release # needed for capstone
dnf install -y daos-client

# 3) Upgrade libfabric
dnf upgrade -y libfabric

systemctl stop daos_agent

mkdir -p /etc/daos
cat > /etc/daos/daos_agent.yml << INNEREOF
access_points: ${ACCESS_POINTS}

transport_config:
  allow_insecure: true

fabric_ifaces:
- numa_node: 0
  devices:
  - iface: eth0
    domain: eth0
INNEREOF

echo -e "Host *\n\tStrictHostKeyChecking no\n\tUserKnownHostsFile /dev/null" > /home/${SSH_USER}/.ssh/config
chmod 600 /home/${SSH_USER}/.ssh/config

usermod -u 2000 ${SSH_USER}
groupmod -g 2000 ${SSH_USER}
chown -R ${SSH_USER}:${SSH_USER} /home/${SSH_USER}

chown -R daos_agent:daos_agent /etc/daos/

systemctl enable daos_agent
systemctl start daos_agent

mkdir -p /tmp/parallelstore
dfuse -m /tmp/parallelstore --pool default-pool --container default-container --disable-wb-cache --thread-count=16 --eq-count=8 --multi-user
chmod 777 /tmp/parallelstore

#Application specific code
#Install Intel MPI:
sudo google_install_intelmpi --impi_2021
export I_MPI_OFI_LIBRARY_INTERNAL=0
source /opt/intel/setvars.sh

#Install IOR
git clone https://github.com/hpc/ior.git
cd ior
./bootstrap
./configure
make
make install
EOF

Criar as VMs do cliente

O desempenho geral das cargas de trabalho depende dos tipos de máquinas clientes. O exemplo a seguir usa VMs c2-standard-30. Modifique o valor machine-type para aumentar o desempenho com NICs mais rápidas. Consulte o Guia de comparação e recursos de famílias de máquinas para saber mais sobre os tipos de máquinas disponíveis.

Para criar instâncias de VM em massa, use o comando gcloud compute instances create:

gcloud compute instances bulk create \
  --name-pattern="${CLIENT_PREFIX}-####" \
  --zone="LOCATION" \
  --machine-type="c2-standard-30" \
  --network-interface=subnet=${NETWORK},nic-type=GVNIC \
  --network-performance-configs=total-egress-bandwidth-tier=TIER_1 \
  --create-disk=auto-delete=yes,boot=yes,device-name=client-vm1,image=projects/cloud-hpc-image-public/global/images/hpc-rocky-linux-8-v20240126,mode=rw,size=100,type=pd-balanced \
  --metadata=enable-oslogin=FALSE \
  --metadata-from-file=ssh-keys=./keys.txt,startup-script=./startup-script \
  --count ${NUM_CLIENTS}

Copiar chaves e arquivos

  1. Extraia e salve os endereços IP públicos e particulares de todas as VMs.

    IPs privados:

    gcloud compute instances list --filter="name ~ '^${CLIENT_PREFIX}*'" --format="csv[no-heading](INTERNAL_IP)" > hosts.txt
    

    IPs públicos:

    gcloud compute instances list --filter="name ~ '^${CLIENT_PREFIX}*'" --format="csv[no-heading](EXTERNAL_IP)" > external_ips.txt
    
  2. Copie a chave privada para permitir o SSH sem senha entre nós. Isso é necessário para o teste IOR usando SSH para orquestrar máquinas.

    while IFS= read -r IP
    do
        echo "Copying id_rsa to  ${SSH_USER}@$IP"
        scp -i ./id_rsa -o StrictHostKeyChecking=no ./id_rsa ${SSH_USER}@$IP:~/.ssh/
    done < "./external_ips.txt"
    
  3. Extraia o IP do primeiro nó e copie a lista de IPs internos para esse nó. Esse será o nó principal da execução do teste.

    export HEAD_NODE=$(head -n 1 ./external_ips.txt)
    scp -i ./id_rsa -o "StrictHostKeyChecking=no" -o UserKnownHostsFile=/dev/null   ./hosts.txt ${SSH_USER}@${HEAD_NODE}:~
    

Executar comandos IOR em várias VMs

Conecte-se ao nó principal com o usuário especificado:

ssh -i ./id_rsa -o "StrictHostKeyChecking=no" -o UserKnownHostsFile=/dev/null ${SSH_USER}@${HEAD_NODE}

Em seguida:

source /opt/intel/setvars.sh
export I_MPI_OFI_LIBRARY_INTERNAL=0
export D_LOG_MASK=INFO
export D_LOG_FILE_APPEND_PID=1
rm -f /tmp/client.log.*
export D_LOG_FILE=/tmp/client.log

Desempenho máximo de várias VMs do cliente

Teste a performance em um cenário de vários processos e capacidade máxima.

mpirun -f hosts.txt -genv LD_PRELOAD="/usr/lib64/libioil.so" -ppn 30 \
    --bind-to socket ior \
    -o "/tmp/parallelstore/test" -O useO_DIRECT=1 \
    -w -r -e -F -t "1m" -b "8g"

IOPS máximo de várias VMs de cliente

Teste o desempenho em um cenário de vários processos e IOPS máximos.

mpirun -f hosts.txt -genv LD_PRELOAD="/usr/lib64/libioil.so" -ppn 30 \
    --bind-to socket ior \
    -o "/tmp/parallelstore/test" -O useO_DIRECT=1 \
    -w -r -e -F -t "4k" -b "1g"

Limpeza

  1. Desmonte o contêiner do DAOS:

    sudo umount /tmp/parallelstore/
    
  2. Exclua a instância do Parallelstore:

    CLI da gcloud

    gcloud beta parallelstore instances delete INSTANCE_NAME --location=LOCATION
    

    REST

    curl -X DELETE -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" https://parallelstore.googleapis.com/v1beta/projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_NAME
    
  3. Exclua as VMs do Compute Engine: