このセクションの例では、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 をテストすることが重要です。このセクションの手順では、mpirun と ior を使用してこれを行う方法について詳しく説明します。
より多くのノードでテストするのに役立つオプションの一覧については、IOR ガイドをご覧ください。マルチクライアント テスト用のクライアント VM を起動する方法は、Batch や Slurm などのスケジューラを使用する方法や、Compute Engine 一括コマンドを使用する方法など、さまざまな方法があります。また、HPC Toolkit を使用して、コンピューティング ノードをデプロイするテンプレートを作成することもできます。
このガイドでは、次の手順で Parallelstore を使用するように構成された複数のクライアント インスタンスをデプロイします。
- 各クライアント VM でユーザーの設定に使用する SSH 認証鍵を作成します。プロジェクトで OS Login の要件を無効にする必要があります(有効になっている場合)。
- 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 アドレスを取得して保存します。
プライベート 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
マルチプロセス、最大 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 VM を削除します。