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, mit1
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:
- 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.
- Rufen Sie die Zugriffspunkte der Parallelstore-Instanz ab.
- Erstellen Sie ein Startskript, das auf allen Clientinstanzen bereitgestellt werden soll.
- Erstellen Sie die Compute Engine-VMs mit dem Startscript und dem Schlüssel im Bulk-Verfahren.
- 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
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
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"
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
Trennen Sie den DAOS-Container:
sudo umount /tmp/parallelstore/
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
Löschen Sie die Compute Engine-VMs: