Teste o desempenho

Os exemplos nesta secção mostram comandos comuns que recomendamos para avaliar o desempenho através da ferramenta IOR benchmark (github).

Antes de instalar o IOR, tem de instalar o MPI para a sincronização entre processos de testes de desempenho. Recomendamos a utilização da imagem de HPC para VMs de cliente, que inclui ferramentas para instalar o Intel MPI 2021. Para clientes Ubuntu, recomendamos o openmpi.

Verifique o desempenho da rede

Antes de executar o IOR, pode ser útil garantir que a sua rede tem o débito esperado. Se tiver duas VMs cliente, pode usar uma ferramenta denominada iperf para testar a rede entre elas.

Instale o iperf em ambas as VMs:

HPC Rocky 8

sudo dnf -y install iperf

Ubuntu

sudo apt install -y iperf

Inicie um servidor iperf numa 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 débito da rede entre as VMs. Para o desempenho de cliente único mais elevado, certifique-se de que usa a rede de nível 1.

Desempenho de VM única

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

Instale o 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 seu 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

Instalação de IOR

Para instalar o IOR:

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

Execute os comandos IOR

Execute os seguintes comandos IOR. Para ver os números de desempenho esperados, consulte a vista geral da Parallelstore.

Máximo desempenho a partir de uma única VM do 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"

Onde:

  • ior: referência real. Certifique-se de que está disponível no caminho ou indique o caminho completo.
  • -ppn: o número de processos (tarefas) a executar. Recomendamos que comece com 1 e, em seguida, aumente até ao número de vCPUs para alcançar o desempenho agregado máximo.
  • -O useO_DIRECT=1: forçar a utilização de E/S direta para ignorar a cache de páginas e evitar a leitura de dados em cache.
  • -genv LD_PRELOAD="/usr/lib64/libioil.so": use a biblioteca de interceção DAOS. Esta opção oferece o desempenho bruto mais elevado, mas ignora a cache de páginas do Linux para os dados. Os metadados continuam em cache.
  • -w: realizar escritas em ficheiros individuais.
  • -r: realizar leituras.
  • -e: execute fsync após a conclusão das escritas.
  • -F: use ficheiros individuais.
  • -t "1m": ler e escrever dados em blocos de tamanho especificado. Os tamanhos dos blocos maiores resultam num melhor desempenho de I/O de streaming de uma única thread.
  • -b "8g": tamanho de cada ficheiro

Máximo de IOps 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"

Máximo desempenho a partir de uma única discussão da aplicação

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"

Latência de E/S pequena de uma única thread de aplicação

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 atingir os limites das instâncias do Parallelstore, é importante testar a E/S agregada alcançável com E/S paralela de várias VMs. As instruções nesta secção fornecem detalhes e comandos sobre como o fazer usando mpirun e ior.

Consulte o guia de IOR para ver o conjunto completo de opções úteis para testar num conjunto maior de nós. Tenha em atenção que existem várias formas de iniciar VMs de cliente para testes com vários clientes, desde a utilização de agendadores como o Batch, o Slurm ou a utilização dos comandos em massa do Compute Engine. Além disso, o HPC Toolkit pode ajudar a criar modelos para implementar nós de computação.

Este guia usa os seguintes passos para implementar várias instâncias de cliente configuradas para usar o Parallelstore:

  1. Crie uma chave SSH para usar na configuração de um utilizador em cada VM cliente. Tem de desativar o requisito de início de sessão no SO no projeto, se tiver sido ativado.
  2. Obtenha os pontos de acesso da instância do Parallelstore.
  3. Crie um script de arranque para implementar em todas as instâncias de cliente.
  4. Crie em massa as VMs do Compute Engine através do script de arranque e da chave.
  5. Copie as chaves e os ficheiros de anfitrião necessários para executar os testes.

Os detalhes de cada passo encontram-se nas secções seguintes.

Defina 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-os para os valores pretendidos.

Crie uma chave SSH

Crie uma chave SSH e guarde-a localmente para distribuição às VMs cliente. A chave está associada ao utilizador do SSH especificado nas variáveis de ambiente e é 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"

Obtenha detalhes da rede Parallelstore

Obtenha os endereços IP do servidor Parallelstore num formato consumível pelo agente daos:

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

Obtenha o nome da rede associado à 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 arranque

O script de arranque está anexado à VM e é executado sempre que o sistema é iniciado. O script de arranque faz o seguinte:

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

Este script pode ser usado para implementar as suas aplicações personalizadas em várias máquinas. Edite a secção relacionada com o código específico da aplicação no script.

O seguinte script funciona em VMs que executam 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

Crie as VMs cliente

O desempenho geral das suas cargas de trabalho depende dos tipos de máquinas cliente. O exemplo seguinte usa VMs c2-standard-30; modifique o machine-type valor para aumentar o desempenho com NICs mais rápidas. Consulte o recurso de famílias de máquinas e o guia de comparação para ver detalhes dos tipos de máquinas disponíveis.

Para criar instâncias de VMs 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}

Copie chaves e ficheiros

  1. Obter e guardar os endereços IP privados e públicos 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 palavra-passe entre nós. Isto é necessário para o teste IOR que usa o 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. Obtenha o IP do primeiro nó e copie a lista de IPs internos para esse nó. Este será o nó principal da execução de 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}:~
    

Execute comandos IOR em várias VMs

Ligue-se ao nó principal com o utilizador 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

Máximo desempenho de várias VMs de cliente

Teste o desempenho num cenário de vários processos com débito máximo.

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"

Máximo de IOPs de várias VMs de cliente

Teste o desempenho num cenário de vários processos com o máximo de IOPs.

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 contentor DAOS:

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

    CLI 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. Elimine as VMs do Compute Engine: