テストのパフォーマンス

このセクションの例では、 パフォーマンスを評価する際におすすめの一般的なコマンドを、IOR ベンチマークgithub)ツールを使用して示します。

IOR をインストールする前に、ベンチマーク プロセス間で同期するために MPI をインストールする必要があります。クライアント VM には HPC イメージを使用することをおすすめします。これには、Intel MPI 2021 をインストールするためのツールが含まれています。Ubuntu クライアントの場合は、openmpi をおすすめします。

ネットワーク パフォーマンスを確認する

IOR を実行する前に、ネットワークに想定されるスループットがあることを確認するとよいでしょう。クライアント VM が 2 つある場合は、 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 のパフォーマンスを測定するための手順とベンチマークを示します。このテストでは、ネットワーク インターフェース カード(NIC)を飽和させることを目的として、Parallelstore との間で複数の I/O プロセスを実行します。

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 ガイド をご覧ください。 Batch、Slurm などのスケジューラを使用したり、Compute Engine の一括コマンドを使用したりするなど、マルチクライアント テスト用のクライアント VM を起動する方法はさまざまです。また、HPC Toolkit を使用すると、コンピューティング ノードをデプロイするための テンプレートを作成できます。

このガイドでは、次の手順で Parallelstore を使用するように構成された複数のクライアント インスタンスをデプロイします。

  1. 各クライアント VM にユーザーを設定するために使用する SSH 認証鍵を作成します。プロジェクトで OS Login の要件が有効になっている場合は、 無効にする 必要があります。
  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 エージェントを構成する
  • 必要なライブラリをインストールする
  • 各 VM の /tmp/parallelstore/ に 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 アドレスを取得して保存します。

    プライベート 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 からの最大 IOP

マルチプロセス、最大 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 を削除します。