0. 概要

ブロック・ボリューム は、以下の特徴からHPCクラスタやGPUクラスタのファイル共有ストレージとして使用するNFSサーバのストレージに最適なサービスです。

  • 同一 可用性ドメイン 内の異なる フォルト・ドメイン に複数のレプリカを持ち高い可用性を実現
  • ディスク装置にNVMe SSDを採用することで高いスループットとIOPSを実現

また、ベア・メタル・シェイプ BM.Optimized3.36 は、50 GbpsのTCP/IP接続用ポートを2個搭載し、それぞれをiSCSI接続の ブロック・ボリューム アクセス用途とNFSクライアントへのNFSサービス用途に割当てることで、コストパフォーマンスの高いNFSサーバ用インスタンスとして利用することが可能です。

OCIは、NFSのマネージドサービスである ファイル・ストレージ も提供していますが、本チュートリアルのように ブロック・ボリューム とベア・メタル・シェイプ BM.Optimized3.36 を使用してNFSでサービスするファイル共有ストレージ(以降ブロック・ボリュームNFSサーバと呼称)を構築することで、 ファイル・ストレージ よりも格段にコストパフォーマンスを引き上げることが出来ます。
ファイル・ストレージ とブロック・ボリュームNFSサーバの比較詳細は、 OCI HPCテクニカルTips集HPC/GPUクラスタ向けファイル共有ストレージの最適な構築手法 を参照してください。

本チュートリアルは、 GitHub のパブリックレポジトリ( tutorial_bvnfs )から公開されている Terraform スクリプトを リソース・マネージャ に読み込ませて作成する スタック を使用し、以下構成のNFSでサービスするファイル共有ストレージを自動構築(図中の Deployment target 範囲)した後、NFSファイルシステム性能をNFSクライアントから実行する IORmdtest で検証します。
この IORmdtest の検証結果は、 OCI HPCテクニカルTips集HPC/GPUクラスタ向けファイル共有ストレージの最適な構築手法2-1. コストパフォーマンスによる比較 を参照してください。

システム構成図

  構成 用途
ストレージ ブロック・ボリューム
Min. 1 TB Balanced x 15
ファイル共有ストレージ
ファイル格納領域
NFSサーバ BM.Optimized3.36 x 1
Oracle Linux 9.4
NFSサーバ
プライベートエンドポイント リソース・マネージャ
プライベートエンドポイント x 1
NFSサーバ構築スクリプトを配布・起動する
Terraform プロビジョナー用エンドポイント
NFSクライアント VM.Standard2.24 x 4
Oracle Linux 8.10
ファイルシステムベンチマーク用
NFSクライアント

本チュートリアルで作成するブロック・ボリュームNFSサーバ構築用の スタック は、適用すると以下の処理を行います。

  • 仮想クラウド・ネットワーク と関連するネットワークリソースの作成(※1)
  • ブロック・ボリューム の作成
  • NFSサーバ用インスタンスの作成
  • 作成した ブロック・ボリューム をNFSサーバにアタッチ
  • Terraform プロビジョナーでNFSサーバにSSHアクセスする際に使用するSSH鍵ペア作成・配布
  • Terraform のfileプロビジョナーでNFSサーバにNFSサーバ構成用スクリプト(※3)を配布
  • Terraform のremote-execプロビジョナーでNFSサーバ上でNFSサーバ構成用スクリプト(※3)を実行
  • 構築したNFSサーバのホスト名・IPアドレス出力

※1)既存の 仮想クラウド・ネットワーク を活用することも可能で、この場合はこの 仮想クラウド・ネットワーク が以下の条件を満たしているている必要があります。

  • NFSサーバ・NFSクライアント間接続用NFSプライベートサブネットが存在する(※2)
  • NFSサーバ・ ブロック・ボリューム 間iSCSI接続用Storageプライベートサブネットが存在する(※2)
  • NATゲートウェイサービス・ゲートウェイ が存在する
  • 各プライベートサブネットに NATゲートウェイサービス・ゲートウェイ へのルーティングを適切に設定した ルート・テーブル が紐づいている

※2)それぞれ独立したサブネットである必要があります。

※3)このスクリプト( nfssrv_configure.sh )は、NFSサーバのopcユーザのホームディレクトリに配置され、以下の処理を行います。

  • ブロック・ボリューム のストレージに
    • ボリュームグループを作成
    • 論理ボリュームをストライブ幅15(ブロック・ボリューム 数15に対応)で作成
    • XFSファイルシステムを作成
  • 作成したXFSファイルシステムを /mnt/bv にマウント
  • NFSサービスを以下の設定で起動
    • スレッド数64
    • /mnt/bv をworld writableでエクスポート

またこの スタック は、 cloud-init 設定ファイル( cloud-config )を含み、 cloud-init がNFSサーバの作成時に以下の処理を行います。

  • タイムゾーンをJSTに変更
  • firewalld 停止
  • SELinux 無効化

所要時間 : 約1時間

前提条件 : ブロック・ボリュームNFSサーバを収容するコンパートメント(ルート・コンパートメントでもOKです)の作成と、このコンパートメントに対する必要なリソース管理権限がユーザーに付与されていること。

注意 : 本コンテンツ内の画面ショットは、現在のOCIコンソール画面と異なっている場合があります。


1. 事前準備

1-0. 概要

本章は、ブロック・ボリュームNFSサーバを構築するにあたり事前に必要な以下リソースを作成します。

1-1. 構成ソース・プロバイダ作成

本章は、ひな型となる Terraform スクリプトを GitHub パブリックレポジトリから取り込むための 構成ソース・プロバイダ を作成します。

構成ソース・プロバイダ の作成は、 ここ を参照してください。

1-2. IAMポリシー作成

本章は、 スタック からブロック・ボリュームNFSサーバを作成するために必要な IAMポリシー を作成します。

OCIコンソールにログインし、 アイデンティティとセキュリティポリシー とメニューを辿ります。

次に、表示される以下 xxxxコンパートメント内のポリシー 画面で、 ポリシーの作成 ボタンをクリックします。
この際、 コンパートメント プルダウンメニューがブロック・ボリュームNFSサーバを作成する コンパートメント と異なる場合は、これを修正します。

画面ショット

次に、表示される以下 ポリシーの作成 画面で、各フィールドに以下の情報を入力し 作成 ボタンをクリックします。なお、ここに記載のないフィールドは、デフォルトのままとします。

  • 名前IAMポリシー に付与する名前
  • 説明IAMポリシー に付与する説明(用途等)
  • ポリシー・ビルダー : 作成する IAMポリシー を指定する以下構文( 手動エディタの表示 ボタンをクリックして表示)
allow service compute_management to use tag-namespace in compartment compartment_name
allow service compute_management to manage compute-management-family in compartment compartment_name
allow service compute_management to read app-catalog-listing in compartment compartment_name
allow group group_name to manage all-resources in compartment compartment_name

※1)コンパートメント 名は、自身のものに置き換えます。
※2)4行目の グループ 名は、自身のものに置き換えます。

画面ショット

1-3. スタック作成

本章は、ブロック・ボリュームNFSサーバを構築するための スタック を作成します。

OCIコンソールにログインし、ブロック・ボリュームNFSサーバを作成するリージョンを選択後、 開発者サービスリソース・マネージャスタック とメニューを辿ります。

次に、表示される以下画面で、スタックの作成 ボタンをクリックします。

画面ショット

次に、表示される以下 スタック情報 画面で、以下の情報を入力し、下部の ボタンをクリックします。

  • Terraformの構成のオリジン : ソース・コード制御システム
  • ソースコード管理タイプ : GitHub
  • 構成ソース・プロバイダ : 先に作成した 構成ソース・プロバイダ
  • リポジトリ : tutorial_bvnfs
  • ブランチ : master
  • 名前 : スタックに付与する名前(任意)
  • 説明 : スタックに付与する説明(任意)

画面ショット

次に、表示される 変数の構成 画面で、各画面フィールドに以下の情報を入力し、下部の ボタンをクリックします。

  • General options フィールド
    • Compartment : ブロック・ボリュームNFSサーバを作成する コンパートメント
    • Availability Domain : ブロック・ボリュームNFSサーバを作成する 可用性ドメイン
    • SSH public key : NFSサーバにログインする際使用するSSH秘密鍵に対応する公開鍵
      (公開鍵ファイルのアップロード( SSHキー・ファイルの選択 )と公開鍵のフィールドへの貼り付け( SSHキーの貼付け )が選択可能)
    • Use existing VCN : 既存の 仮想クラウド・ネットワーク を使用するかどうかを指定(デフォルト: 仮想クラウド・ネットワーク を新規作成)
      (既存の 仮想クラウド・ネットワーク を使用する場合は、チェックすると表示されるVCN・Storageサブネット・NFSサブネットの各フィールドにOCIDを指定します。)

画面ショット

  • Block volume options フィールド
    • Block volume total size : ブロック・ボリューム の総容量(最低:15,000GB)

画面ショット

次に、表示される 確認 画面で、これまでの設定項目が意図したものになっているかを確認し、以下 作成されたスタックで適用を実行しますか。 フィールドの 適用の実行 をチェックオフし、下部の 作成 ボタンをクリックします。

画面ショット

ここで 適用の実行 をチェックした場合、 作成 ボタンのクリックと同時に スタック の適用が開始され、ブロック・ボリュームNFSサーバの構築が始まりますが、このチュートリアルでは後の章で改めて スタック の適用を行います。

これで、以下画面のとおりブロック・ボリュームNFSサーバ構築用 スタック が作成されました。

画面ショット


2.ブロック・ボリュームNFSサーバ構築

本章は、先に作成した スタック を使用し、ブロック・ボリュームNFSサーバを構築します。

以下 スタックの詳細 画面で、 適用 ボタンをクリックします。

画面ショット

次に、表示される以下 適用 サイドバーで、 適用 ボタンをクリックします。

画面ショット

次に、表示される以下 ジョブ詳細 ウィンドウで、左上のステータスが 受入れ済進行中 と遷移すれば、 スタック の適用が実施されています。

画面ショット

表示される以下 ログ フィールドで、リソースの作成状況を確認します。

画面ショット

この適用が完了するまでの所要時間は、5分程度です。

ステータスが 成功 となれば、ブロック・ボリュームNFSサーバの作成が完了しており、以下のように ログ フィールドの最後にNFSサーバのホスト名とIPアドレスが出力されます。

Outputs:
NFS_server_instances_created = {
  "display_name" = "nfs-srv"
  "private_ip  " = "10.0.3.206"
}

3. ブロック・ボリュームNFSサーバ確認

3-0. 概要

本章は、作成されたブロック・ボリュームNFSサーバ環境を確認します。

3-1. NFSサーバログイン

NFSサーバは、プライベートサブネットに接続されているため、パブリックサブネットに接続されているBastionノードや、プライベートサブネットに接続するインスタンスへのSSH接続を提供する 要塞 を使用し、構築時に指定したSSH公開鍵に対応する秘密鍵を使用してopcユーザでSSHログインします。

3-2. cloud-init完了確認

cloud-init は、NFSサーバが起動してSSHログインできる状態であっても、その処理が継続している可能性があるため、以下コマンドをNFSサーバのopcユーザで実行し、そのステータスが done となっていることで cloud-init の処理完了を確認します。

$ cloud-init status
status: done
$

ステータスが running の場合は、 cloud-init の処理が継続中のため、処理が完了するまで待ちます。

3-3. NFSサーバOS再起動

以下コマンドをNFSサーバのopcユーザで実行し、OSを再起動します。

$ sudo shutdown -r now

3-4. NFSサーバファイルシステム確認

以下コマンドをNFSサーバのopcユーザで実行し、 ブロック・ボリューム 上に作成したファイルシステムが /mnt/bv にマウントされ、そのサイズが指定したものになっていることを確認します。

$ df -h /mnt/bv
Filesystem         Size  Used Avail Use% Mounted on
/dev/mapper/bv-bv  xxxT  xxxG  xxxT   x% /mnt/bv
$

3-5. NFSサーバNFSサービス確認

以下コマンドをNFSサーバのopcユーザで実行し、NFSサービスが起動しており ブロック・ボリューム 上に作成したファイルシステム( /mnt/bv )がエクスポートされていることを確認します。

$ systemctl status nfs-server.service
● nfs-server.service - NFS server and services
     Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; preset: disabled)
    Drop-In: /run/systemd/generator/nfs-server.service.d
             └─order-with-mounts.conf
     Active: active (exited) since Thu 2024-10-03 12:22:18 JST; 2h 29min ago
       Docs: man:rpc.nfsd(8)
             man:exportfs(8)
   Main PID: 18857 (code=exited, status=0/SUCCESS)
        CPU: 29ms

Oct 03 12:22:18 nfs-srv systemd[1]: Starting NFS server and services...
Oct 03 12:22:18 nfs-srv exportfs[18779]: exportfs: No host name given with /mnt/bv (rw,sync,no_root_squa>
Oct 03 12:22:18 nfs-srv systemd[1]: Finished NFS server and services.
$ sudo exportfs
/mnt/bv       	<world>
$

4. NFSクライアント設定

本章は、NFSサーバでエクスポートしている /mnt/bv をNFSクライアントでマウントします。

以下コマンドをNFSクライアントのopcユーザで実行し、NFSサーバでエクスポートされている /mnt/bv/mnt/nfs としてNFSマウントします。
なお、コマンド中の nfs_server_ip は、自身のNFSサーバのNFSプライベートサブネット側のIPアドレスにに置き換えます。

$ echo "nfs_server_ip:/mnt/bv /mnt/nfs nfs vers=3,defaults,noatime,nodiratime,bg,timeo=100,ac,actimeo=120,nocto,rsize=1048576,wsize=1048576,nolock,local_lock=none,proto=tcp,sec=sys,_netdev 0 0" | sudo tee -a /etc/fstab
$ sudo systemctl daemon-reload
$ sudo mkdir -p /mnt/nfs
$ sudo mount /mnt/nfs

5. ファイルシステムベンチマーク

5-0. ファイルシステムベンチマーク概要

本章は、ファイルシステムベンチマークツールである IORmdtest をNFSクライアントからNFSファイルシステム領域に対して実行し、その性能を検証します。

IORmdtestは、複数のNFSクライアントからベンチマークを実行する際のNFSクライアント間通信にMPIを使用します。ここでは、 OpenMPI を使用します。

またここで使用する IORmdtest は、 IO500 に含まれるものを使用します。

以上より、本章で実施するファイルシステムベンチマークは、以下の手順を経て行います。

  • NFSクライアント用インスタンス作成
  • OpenMPI インストール
  • IO500 インストール
  • ファイルシステムベンチマーク実行

5-1. NFSクライアント用インスタンス作成

NFSクライアントとして使用する以下のインスタンスを作成します。

  • シェイプ : VM.Standard2.24
  • OS : Oracle Linux 8.10(Oracle-Linux-8.10-2024.08.29-0 UEK)
  • インスタンス数 :4
  • 接続サブネット :NFSプライベートサブネット

次に、これら4ノードのNFSクライアントで、 4. NFSクライアント設定 の手順に従い、ブロック・ボリュームNFSサーバのストレージをNFSマウントします。

5-2. OpenMPIインストール

OCI HPCテクニカルTips集Slurm環境での利用を前提とするOpenMPI構築方法 に従い、4ノードのNFSクライアントに OpenMPI をインストールします。

次に、NFSクライアントのうちのどれか1ノードにopcユーザでSSHログインし、以下のように4ノードのNFSクライアントのホスト名を含むファイルを /mnt/nfs/io500 ディレクトリに作成、これを使用してOpenMPIの稼働確認を行います。

$ pwd
/mnt/nfs/io500
$ cat ./hostlist.txt 
inst-mf3vw-nfscli
inst-ph77v-nfscli
inst-lbjs1-nfscli
inst-2cxtz-nfscli
$ mpirun -n 4 -N 1 -hostfile ./hostlist.txt /bin/hostname
inst-mf3vw-nfscli
inst-ph77v-nfscli
inst-2cxtz-nfscli
inst-lbjs1-nfscli
$

5-3. IO500インストール

以下コマンドをNFSクライアントのうちのどれか1ノードのopcユーザで実行し、IO500を /mnt/nfs/io500/io500 ディレクトリににインストールします。

$ sudo yum install -y git autoconf automake
$ pwd
/mnt/nfs/io500
$ git clone https://github.com/IO500/io500.git -b io500-isc20
$ cd io500
$ ./prepare.sh

5-4. ファイルシステムベンチマーク実行

IORmdtest を実行する以下のスクリプトを /mnt/nfs/io500/io500_easy.sh として作成し、これに実行権を与えます。

#!/bin/bash
MPI_HOSTFILE=/mnt/nfs/io500/hostlist.txt
IO500_BIN_PATH=/mnt/nfs/io500/io500/bin
IO500_DATA_DIR=/mnt/nfs/io500/datafiles
# Set the number of times to repeat each test for mdtest and ior
rep_count=3
# Set MPI parameter from arguments
if [[ "$1" =~ ^[0-9]+$ && "$2" =~ ^[0-9]+$ ]]; then
  num_proc_total=$1
  num_proc_pnode=$2
else
  echo "Specify num. of MPI total processes as 1st argument and num. of processes per node as 2nd argument."
  exit 1
fi
# mdtest easy write
for i in `seq 1 $rep_count`
do
  name="try"$i
  echo "### Starting mdtest easy write $name"
  mkdir -p $IO500_DATA_DIR/$name/mdt_easy
  date '+%Y/%m/%d %T'
  mpiexec --mca btl_base_warn_component_unused 0 --mca pml ob1 -np $num_proc_total -npernode $num_proc_pnode -hostfile $MPI_HOSTFILE $IO500_BIN_PATH/mdtest -Y -C -F -P -d $IO500_DATA_DIR/$name/mdt_easy -n 1000000 -u -L -a POSIX -x $IO500_DATA_DIR/$name/mdt_easy-stonewall -N 1 -W 300
done
# IOR easy write
for i in `seq 1 $rep_count`
do
  name="try"$i
  echo "### Starting IOR easy write $name"
  mkdir -p $IO500_DATA_DIR/$name/ior_easy
  date '+%Y/%m/%d %T'
  mpiexec --mca btl_base_warn_component_unused 0 --mca pml ob1 -np $num_proc_total -npernode $num_proc_pnode -hostfile $MPI_HOSTFILE $IO500_BIN_PATH/ior -w  -a POSIX -t 2m -v -b 9920000m -F -i 1 -C -Q 1 -g -G 27 -k -e -o $IO500_DATA_DIR/$name/ior_easy -O stoneWallingStatusFile=$IO500_DATA_DIR/$name/stonewall -O stoneWallingWearOut=1 -D 300
done
# IOR easy read
for i in `seq 1 $rep_count`
do
  name="try"$i
  echo "### Starting IOR easy read $name"
  date '+%Y/%m/%d %T'
  mpiexec --mca btl_base_warn_component_unused 0 --mca pml ob1 -np $num_proc_total -npernode $num_proc_pnode -hostfile $MPI_HOSTFILE $IO500_BIN_PATH/ior -r -R  -a POSIX -t 2m -v -b 9920000m -F -i 1 -C -Q 1 -g -G 27 -k -e -o $IO500_DATA_DIR/$name/ior_easy -O stoneWallingStatusFile=$IO500_DATA_DIR/$name/stonewall
done
# mdtest easy stat
for i in `seq 1 $rep_count`
do
  name="try"$i
  echo "### Starting mdtest easy stat $name"
  date '+%Y/%m/%d %T'
  mpiexec --mca btl_base_warn_component_unused 0 --mca pml ob1 -np $num_proc_total -npernode $num_proc_pnode -hostfile $MPI_HOSTFILE $IO500_BIN_PATH/mdtest -T -F -P -d $IO500_DATA_DIR/$name/mdt_easy -n 1000000 -u -L -a POSIX -x $IO500_DATA_DIR/$name/mdt_easy-stonewall -N 1
done
# mdtest easy delete
for i in `seq 1 $rep_count`
do
  name="try"$i
  echo "### Starting mdtest easy delete $name"
  date '+%Y/%m/%d %T'
  mpiexec --mca btl_base_warn_component_unused 0 --mca pml ob1 -np $num_proc_total -npernode $num_proc_pnode -hostfile $MPI_HOSTFILE $IO500_BIN_PATH/mdtest -r -F -P -d $IO500_DATA_DIR/$name/mdt_easy -n 1000000 -u -L -a POSIX -x $IO500_DATA_DIR/$name/mdt_easy-stonewall -N 1
done
date '+%Y/%m/%d %T'

このスクリプトは、 mdtest のcreate, stat, deleteと IOR のwrite, readを各3回実行し、NFSファイルシステムのメタデータ性能とスループット性能を計測します。

次に、以下コマンドをNFSクライアントのうちの1ノードのopcユーザで実行し、スクリプトの出力から性能値を確認します。
この実行に要する時間は、一時間程度です。

$ pwd
/mnt/nfs/io500
$ ./io500_easy.sh 16 4

6. スタックの破棄

本章は、 スタック を破棄することで、構築したブロック・ボリュームNFSサーバ環境を削除します。

以降の手順を実施すると、本チュートリアルで作成したOCI上のリソースをすべて削除することになるため、 ブロック・ボリューム上に作成したファイルが全て消失 します。

以下 スタックの詳細 画面で、 破棄 ボタンをクリックします。

画面ショット

次に、表示される以下 破棄 サイドバーで、 破棄 ボタンをクリックします。

画面ショット

次に、表示される以下 ジョブ詳細 ウィンドウで、左上のステータスが 受入れ済進行中 と遷移すれば、 スタック の破棄が実施されています。

画面ショット

表示される以下 ログ フィールドで、リソースの削除状況を確認します。

画面ショット

この破棄が完了するまでの所要時間は、3分程度です。

ステータスが 成功 となれば、ブロック・ボリュームNFSサーバ環境の削除が完了しています。

これで、このチュートリアルは終了です。

更新日時: