本節範例顯示我們建議使用的常見指令,可透過 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=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
刪除 Compute Engine VM: