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 com1
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:
- 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.
- Obtenha os pontos de acesso da instância do Parallelstore.
- Crie um script de arranque para implementar em todas as instâncias de cliente.
- Crie em massa as VMs do Compute Engine através do script de arranque e da chave.
- 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
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
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"
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
Desmonte o contentor DAOS:
sudo umount /tmp/parallelstore/
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
Elimine as VMs do Compute Engine: