测试效果

本部分中的示例展示了我们建议使用 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。本部分中的说明提供了详细信息和命令,介绍了如何使用 mpirunior 执行此操作。

如需了解在更多节点上进行测试时有用的一整套选项,请参阅 IOR 指南。请注意,您可以通过多种方式启动客户端虚拟机以进行多客户端测试,包括使用 BatchSlurm 等调度程序,或使用 Compute Engine 批量命令。此外,HPC Toolkit 还可以帮助构建模板来部署计算节点。

本指南将按照以下步骤部署配置为使用 Parallelstore 的多个客户端实例:

  1. 创建一个 SSH 密钥,以便在每个客户端虚拟机上设置用户。如果项目已启用 OS Login 要求,您必须停用该要求
  2. 获取 Parallelstore 实例的接入点。
  3. 创建一个要部署到所有客户端实例的启动脚本。
  4. 使用启动脚本和密钥批量创建 Compute Engine 虚拟机。
  5. 复制运行测试所需的必要密钥和主机文件。

以下各部分介绍了每个步骤的详细信息。

设置环境变量

本文档中的示例命令使用了以下环境变量:

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}

复制密钥和文件

  1. 检索并保存所有虚拟机的专用 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
    
  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}:~
    

在多个虚拟机上运行 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"

清理

  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 虚拟机: