測試效能

本節範例顯示我們建議使用的常見指令,可透過 IOR 基準測試 (github) 工具評估效能。

安裝 IOR 前,必須先安裝 MPI,才能在基準化程序之間進行同步。建議您使用用戶端 VM 的 HPC 映像檔,其中包含安裝 Intel MPI 2021 的工具。如果是 Ubuntu 用戶端,建議使用 openmpi。

檢查網路效能

執行 IOR 前,請先確認網路的輸送量是否符合預期。如果您有兩個用戶端 VM,可以使用 iperf 這項工具測試兩者之間的網路。

在兩個 VM 上安裝 iperf:

HPC Rocky 8

sudo dnf -y install iperf

Ubuntu

sudo apt install -y iperf

在其中一個 VM 上啟動 iperf 伺服器:

iperf -s -w 100m -P 30

在其他 VM 上啟動 iperf 用戶端:

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

觀察 VM 之間的網路總處理量。如要獲得最高單一用戶端效能,請務必使用 Tier_1 網路

單一 VM 效能

下列操作說明提供步驟和基準,可測量單一 VM 的效能。測試會將多個 I/O 程序傳入及傳出 Parallelstore,目的是要讓網路介面卡 (NIC) 達到飽和。

安裝 Intel MPI

HPC Rocky 8

sudo google_install_intelmpi --impi_2021

如要指定正確的 libfabric 網路堆疊,請在環境中設定下列變數:

export I_MPI_OFI_LIBRARY_INTERNAL=0

接著:

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

如要安裝 IOR,請按照下列步驟操作:

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

執行 IOR 指令

執行下列 IOR 指令。如要查看預期效能數據,請參閱 Parallelstore 總覽

單一用戶端 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"

其中:

  • ior:實際基準。確認該檔案位於路徑中,或提供完整路徑。
  • -ppn:要執行的程序 (工作) 數量。建議您先從 1 開始,然後逐步增加 vCPU 數量,以達到最高匯總效能。
  • -O useO_DIRECT=1:強制使用直接 I/O,略過頁面快取,避免讀取快取資料。
  • -genv LD_PRELOAD="/usr/lib64/libioil.so":使用 DAOS 攔截程式庫。這個選項可提供最高原始效能,但會略過 Linux 頁面快取資料。中繼資料仍會快取。
  • -w:對個別檔案執行寫入作業。
  • -r:執行讀取作業。
  • -e:寫入完成後執行 fsync。
  • -F:使用個別檔案。
  • -t "1m":以指定大小的區塊讀取及寫入資料。較大的區塊大小可提升單一執行緒的串流 I/O 效能。
  • -b "8g" - 每個檔案的大小

單一用戶端 VM 的 IOps 上限

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"

單一應用程式執行緒的最高效能

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"

單一應用程式執行緒的 I/O 延遲時間較短

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"

多個 VM 的效能測試

如要達到 Parallelstore 執行個體的上限,請務必測試多個 VM 的平行 I/O 可達成的匯總 I/O。本節的說明會詳細介紹如何使用 mpirunior 執行這項操作,並提供相關指令。

如需在較大的節點集上測試的完整選項集,請參閱 IOR 指南。請注意,啟動用戶端 VM 的方式有很多種,可使用 BatchSlurm 等排程器,或使用 Compute Engine 大量指令。此外,HPC Toolkit 可協助您建構範本,以部署運算節點。

本指南將透過下列步驟,部署多個設定為使用 Parallelstore 的用戶端執行個體:

  1. 建立 SSH 金鑰,用於在每個用戶端 VM 上設定使用者。如果專案已啟用 OS 登入功能,您必須停用這項功能
  2. 取得 Parallelstore 執行個體的存取點。
  3. 建立開機指令碼,部署至所有用戶端執行個體。
  4. 使用開機指令碼和金鑰,大量建立 Compute Engine VM。
  5. 複製執行測試所需的必要金鑰和主機檔案。

如需每個步驟的詳細資訊,請參閱以下各節。

設定環境變數

本文範例指令會使用下列環境變數:

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

將這些值更新為所需值。

建立 SSH 金鑰

建立 SSH 金鑰並儲存至本機,以便分配給用戶端 VM。金鑰會與環境變數中指定的 SSH 使用者建立關聯,並在每個 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"

取得 Parallelstore 網路詳細資料

以 daos 代理可使用的格式取得 Parallelstore 伺服器 IP 位址:

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

取得與 Parallelstore 執行個體相關聯的網路名稱:

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

建立開機指令碼

開機指令碼會附加至 VM,且每次系統啟動時都會執行。開機指令碼會執行下列作業:

  • 設定 daos 代理程式
  • 安裝必要程式庫
  • 將 Parallelstore 執行個體掛接至每個 VM 的 /tmp/parallelstore/
  • 安裝效能測試工具

這個指令碼可用於將自訂應用程式部署到多部電腦。 編輯指令碼中與應用程式專屬程式碼相關的部分。

下列指令碼適用於執行 HPC Rocky 8 的 VM。

# 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

建立用戶端 VM

工作負載的整體效能取決於用戶端機器類型。 以下範例使用 c2-standard-30 VM;請修改 machine-type 值,以更快的 NIC 提升效能。如要瞭解可用的機器類型,請參閱機器家族資源與比較指南

如要大量建立 VM 執行個體,請使用 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}

複製金鑰和檔案

  1. 擷取並儲存所有 VM 的私人和公開 IP 位址。

    私人 IP:

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

    公開 IP:

    gcloud compute instances list --filter="name ~ '^${CLIENT_PREFIX}*'" --format="csv[no-heading](EXTERNAL_IP)" > external_ips.txt
    
  2. 複製私密金鑰,允許節點間無密碼 SSH。使用 SSH 協調機器進行 IOR 測試時,必須執行這項操作。

    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. 擷取第一個節點的 IP,然後將內部 IP 清單複製到該節點。這會是測試執行的頭部節點。

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

在多個 VM 上執行 IOR 指令

以指定使用者身分連線至主要節點:

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

接著:

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

多個用戶端 VM 的最高效能

在多程序、總處理量上限的情境中測試效能。

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"

多個用戶端 VM 的 IOPS 上限

在多程序、最高 IOP 情境中測試效能。

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"

清除所用資源

  1. 卸載 DAOS 容器:

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