Testar a performance

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

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

Verificar o desempenho da rede

Antes de executar o IOR, pode ser útil garantir que sua rede tenha a capacidade de processamento 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 capacidade de processamento da rede entre as VMs. Para ter o melhor desempenho de cliente único, 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 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 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

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 de IOR

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

Performance máxima 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 de mercado 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 do DAOS. Essa opção oferece o maior desempenho bruto, mas ignora o cache de página do Linux para dados. Os metadados ainda estão em cache.
  • -w: realiza gravações em arquivos individuais.
  • -r: realiza leituras.
  • -e: executa fsync após a conclusão das gravações.
  • -F: use arquivos individuais.
  • -t "1m": lê e grava dados em partes do tamanho especificado. Tamanhos de bloco maiores resultam em melhor desempenho de E/S de streaming de uma única linha de execução.
  • -b "8g": tamanho de cada arquivo

IOPS máximo 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 de 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"

Latência de E/S pequena 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 atingir os limites das instâncias do Parallelstore, é importante testar a E/S agregada que pode ser alcançada com E/S paralela de várias VMs. As instruções nesta 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 escalonadores como Batch e Slurm ou os comandos em massa do Compute Engine. Além disso, o HPC Toolkit pode ajudar a criar modelos para implantar nós de computação.

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

  1. Crie uma chave SSH para configurar um usuário em cada VM cliente. Você precisa desativar a exigência de Login do SO no projeto, se ela estiver ativada.
  2. Receba os pontos de acesso da instância do Parallelstore.
  3. Crie um script de inicialização para fazer a implantação em todas as instâncias de cliente.
  4. Crie em massa as VMs do Compute Engine usando o script de inicialização e a chave.
  5. Copie as chaves e os arquivos de host necessários para executar os testes.

Confira 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 que você quer.

Criar uma chave SSH

Crie uma chave SSH e salve-a localmente para distribuição às VMs clientes. 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"

Receber detalhes da rede do Parallelstore

Receba os endereços IP do servidor Parallelstore em um formato consumível 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 sua 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 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

Criar as VMs cliente

O desempenho geral das suas cargas de trabalho depende dos tipos de máquinas cliente. 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 para famílias de máquinas para mais detalhes 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. Recupere e salve os endereços IP particulares 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 senha entre nós. Isso é necessário para o teste de 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. Recupere 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 de 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 clientes

Teste o desempenho em um cenário de vários processos e taxa de transferência 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 cliente

Teste o desempenho em um cenário de vários processos e IOPs máximas.

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: