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 com1e 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:
- 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.
- Receba os pontos de acesso da instância do Parallelstore.
- Crie um script de inicialização para fazer a implantação em todas as instâncias de cliente.
- Crie em massa as VMs do Compute Engine usando o script de inicialização e a chave.
- 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
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.txtIPs públicos:
gcloud compute instances list --filter="name ~ '^${CLIENT_PREFIX}*'" --format="csv[no-heading](EXTERNAL_IP)" > external_ips.txtCopie 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"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
Desmonte o contêiner do DAOS:
sudo umount /tmp/parallelstore/Exclua a instância do Parallelstore:
CLI da gcloud
gcloud beta parallelstore instances delete INSTANCE_NAME --location=LOCATIONREST
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_NAMEExclua as VMs do Compute Engine: