パフォーマンスをテストする

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

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

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

IOR を実行する前に、ネットワークに想定どおりのスループットがあることを確認することをおすすめします。2 つのクライアント 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 のパフォーマンスを測定する手順とベンチマークについて説明します。このテストでは、ネットワーク インターフェース カード(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"

1 つのアプリケーション スレッドによる最大パフォーマンス

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 ガイドをご覧ください。マルチクライアント テスト用のクライアント VM を起動する方法は、BatchSlurm などのスケジューラを使用する方法や、Compute Engine 一括コマンドを使用する方法など、さまざまな方法があります。また、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 エージェントを構成する
  • 必要なライブラリをインストールする
  • 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}

鍵とファイルをコピーする

  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 からの最大 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 VM を削除します。