概要
本記事では、IORを使い、ファイルI/Oの性能測定する方法を書きます。
IORとは
以下、IORのGitHubから引用。
IOR can be used for testing performance of parallel file systems
using various interfaces and access patterns.
IOR uses MPI for process synchronization.
日本語訳:
IORは種々のインターフェイスとアクセスパターンを発行することができ、並列ファイルシステムのパフォーマンス(I/O性能)を測定することができます。
IOR はプロセスの同期にMPIを使用します。
どのようなところで使われているか?
以下のような場面で使用されています。
上記のように、様々なところでI/O測定に使われています。
環境
本記事では、IORのビルド~動作確認まで行います。
ビルド、動作確認に使ったマシン構成は以下の通りです。
ホスト環境
- CPU:Intel(R) Core(TM) i5-7600 CPU @ 3.50GHz
- Memory:24GB
- NIC:Intel X520-DA1 (10G)
- OS:Ubuntu 20.04.3 LTS
サーバ環境 (ファイル設備)
ホスト環境に以下のシステムをNFSでマウントしています。
マウント先は/mnt/ext/IOR。
- Synology DS1621+ RAID5(SATA HDD 5400RPM 4台)
- メモリ:24GB
- NIC:Intel X520-DA1 (10G)
ネットワークまわり
- ルータ:YAMAHA RTX830
- スイッチ:Allied Telesis AT-x510-28GTX
環境準備方法
Step1 Open MPIインストール
Open MPIのサイトからソースコードをダウンロード&解凍し、以下のような手順でビルドします。
$ wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.4.tar.gz
$ tar zxfv openmpi-4.1.4.tar.gz
$ cd openmpi-4.1.4
$ ./configure --prefix=<任意のDIR>
$ make
$ make install
$ sudo make install
.bashrcに以下を書き込み、パスを通します。
PATH=/<任意のDIR>/bin:$PATH
LD_LIBRARY_PATH=/<任意のDIR>/lib:$LD_LIBRARY_PATH
MANPATH=/<任意のDIR>/share/man:$MANPATH
export PATH LD_LIBRARY_PATH MANPATH
以下のコマンドを実行し、パスを通す。
$ source .bashrc
Step2 IORインストール
gitからソースコードを持ってきて、ビルドします。
$ git clone https://github.com/hpc/ior.git
$ cd ior
$ ./bootstrap
$ ./configure --prefix=<任意のDIR>
$ make
$ make install
.bashrcに以下を書き込み、パスを通します。
PATH=/home/pt2/ior/bin:$PATH
LD_LIBRARY_PATH=/home/pt2/ior/lib:$LD_LIBRARY_PATH
MANPATH=/home/pt2/ior/share/man:$MANPATH
export PATH LD_LIBRARY_PATH MANPATH
以下のコマンドを実行し、パスを通す。
$ source .bashrc
IOR実行方法
IORを使って実際にファイルI/O性能を測定してみます。
本記事ではfile-per-process、single-shared-fileについて説明します。
file-per-process
各Rankが別々のファイルにアクセスするパターンです。(下図参照)
コマンド例(Cache I/Oの測定)は以下です。
# mpiexec -n 1 ior -a POSIX -F -w -r -e -t 1m -b 32g -i 3 -d 1 -C -o /mnt/ext/IOR/
-n 1 : 1多重
-a POSIX : POSIX使用
-F : file-per-process
-w : 書き込み性能測定
-r : 読み込み性能測定
-e : POSIX書き込みクローズ時にfsyncを実行する。
-t 1m : I/O長1Mbyte
-b 32g : ファイルサイズ32GB
-i 3 : 試行回数3回
-d 1 : 試行回数間の遅延時間
-C : リードバックのタスク順序をn+1順序に変更する。(それぞれのプロセスが別ノードのプロセスから書き込まれたデータを参照するようにする。)
-o /mnt/ext/IOR/ : ファイル出力先を/mnt/ext/IOR/にする。
(参考:DirectI/Oの測定は以下になります)
# mpiexec -n 1 ior -a POSIX -F -w -r -e -t 1m -b 32g -i 3 -d 1 -C --posix.odirect -o /mnt/ext/IOR/
single-shared-file
各ランクが同じファイルの別々の領域にアクセスするパターンです。(下図参照)
コマンド例は以下です。
# mpiexec -n 1 ior -a POSIX -w -r -e -t 1m -b 32g -i 3 -d 1 -C -o /mnt/ext/IOR/
-n 1 : 1多重
-a POSIX : POSIX使用
-Fなし : single-shared-file
-w : 書き込み性能測定
-r : 読み込み性能測定
-e : POSIX書き込みクローズ時にfsyncを実行する。
-t 1m : I/O長1Mbyte
-b 32g : ファイルサイズ32GB
-i 3 : 試行回数3回
-d 1 : 試行回数間の遅延時間
-C : リードバックのタスク順序をn+1順序に変更する。(それぞれのプロセスが別ノードのプロセスから書き込まれたデータを参照するようにする。)
-o /mnt/ext/IOR/ : ファイル出力先を/mnt/ext/IOR/にする。
(参考:DirectI/Oの測定は以下になります)
# mpiexec -n 1 ior -a POSIX -w -r -e -t 1m -b 32g -i 3 -d 1 -C --posix.odirect -o /mnt/ext/IOR/
まとめ
本記事では以下を説明しました。
- IORについて
- IORのビルド方法
- IOR実行方法
次回は実際にファイルシステムの測定を行い、その測定結果について考察していきたいと考えています。
参考
IORの出力結果
測定条件(Cache I/O)
Path : /mnt/ext/IOR/
api : POSIX
access : file-per-process
type : independent
segments : 1
ordering in a file : sequential
ordering inter file : constant task offset
task offset : 1
nodes : 1
tasks : 1
clients per node : 1
repetitions : 3
xfersize : 1 MiB
blocksize : 32 GiB
aggregate filesize : 32 GiB
コマンド:mpiexec -n 1 ior -a POSIX -F -w -r -e -t 1m -b 32g -i 3 -d 1 -C -o /mnt/ext/IOR/
IOR-3.4.0+dev: MPI Coordinated Test of Parallel I/O
Began : Sat Dec 17 22:28:48 2022
Command line : ior -a POSIX -F -w -r -e -t 1m -b 32g -i 3 -d 1 -C -o /mnt/ext/IOR/
Machine : Linux pt2
TestID : 0
StartTime : Sat Dec 17 22:28:48 2022
Path : /mnt/ext/IOR/.00000000
FS : 5.2 TiB Used FS: 27.7% Inodes: 0.0 Mi Used Inodes: -nan%
Options:
api : POSIX
apiVersion :
test filename : /mnt/ext/IOR/
access : file-per-process
type : independent
segments : 1
ordering in a file : sequential
ordering inter file : constant task offset
task offset : 1
nodes : 1
tasks : 1
clients per node : 1
repetitions : 3
xfersize : 1 MiB
blocksize : 32 GiB
aggregate filesize : 32 GiB
Results:
access bw(MiB/s) IOPS Latency(s) block(KiB) xfer(KiB) open(s) wr/rd(s) close(s) total(s) iter
------ --------- ---- ---------- ---------- --------- -------- -------- -------- -------- ----
write 169.07 169.07 0.005915 33554432 1024.00 0.000631 193.81 0.000009 193.81 0
read 138.75 138.75 0.007207 33554432 1024.00 0.000653 236.16 0.000017 236.16 0
write 169.52 169.52 0.005899 33554432 1024.00 0.000585 193.29 0.000012 193.29 1
read 140.11 140.11 0.007137 33554432 1024.00 0.000842 233.87 0.000015 233.87 1
write 167.03 167.03 0.005987 33554432 1024.00 0.000337 196.18 0.000010 196.18 2
read 136.59 136.59 0.007321 33554432 1024.00 0.000832 239.90 0.000017 239.90 2
Summary of all tests:
Operation Max(MiB) Min(MiB) Mean(MiB) StdDev Max(OPs) Min(OPs) Mean(OPs) StdDev Mean(s) Stonewall(s) Stonewall(MiB) Test# #
write 169.52 167.03 168.54 1.09 169.52 167.03 168.54 1.09 194.43052 NA NA 0
read 140.11 136.59 138.48 1.45 140.11 136.59 138.48 1.45 236.64573 NA NA 0
Finished : Sat Dec 17 22:50:36 2022