本部分中的示例展示了我们建议使用 IOR 基准测试 (github) 工具评估性能的常用命令。
在安装 IOR 之前,需要先安装 MPI,以便在基准测试进程之间进行同步。我们建议为客户端虚拟机使用 HPC 映像,其中包含用于安装 Intel MPI 2021 的工具。对于 Ubuntu 客户端,我们建议使用 openmpi。
检查网络性能
在运行 IOR 之前,最好先确保您的网络具有预期的吞吐量。如果您有两个客户端虚拟机,则可以使用名为 iperf 的工具来测试它们之间的网络。
在两个虚拟机上安装 iperf:
HPC Rocky 8
sudo dnf -y install iperf
Ubuntu
sudo apt install -y iperf
在其中一个虚拟机上启动 iperf 服务器:
iperf -s -w 100m -P 30
在另一个虚拟机上启动 iperf 客户端:
iperf -c <IP ADDRESS OF iperf server VM> -w 100m -t 30s -P 30
观察虚拟机之间的网络吞吐量数值。如需实现最高的单客户端性能,请确保使用 Tier_1 网络。
单个虚拟机性能
以下说明提供了衡量单个虚拟机性能的步骤和基准。这些测试会在 Parallelstore 中运行多个 I/O 进程,目的是使网络接口卡 (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 概览。
单个客户端虚拟机的最大性能
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"
- 每个文件的大小
来自单个客户端虚拟机的 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"
多虚拟机性能测试
为了达到 Parallelstore 实例的上限,请务必测试通过多个虚拟机的并行 I/O 可实现的总 I/O。本部分中的说明提供了详细信息和命令,介绍了如何使用 mpirun 和 ior 执行此操作。
如需了解在更多节点上进行测试时有用的一整套选项,请参阅 IOR 指南。请注意,您可以通过多种方式启动客户端虚拟机以进行多客户端测试,包括使用 Batch、Slurm 等调度程序,或使用 Compute Engine 批量命令。此外,HPC Toolkit 还可以帮助构建模板来部署计算节点。
本指南将按照以下步骤部署配置为使用 Parallelstore 的多个客户端实例:
- 创建一个 SSH 密钥,以便在每个客户端虚拟机上设置用户。如果项目已启用 OS Login 要求,您必须停用该要求。
- 获取 Parallelstore 实例的接入点。
- 创建一个要部署到所有客户端实例的启动脚本。
- 使用启动脚本和密钥批量创建 Compute Engine 虚拟机。
- 复制运行测试所需的必要密钥和主机文件。
以下各部分介绍了每个步骤的详细信息。
设置环境变量
本文档中的示例命令使用了以下环境变量:
export SSH_USER="daos-user"
export CLIENT_PREFIX="daos-client-vm"
export NUM_CLIENTS=10
将这些值更新为所需的值。
创建 SSH 密钥
创建 SSH 密钥并将其保存到本地,以便分发给客户端虚拟机。该密钥与环境变量中指定的 SSH 用户相关联,并将在每个虚拟机上创建:
# 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}')
创建启动脚本
启动脚本会附加到虚拟机,并会在系统每次启动时运行。启动脚本会执行以下操作:
- 配置 daos 代理
- 安装所需的库
- 将 Parallelstore 实例挂载到每个虚拟机上的
/tmp/parallelstore/
- 安装性能测试工具
此脚本可用于将自定义应用部署到多台机器。修改脚本中与应用专用代码相关的部分。
以下脚本适用于运行 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
创建客户端虚拟机
工作负载的整体性能取决于客户端机器类型。以下示例使用 c2-standard-30
虚拟机;修改 machine-type
值可使用更快的 NIC 提高性能。如需详细了解可用机器类型,请参阅机器系列资源和比较指南。
如需批量创建虚拟机实例,请使用 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}
复制密钥和文件
检索并保存所有虚拟机的专用 IP 地址和公共 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}:~
在多个虚拟机上运行 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
通过多个客户端虚拟机实现最大性能
在多进程、最大吞吐量场景中测试性能。
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 上限
在多进程、最大 IOPS 场景中测试性能。
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 虚拟机: