IORを使ったファイルI/O性能測定

# 概要
本記事では、[IOR](https://github.com/hpc/ior)を使い、ファイルI/Oの性能測定する方法を書きます。  

# IORとは
以下、[IORのGitHub](https://github.com/hpc/ior/blob/main/doc/USER_GUIDE)から引用。
```
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を使用します。

## どのようなところで使われているか？
以下のような場面で使用されています。
* [スーパコンピュータ富岳のファイルシステム(LLIO)の性能測定](https://www.fujitsu.com/jp/documents/about/resources/publications/technicalreview/2020-03/article05.pdf)
* [ストレージ性能の世界ランキング(IO500)](https://www.vi4io.org/std/io500/start)
* [Amazon FSx for Lustre persistent-50の評価](https://aws.amazon.com/jp/blogs/news/persistent-50-packs-a-punch/)

上記のように、様々なところで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のサイト](https://www.open-mpi.org/software/ompi/v4.1/)からソースコードをダウンロード&解凍し、以下のような手順でビルドします。

```
$ 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が別々のファイルにアクセスするパターンです。(下図参照)
<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153905/d59fca77-e75d-b4fa-24c5-a2dac0b01e30.png">

コマンド例(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
各ランクが同じファイルの別々の領域にアクセスするパターンです。(下図参照)
<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153905/0885b250-9c14-78b0-ca64-4ef8cc781f83.png">

コマンド例は以下です。
```
# 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

```