Menguji performa

Contoh di bagian ini menunjukkan perintah umum yang kami rekomendasikan untuk mengevaluasi performa menggunakan alat benchmark IOR (github).

Sebelum menginstal IOR, MPI harus diinstal untuk sinkronisasi antara proses benchmark. Sebaiknya gunakan Image HPC untuk VM klien, yang mencakup alat untuk menginstal Intel MPI 2021. Untuk klien Ubuntu, sebaiknya gunakan openmpi.

Memeriksa performa jaringan

Sebelum menjalankan IOR, sebaiknya pastikan jaringan Anda memiliki throughput yang diharapkan. Jika memiliki dua VM klien, Anda dapat menggunakan alat yang disebut iperf untuk menguji jaringan di antara keduanya.

Instal iperf di kedua VM:

HPC Rocky 8

sudo dnf -y install iperf

Ubuntu

sudo apt install -y iperf

Mulai server iperf di salah satu VM Anda:

iperf -s -w 100m -P 30

Mulai klien iperf di VM lain:

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

Amati jumlah throughput jaringan antar-VM. Untuk performa satu klien tertinggi, pastikan jaringan Tingkat_1 digunakan.

Performa VM tunggal

Petunjuk berikut memberikan langkah-langkah dan benchmark untuk mengukur performa VM tunggal. Pengujian ini menjalankan beberapa proses I/O ke dalam dan ke luar Parallelstore dengan tujuan memenuhi kartu antarmuka jaringan (NIC).

Menginstal Intel MPI

HPC Rocky 8

sudo google_install_intelmpi --impi_2021

Untuk menentukan stack jaringan libfabric yang benar, tetapkan variabel berikut di lingkungan Anda:

export I_MPI_OFI_LIBRARY_INTERNAL=0

Setelah itu:

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

Menginstal IOR

Untuk menginstal IOR:

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

Menjalankan perintah IOR

Jalankan perintah IOR berikut. Untuk melihat perkiraan angka performa, lihat Ringkasan Parallelstore.

Performa maksimum dari satu VM klien

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"

Dengan keterangan:

  • ior: benchmark sebenarnya. Pastikan file tersebut tersedia di jalur atau berikan jalur lengkap.
  • -ppn: jumlah proses (tugas) yang akan dijalankan. Sebaiknya mulai dengan 1, lalu tingkatkan hingga jumlah vCPU untuk mencapai performa agregat maksimum.
  • -O useO_DIRECT=1: memaksa penggunaan I/O langsung untuk mengabaikan cache halaman dan menghindari membaca data dalam cache.
  • -genv LD_PRELOAD="/usr/lib64/libioil.so": menggunakan library intersepsi DAOS. Opsi ini memberikan performa mentah tertinggi, tetapi mengabaikan cache halaman Linux untuk data. Metadata masih di-cache.
  • -w: Melakukan operasi tulis ke setiap file.
  • -r: Melakukan operasi baca.
  • -e: Melakukan fsync setelah penulisan selesai.
  • -F: Menggunakan file individual.
  • -t "1m": Membaca dan menulis data dalam potongan dengan ukuran yang ditentukan. Ukuran potongan yang lebih besar menghasilkan performa I/O streaming thread tunggal yang lebih baik.
  • -b "8g" - ukuran setiap file

IOps maksimum dari satu VM klien

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"

Performa maksimum dari satu thread aplikasi

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"

Latensi I/O kecil dari satu thread aplikasi

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"

Pengujian performa multi-VM

Untuk mencapai batas instance Parallelstore, Anda harus menguji I/O gabungan yang dapat dicapai dengan I/O paralel dari beberapa VM. Petunjuk di bagian ini memberikan detail dan perintah tentang cara melakukannya menggunakan mpirun dan ior.

Lihat panduan IOR untuk mengetahui kumpulan lengkap opsi yang berguna untuk diuji pada kumpulan node yang lebih besar. Perhatikan bahwa ada berbagai cara untuk meluncurkan VM klien untuk pengujian multi-klien dari penggunaan penjadwal seperti Batch, Slurm, atau menggunakan perintah massal Compute Engine. Selain itu, HPC Toolkit dapat membantu membuat template untuk men-deploy node komputasi.

Panduan ini menggunakan langkah-langkah berikut untuk men-deploy beberapa instance klien yang dikonfigurasi untuk menggunakan Parallelstore:

  1. Buat kunci SSH yang akan digunakan untuk menyiapkan pengguna di setiap VM klien. Anda harus menonaktifkan persyaratan Login OS pada project jika telah diaktifkan.
  2. Mendapatkan titik akses instance Parallelstore.
  3. Buat skrip startup untuk di-deploy ke semua instance klien.
  4. Membuat VM Compute Engine secara massal menggunakan kunci dan skrip startup.
  5. Salin kunci dan file host yang diperlukan untuk menjalankan pengujian.

Detail untuk setiap langkah ada di bagian berikut.

Menetapkan variabel lingkungan

Variabel lingkungan berikut digunakan dalam contoh perintah dalam dokumen ini:

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

Perbarui nilai ini ke nilai yang Anda inginkan.

Membuat kunci SSH

Buat kunci SSH dan simpan secara lokal untuk didistribusikan ke VM klien. Kunci ini dikaitkan dengan pengguna SSH yang ditentukan dalam variabel lingkungan, dan akan dibuat di setiap 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"

Mendapatkan detail jaringan Parallelstore

Dapatkan alamat IP server Parallelstore dalam format yang dapat digunakan oleh agen daos:

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

Dapatkan nama jaringan yang terkait dengan instance Parallelstore:

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

Membuat skrip startup

Skrip startup dilampirkan ke VM dan akan dijalankan setiap kali sistem dimulai. Skrip startup akan melakukan hal berikut:

  • Mengonfigurasi agen daos
  • Menginstal library yang diperlukan
  • Memasang instance Parallelstore ke /tmp/parallelstore/ di setiap VM
  • Menginstal alat pengujian performa

Skrip ini dapat digunakan untuk men-deploy aplikasi kustom Anda ke beberapa komputer. Edit bagian yang terkait dengan kode khusus aplikasi dalam skrip.

Skrip berikut berfungsi di VM yang menjalankan 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

Membuat VM klien

Performa keseluruhan workload Anda bergantung pada jenis mesin klien. Contoh berikut menggunakan VM c2-standard-30; ubah nilai machine-type untuk meningkatkan performa dengan NIC yang lebih cepat. Lihat Panduan perbandingan dan resource kelompok mesin untuk mengetahui detail jenis mesin yang tersedia.

Untuk membuat instance VM secara massal, gunakan perintah 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}

Menyalin kunci dan file

  1. Mengambil dan menyimpan alamat IP pribadi dan publik untuk semua VM.

    IP Pribadi:

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

    IP publik:

    gcloud compute instances list --filter="name ~ '^${CLIENT_PREFIX}*'" --format="csv[no-heading](EXTERNAL_IP)" > external_ips.txt
    
  2. Salin kunci pribadi untuk mengizinkan SSH tanpa sandi antar-node. Hal ini diperlukan untuk pengujian IOR yang menggunakan SSH untuk mengatur mesin.

    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. Ambil IP node pertama, lalu salin daftar IP internal ke node tersebut. Ini akan menjadi node head untuk pengujian yang dijalankan.

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

Menjalankan perintah IOR di beberapa VM

Hubungkan ke node head dengan pengguna yang ditentukan:

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

Setelah itu:

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

Performa maksimal dari beberapa VM klien

Uji performa dalam skenario throughput maksimum multiproses.

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"

IOP maksimum dari beberapa VM klien

Uji performa dalam skenario multiproses, IOP maksimum.

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"

Pembersihan

  1. Lepaskan container DAOS:

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