本節範例顯示我們建議使用的常見指令,可透過 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。本節的說明會詳細介紹如何使用 mpirun 和 ior 執行這項操作,並提供相關指令。
如需在較大的節點集上測試的完整選項集,請參閱 IOR 指南。請注意,啟動用戶端 VM 的方式有很多種,可使用 Batch、Slurm 等排程器,或使用 Compute Engine 大量指令。此外,HPC Toolkit 可協助您建構範本,以部署運算節點。
本指南將透過下列步驟,部署多個設定為使用 Parallelstore 的用戶端執行個體:
- 建立 SSH 金鑰,用於在每個用戶端 VM 上設定使用者。如果專案已啟用 OS 登入功能,您必須停用這項功能。
- 取得 Parallelstore 執行個體的存取點。
- 建立開機指令碼,部署至所有用戶端執行個體。
- 使用開機指令碼和金鑰,大量建立 Compute Engine VM。
- 複製執行測試所需的必要金鑰和主機檔案。
如需每個步驟的詳細資訊,請參閱以下各節。
設定環境變數
本文範例指令會使用下列環境變數:
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}
複製金鑰和檔案
擷取並儲存所有 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複製私密金鑰,允許節點間無密碼 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"擷取第一個節點的 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"
清除所用資源
卸載 DAOS 容器:
sudo umount /tmp/parallelstore/刪除 Parallelstore 執行個體:
gcloud CLI
gcloud beta parallelstore instances delete INSTANCE_NAME --location=LOCATIONREST
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刪除 Compute Engine VM: