Cómo probar el rendimiento

En los ejemplos de esta sección, se muestran comandos comunes que recomendamos para evaluar el rendimiento con la herramienta de comparativas de IOR (github).

Antes de instalar IOR, se debe instalar MPI para la sincronización entre los procesos de comparativas. Recomendamos usar la imagen de HPC para las VMs de cliente, que incluye herramientas para instalar Intel MPI 2021. Para los clientes de Ubuntu, recomendamos openmpi.

Cómo verificar el rendimiento de la red

Antes de ejecutar IOR, puede ser útil asegurarse de que tu red tenga la capacidad de procesamiento esperada. Si tienes dos VMs de cliente, puedes usar una herramienta llamada iperf para probar la red entre ellas.

Instala iperf en ambas VMs:

HPC Rocky 8

sudo dnf -y install iperf

Ubuntu

sudo apt install -y iperf

Inicia un servidor iperf en una de tus VMs:

iperf -s -w 100m -P 30

Inicia un cliente iperf en la otra VM:

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

Observa el número de capacidad de procesamiento de red entre las VMs. Para obtener el rendimiento más alto de un solo cliente, asegúrate de usar la red de nivel 1.

Rendimiento de una sola VM

En las siguientes instrucciones, se proporcionan pasos y comparativas para medir el rendimiento de una sola VM. Las pruebas ejecutan varios procesos de E/S dentro y fuera de Parallelstore con la intención de saturar la tarjeta de interfaz de red (NIC).

Instala Intel MPI

HPC Rocky 8

sudo google_install_intelmpi --impi_2021

Para especificar la pila de redes libfabric correcta, configura la siguiente variable en tu entorno:

export I_MPI_OFI_LIBRARY_INTERNAL=0

Luego:

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 IOR

Para instalar IOR, haz lo siguiente:

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

Ejecuta los comandos IOR

Ejecuta los siguientes comandos de IOR. Para ver las cifras de rendimiento esperadas, consulta la descripción general de Parallelstore.

Rendimiento máximo desde una sola VM de 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"

Aquí:

  • ior: Es la comparativa real. Asegúrate de que esté disponible en la ruta de acceso o proporciona la ruta de acceso completa.
  • -ppn: Es la cantidad de procesos (tareas) que se deben ejecutar. Recomendamos comenzar con 1 y, luego, aumentar hasta la cantidad de CPU virtuales para lograr el máximo rendimiento aggregado.
  • -O useO_DIRECT=1: Fuerza el uso de E/S directa para omitir la caché de páginas y evitar leer datos almacenados en caché.
  • -genv LD_PRELOAD="/usr/lib64/libioil.so": Usa la biblioteca de intercepción de DAOS. Esta opción ofrece el mayor rendimiento sin procesar, pero pasa por alto la caché de páginas de Linux para los datos. Los metadatos aún se almacenan en caché.
  • -w: Realiza operaciones de escritura en archivos individuales.
  • -r: Realiza operaciones de lectura.
  • -e: Realiza fsync cuando se completan las operaciones de escritura.
  • -F: Usa archivos individuales.
  • -t "1m": Lee y escribe datos en fragmentos de tamaño especificado. Los tamaños de fragmentos más grandes proporcionan un mejor rendimiento de E/S de transmisión de subproceso único.
  • -b "8g": Es el tamaño de cada archivo.

IOPS máximos de una sola VM de 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"

Rendimiento máximo de un solo subproceso de la aplicación

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"

Latencia de E/S pequeña desde un solo subproceso de la aplicación

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"

Pruebas de rendimiento de varias VMs

Para alcanzar los límites de las instancias de Parallelstore, es importante probar la E/S agregada que se puede lograr con la E/S en paralelo de varias VMs. En las instrucciones de esta sección, se proporcionan detalles y comandos para hacerlo con mpirun y ior.

Consulta la guía de IOR para ver el conjunto completo de opciones que son útiles para probar en un conjunto más grande de nodos. Ten en cuenta que hay varias formas de iniciar VMs cliente para pruebas de varios clientes, como usar programadores como Batch, Slurm o los comandos masivos de Compute Engine. Además, el kit de herramientas de HPC puede ayudarte a compilar plantillas para implementar nodos de procesamiento.

En esta guía, se usan los siguientes pasos para implementar varias instancias de cliente configuradas para usar Parallelstore:

  1. Crea una clave SSH para usarla y configurar un usuario en cada VM cliente. Si se habilitó, debes inhabilitar el requisito de Acceso al SO en el proyecto.
  2. Obtén los puntos de acceso de la instancia de Parallelstore.
  3. Crea una secuencia de comandos de inicio para implementar en todas las instancias de cliente.
  4. Crea de forma masiva las VMs de Compute Engine con la secuencia de comandos de inicio y la clave.
  5. Copia las claves y los archivos de host necesarios para ejecutar las pruebas.

Los detalles de cada paso se encuentran en las siguientes secciones.

Configure las variables de entorno

Las siguientes variables de entorno se usan en los comandos de ejemplo de este documento:

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

Actualízalo a los valores que desees.

Crea una clave SSH

Crea una clave SSH y guárdala de forma local para que se distribuya a las VMs del cliente. La clave se asocia con el usuario de SSH especificado en las variables de entorno y se creará en 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"

Obtén detalles de la red de Parallelstore

Obtén las direcciones IP del servidor de Parallelstore en un formato que pueda consumir el agente de daos:

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

Obtén el nombre de la red asociada con la instancia de Parallelstore:

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

Crea la secuencia de comandos de inicio

La secuencia de comandos de inicio se adjunta a la VM y se ejecutará cada vez que se inicie el sistema. La secuencia de comandos de inicio hace lo siguiente:

  • Configura el agente de daos
  • Instala las bibliotecas requeridas
  • Activa tu instancia de Parallelstore en /tmp/parallelstore/ en cada VM.
  • Instala herramientas de prueba de rendimiento

Esta secuencia de comandos se puede usar para implementar tus aplicaciones personalizadas en varias máquinas. Edita la sección relacionada con el código específico de la aplicación en la secuencia de comandos.

La siguiente secuencia de comandos funciona en VMs que ejecutan 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

Crea las VMs de cliente

El rendimiento general de tus cargas de trabajo depende de los tipos de máquinas cliente. En el siguiente ejemplo, se usan VMs c2-standard-30. Modifica el valor machine-type para aumentar el rendimiento con NIC más rápidas. Consulta la guía de comparación y recursos de familias de máquinas para obtener detalles sobre los tipos de máquinas disponibles.

Para crear instancias de VM de forma masiva, usa el 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}

Cómo copiar llaves y archivos

  1. Recupera y guarda las direcciones IP privadas y públicas de todas las VMs.

    Cómo configurar

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

    IP públicas:

    gcloud compute instances list --filter="name ~ '^${CLIENT_PREFIX}*'" --format="csv[no-heading](EXTERNAL_IP)" > external_ips.txt
    
  2. Copia la clave privada para permitir el SSH sin contraseña entre nodos. Esto es necesario para la prueba de IOR con SSH para orquestar 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"
    
  3. Recupera la IP del primer nodo y copia la lista de IP internas en ese nodo. Este será el nodo principal de la ejecución de prueba.

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

Ejecuta comandos IOR en varias VMs

Conéctate al nodo principal con el usuario especificado:

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

Luego:

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

Rendimiento máximo desde varias VMs de cliente

Prueba el rendimiento en una situación de varios procesos y capacidad de procesamiento 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áximos de varias VMs de cliente

Prueba el rendimiento en una situación de IOPS máximos y varios procesos.

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"

Limpieza

  1. Desmonta el contenedor de DAOS:

    sudo umount /tmp/parallelstore/
    
  2. Borra la instancia de Parallelstore:

    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. Borra las VMs de Compute Engine: