Testleistung

Die Beispiele in diesem Abschnitt zeigen gängige Befehle, die wir zur Leistungsbewertung mit dem Tool IOR-Benchmark (github) empfehlen.

Vor der Installation von IOR muss MPI für die Synchronisierung zwischen Benchmarking-Prozessen installiert werden. Wir empfehlen die Verwendung des HPC-Images für Client-VMs, das Tools zur Installation von Intel MPI 2021 enthält. Für Ubuntu-Clients empfehlen wir openmpi.

Netzwerkleistung prüfen

Bevor Sie IOR ausführen, kann es hilfreich sein, dafür zu sorgen, dass Ihr Netzwerk den erwarteten Durchsatz hat. Wenn Sie zwei Client-VMs haben, können Sie mit dem Tool iperf das Netzwerk zwischen ihnen testen.

Installieren Sie iperf auf beiden VMs:

HPC Rocky 8

sudo dnf -y install iperf

Ubuntu

sudo apt install -y iperf

Starten Sie einen iPerf-Server auf einer Ihrer VMs:

iperf -s -w 100m -P 30

Starten Sie einen iPerf-Client auf der anderen VM:

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

Beobachten Sie den Netzwerkdurchsatz zwischen den VMs. Für die höchste Leistung bei einzelnen Clients muss Tier_1-Netzwerk verwendet werden.

Leistung einer einzelnen VM

In der folgenden Anleitung finden Sie Schritte und Benchmarks zum Messen der Leistung einer einzelnen VM. Bei den Tests werden mehrere I/O-Prozesse in Parallelstore und aus Parallelstore ausgeführt, um die Netzwerkschnittstellenkarte (NIC) zu überlasten.

Intel MPI installieren

HPC Rocky 8

sudo google_install_intelmpi --impi_2021

Um den richtigen libfabric-Netzwerkstack anzugeben, legen Sie in Ihrer Umgebung die folgende Variable fest:

export I_MPI_OFI_LIBRARY_INTERNAL=0

Gehen Sie anschließend so vor:

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

IOR installieren

So installieren Sie IOR:

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

IOR-Befehle ausführen

Führen Sie die folgenden IOR-Befehle aus. Informationen zu den zu erwartenden Leistungszahlen finden Sie in der Parallelstore-Übersicht.

Maximale Leistung einer einzelnen Client-VM

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"

Wobei:

  • ior: tatsächlicher Benchmark. Achten Sie darauf, dass es im Pfad verfügbar ist, oder geben Sie den vollständigen Pfad an.
  • -ppn: die Anzahl der auszuführenden Prozesse (Jobs). Wir empfehlen, mit 1 zu beginnen und dann die Anzahl der vCPUs so zu erhöhen, dass die maximale Gesamtleistung erreicht wird.
  • -O useO_DIRECT=1: Die direkte I/O wird erzwungen, um den Auslagerungsspeicher zu umgehen und das Lesen von im Cache gespeicherten Daten zu vermeiden.
  • -genv LD_PRELOAD="/usr/lib64/libioil.so": die DAOS-Abfangbibliothek verwenden. Diese Option bietet die höchste Rohleistung, umgeht aber den Linux-Seitencache für Daten. Die Metadaten sind noch im Cache.
  • -w: Schreibvorgänge in einzelne Dateien ausführen.
  • -r: Lesevorgänge ausführen.
  • -e: Führen Sie nach Abschluss der Schreibvorgänge fsync aus.
  • -F: Einzelne Dateien verwenden.
  • -t "1m": Daten in Chunks mit einer bestimmten Größe lesen und schreiben. Größere Chunk-Größen führen zu einer besseren E/A-Leistung beim Streaming mit einem einzelnen Thread.
  • -b "8g" – Größe der einzelnen Datei

Maximale IOPS einer einzelnen Client-VM

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"

Maximale Leistung eines einzelnen Anwendungsthreads

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"

Geringe E/A-Latenz eines einzelnen Anwendungsthreads

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"

Leistungstests mit mehreren VMs

Um die Grenzen von Parallelstore-Instanzen zu erreichen, ist es wichtig, die Gesamt-E/A zu testen, die mit parallelen E/A von mehreren VMs möglich ist. In den Anleitungen in diesem Abschnitt finden Sie Details und Befehle dazu, wie Sie dies mit mpirun und ior tun.

Im IOR-Leitfaden finden Sie alle Optionen, die sich für Tests an einer größeren Anzahl von Knoten eignen. Es gibt verschiedene Möglichkeiten, Client-VMs für Multi-Client-Tests zu starten. Dazu können Sie Scheduler wie Batch, Slurm oder die Bulk-Befehle der Compute Engine verwenden. Außerdem können Sie mit dem HPC Toolkit Vorlagen zum Bereitstellen von Compute-Knoten erstellen.

In dieser Anleitung werden die folgenden Schritte verwendet, um mehrere Clientinstanzen bereitzustellen, die für die Verwendung von Parallelstore konfiguriert sind:

  1. Erstellen Sie einen SSH-Schlüssel, mit dem Sie einen Nutzer auf jeder Client-VM einrichten. Wenn die Anforderung für OS Login für das Projekt aktiviert ist, müssen Sie sie deaktivieren.
  2. Rufen Sie die Zugriffspunkte der Parallelstore-Instanz ab.
  3. Erstellen Sie ein Startskript, das auf allen Clientinstanzen bereitgestellt werden soll.
  4. Erstellen Sie die Compute Engine-VMs mit dem Startscript und dem Schlüssel im Bulk-Verfahren.
  5. Kopieren Sie die erforderlichen Schlüssel und Hostdateien, die zum Ausführen der Tests erforderlich sind.

Details zu den einzelnen Schritten finden Sie in den folgenden Abschnitten.

Umgebungsvariablen festlegen

In den Beispielbefehlen in diesem Dokument werden die folgenden Umgebungsvariablen verwendet:

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

Aktualisieren Sie diese auf die gewünschten Werte.

SSH-Schlüssel erstellen

Erstellen Sie einen SSH-Schlüssel und speichern Sie ihn lokal, um ihn an die Client-VMs zu verteilen. Der Schlüssel wird mit dem in den Umgebungsvariablen angegebenen SSH-Nutzer verknüpft und auf jeder VM erstellt:

# 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"

Parallelstore-Netzwerkdetails abrufen

Rufen Sie die Parallelstore-Server-IP-Adressen in einem Format ab, das vom daos-Agenten verwendet werden kann:

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

Rufen Sie den Netzwerknamen ab, der mit der Parallelstore-Instanz verknüpft ist:

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

Startskript erstellen

Das Startskript ist mit der VM verknüpft und wird bei jedem Systemstart ausgeführt. Das Startskript führt Folgendes aus:

  • Konfiguriert den daos-Agent
  • Erforderliche Bibliotheken werden installiert.
  • Parallelstore-Instanz auf jeder VM auf /tmp/parallelstore/ bereitstellen
  • Installiert Tools für Leistungstests

Mit diesem Script können Sie Ihre benutzerdefinierten Anwendungen auf mehreren Maschinen bereitstellen. Bearbeiten Sie den Abschnitt im Script, der sich auf den anwendungsspezifischen Code bezieht.

Das folgende Script funktioniert auf VMs mit 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

Client-VMs erstellen

Die Gesamtleistung Ihrer Arbeitslasten hängt von den Clientmaschinentypen ab. Im folgenden Beispiel werden c2-standard-30 VMs verwendet. Ändern Sie den Wert machine-type, um die Leistung mit schnelleren NICs zu steigern. Weitere Informationen zu den verfügbaren Maschinentypen finden Sie im Leitfaden zu Ressourcen und Vergleichen für Maschinenfamilien.

Wenn Sie VM-Instanzen im Bulk erstellen möchten, verwenden Sie den Befehl 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}

Schlüssel und Dateien kopieren

  1. Rufen Sie die privaten und öffentlichen IP-Adressen für alle VMs ab und speichern Sie sie.

    Private IP-Adressen:

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

    Öffentliche IP-Adressen:

    gcloud compute instances list --filter="name ~ '^${CLIENT_PREFIX}*'" --format="csv[no-heading](EXTERNAL_IP)" > external_ips.txt
    
  2. Kopieren Sie den privaten Schlüssel, um eine passwortlose SSH-Verbindung zwischen Knoten zu ermöglichen. Dies ist für den IOR-Test erforderlich, bei dem Maschinen über SSH orchestriert werden.

    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. Rufen Sie die IP des ersten Knotens ab und kopieren Sie die Liste der internen IPs in diesen Knoten. Dies ist der Head-Knoten für den Testlauf.

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

IOR-Befehle auf mehreren VMs ausführen

Stellen Sie mit dem angegebenen Nutzer eine Verbindung zum Hauptknoten her:

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

Gehen Sie anschließend so vor:

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

Maximale Leistung durch mehrere Client-VMs

Leistung in einem Szenario mit mehreren Prozessen und maximalem Durchsatz testen

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"

Maximale IOPS von mehreren Client-VMs

Leistung in einem Szenario mit mehreren Prozessen und maximalen IOPS testen

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"

Bereinigen

  1. Trennen Sie den DAOS-Container:

    sudo umount /tmp/parallelstore/
    
  2. Löschen Sie die Parallelstore-Instanz:

    gcloud-CLI

    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. Löschen Sie die Compute Engine-VMs: