Tester les performances

Les exemples de cette section présentent des commandes courantes que nous recommandons d'utiliser pour évaluer les performances à l'aide de l'outil IOR benchmark (github).

Avant d'installer IOR, MPI doit être installé pour la synchronisation entre les processus de benchmarking. Nous vous recommandons d'utiliser l'image HPC pour les VM clientes, qui inclut les outils permettant d'installer Intel MPI 2021. Pour les clients Ubuntu, nous recommandons openmpi.

Vérifier les performances du réseau

Avant d'exécuter l'IOR, il peut être utile de vérifier que votre réseau dispose du débit attendu. Si vous disposez de deux VM clientes, vous pouvez utiliser un outil appelé iperf pour tester le réseau entre elles.

Installez iperf sur les deux VM:

HPC Rocky 8

sudo dnf -y install iperf

Ubuntu

sudo apt install -y iperf

Démarrez un serveur iperf sur l'une de vos VM:

iperf -s -w 100m -P 30

Démarrez un client iperf sur l'autre VM:

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

Observez le débit réseau entre les VM. Pour obtenir les meilleures performances pour un seul client, assurez-vous d'utiliser la mise en réseau Tier_1.

Performances d'une seule VM

Les instructions suivantes fournissent des étapes et des benchmarks pour mesurer les performances d'une seule VM. Les tests exécutent plusieurs processus d'E/S dans et hors de Parallelstore dans le but de saturer la carte d'interface réseau (NIC).

Installer Intel MPI

HPC Rocky 8

sudo google_install_intelmpi --impi_2021

Pour spécifier la pile réseau libfabric appropriée, définissez la variable suivante dans votre environnement:

export I_MPI_OFI_LIBRARY_INTERNAL=0

Puis :

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

Installer IOR

Pour installer IOR:

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

Exécuter les commandes IOR

Exécutez les commandes IOR suivantes. Pour consulter les performances attendues, consultez la présentation de Parallelstore.

Performances maximales à partir d'une seule 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"

Où :

  • ior: benchmark réel. Assurez-vous qu'il est disponible dans le chemin d'accès ou fournissez le chemin d'accès complet.
  • -ppn: nombre de processus (tâches) à exécuter. Nous vous recommandons de commencer par 1, puis d'augmenter la valeur jusqu'au nombre de vCPU pour obtenir des performances agrégées maximales.
  • -O useO_DIRECT=1: force l'utilisation d'E/S directes pour contourner le cache de pages et éviter de lire les données mises en cache.
  • -genv LD_PRELOAD="/usr/lib64/libioil.so": utilisez la bibliothèque d'interception DAOS. Cette option offre les performances brutes les plus élevées, mais contourne le cache de pages Linux pour les données. Les métadonnées sont toujours mises en cache.
  • -w: effectue des écritures dans des fichiers individuels.
  • -r: effectuer des lectures.
  • -e: effectuez une fsync à la fin des écritures.
  • -F: utiliser des fichiers individuels.
  • -t "1m": lit et écrit des données par blocs de taille spécifiée. Des tailles de blocs plus importantes améliorent les performances d'E/S de streaming à un seul thread.
  • -b "8g" : taille de chaque fichier

IOPS max d'une seule 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"

Performances maximales à partir d'un seul thread d'application

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"

Latence d'E/S faible à partir d'un seul thread d'application

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"

Tests de performances multi-VM

Pour atteindre les limites des instances Parallelstore, il est important de tester les E/S agrégées réalisables avec les E/S parallèles de plusieurs VM. Les instructions de cette section fournissent des informations et des commandes pour effectuer cette opération à l'aide de mpirun et ior.

Consultez le guide de l'IOR pour obtenir l'ensemble complet des options utiles à tester sur un ensemble plus important de nœuds. Notez qu'il existe plusieurs façons de lancer des VM clientes pour les tests multi-clients, par exemple à l'aide de planificateurs tels que Batch, Slurm ou des commandes groupées Compute Engine. Le kit HPC peut également vous aider à créer des modèles pour déployer des nœuds de calcul.

Ce guide utilise les étapes suivantes pour déployer plusieurs instances clientes configurées pour utiliser Parallelstore:

  1. Créez une clé SSH à utiliser pour configurer un utilisateur sur chaque VM cliente. Vous devez désactiver l'exigence d'OS Login sur le projet si elle a été activée.
  2. Obtenez les points d'accès de l'instance Parallelstore.
  3. Créez un script de démarrage à déployer sur toutes les instances client.
  4. Créez les VM Compute Engine de manière groupée à l'aide du script de démarrage et de la clé.
  5. Copiez les clés et les fichiers d'hôte nécessaires pour exécuter les tests.

Les détails de chaque étape sont fournis dans les sections suivantes.

Définir des variables d'environnement

Les variables d'environnement suivantes sont utilisées dans les exemples de commandes de ce document:

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

Remplacez-les par les valeurs souhaitées.

Créer une clé SSH

Créez une clé SSH et enregistrez-la localement pour la distribuer aux VM clientes. La clé est associée à l'utilisateur SSH spécifié dans les variables d'environnement et sera créée sur chaque 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"

Obtenir les détails du réseau Parallelstore

Obtenez les adresses IP des serveurs Parallelstore dans un format utilisable par l'agent daos:

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

Obtenez le nom du réseau associé à l'instance Parallelstore:

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

Créer le script de démarrage

Le script de démarrage est associé à la VM et s'exécute à chaque démarrage du système. Le script de démarrage effectue les opérations suivantes:

  • Configure l'agent daos
  • Installe les bibliothèques requises
  • Installe votre instance Parallelstore sur /tmp/parallelstore/ sur chaque VM.
  • Installe des outils de test des performances

Ce script permet de déployer vos applications personnalisées sur plusieurs machines. Modifiez la section liée au code spécifique à l'application dans le script.

Le script suivant fonctionne sur les VM exécutant 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

Créer les VM clientes

Les performances globales de vos charges de travail dépendent des types de machines clientes. L'exemple suivant utilise des VM c2-standard-30. Modifiez la valeur machine-type pour améliorer les performances avec des NIC plus rapides. Pour en savoir plus sur les types de machines disponibles, consultez le Guide des ressources de familles de machines et guide comparatif.

Pour créer des instances de VM de manière groupée, utilisez la commande 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}

Copier des clés et des fichiers

  1. Récupérez et enregistrez les adresses IP privées et publiques de toutes les VM.

    Adresses IP privées:

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

    Adresses IP publiques:

    gcloud compute instances list --filter="name ~ '^${CLIENT_PREFIX}*'" --format="csv[no-heading](EXTERNAL_IP)" > external_ips.txt
    
  2. Copiez la clé privée pour permettre l'accès SSH sans mot de passe entre les nœuds. Cela est nécessaire pour le test d'IOR à l'aide de SSH pour orchestrer les machines.

    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. Récupérez l'adresse IP du premier nœud, puis copiez la liste des adresses IP internes sur ce nœud. Il s'agit du nœud principal de l'exécution du test.

    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}:~
    

Exécuter des commandes IOR sur plusieurs VM

Connectez-vous au nœud principal avec l'utilisateur spécifié:

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

Puis :

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

Performances maximales à partir de plusieurs VM clientes

Testez les performances dans un scénario multiprocessus avec débit maximal.

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 maximaux de plusieurs VM clientes

Testez les performances dans un scénario multiprocessus avec un nombre maximal d'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"

Nettoyage

  1. Désinstallez le conteneur DAOS:

    sudo umount /tmp/parallelstore/
    
  2. Supprimez l'instance 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. Supprimez les VM Compute Engine: