Power Systems Virtual Serverのストレージ性能を実測

Power Systems Virtual Serverのストレージには、2つのTierがあり、1GBあたりのIOPSが設定されています。ボリュームのサイズが大きくなるほどIOPS性能も上がっていく、という特徴があります。
https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-about-virtual-server#storage-tiers

Tier 1 -> 10 IOPS/GB
Tier 3 -> 3 IOPS/GB

実体としては、FS9000シリーズがファイバー接続されているというのは、こちらのハードウェア仕様を見ることで分かります。
https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-about-virtual-server#hardware-specifications

仕様通りの性能が出るかどうか、ndiskで測定してみました。結論を先に書くと、ほぼ、仕様から想定される通りの性能が出ました。
※保証値ではないため、環境やI/Oの特性により結果が異なる可能性があります。

#環境
Power VS上の下記の環境で測定しました。
AIX 0.25core 2GBメモリ（Tier1）に、2TBのボリュームを1つと、100GBのボリュームを1つ、接続。

#ツールを入手
今回は、nstressツールに含まれるndisk64を使います。
nstressツールは下記からダウンロードできます。ダウンロードしたtarを展開すると、ndisk64が入っており、そのまま実行できます。
https://www.ibm.com/support/pages/stress-test-your-aix-or-linux-server-nstress

ツールの実行方法は、下記を参考にしました。
https://it-memo.info/?p=1851

テスト用のファイルも上記に倣い、1GBのファイルを4つ作っています。

```
# ls -la /data/test
total 8388608
drwxr-xr-x    2 root     system          256 Oct 16 22:11 .
drwxr-xr-x    4 root     system          256 Oct 16 22:08 ..
-rw-r--r--    1 root     system   1073741824 Oct 21 23:46 testfile1
-rw-r--r--    1 root     system   1073741824 Oct 21 23:46 testfile2
-rw-r--r--    1 root     system   1073741824 Oct 21 23:46 testfile3
-rw-r--r--    1 root     system   1073741824 Oct 21 23:46 testfile4
# 
```

また、様々なパラメータが指定できますが、ブロックサイズ4KB、read/writeは50:50で測定しました。

#2TBボリューム

まず、2TBのボリュームでテストします。
Tier 1（10 IOPS/GB）のストレージで2,000 GBなので、20,000 IOPSが期待される性能です。

IO/secの列のTOTALSの行で、ほぼ仕様通りの20030.0 IOPSだった事が分かります。

```:ランダム
# ./ndisk64 -f /data/test/testfile1:/data/test/testfile2:/data/test/testfile3:/data/test/testfile4 -R -r 50 -M 4 -b 4K -s 32M -t 60 -D
Command: ./ndisk64 -f /data/test/testfile1 /data/test/testfile2 /data/test/testfile3 /data/test/testfile4 -R -r 50 -M 4 -b 4K -s 32M -t 60 -D 
        Synchronous Disk test (regular read/write)
        No. of processes = 4 
        I/O type         = Random
        Block size       = 4096
        Read-Write       = Equal read and write
        Sync type: none  = just close the file
        File open() mode = Direct I/O mode - O_DIRECT
        Number of files  = 4
        File size        = 33554432 bytes = 32768 KB = 32 MB
        Run time         = 60 seconds
        Snooze %         = 0 percent
----> Running test with block Size=4096 (4KB) ....
start randomise - bs=4096 sizeof(long)=4
stop  randomise
start randomise - bs=4096 sizeof(long)=4
stop  randomise
start randomise - bs=4096 sizeof(long)=4
stop  randomise
start randomise - bs=4096 sizeof(long)=4
stop  randomise
Proc - <-----Disk IO----> | <-----Throughput------> RunTime
 Num -     TOTAL   IO/sec |    MB/sec       KB/sec  Seconds
   1 -    300800   5013.3 |     19.58     20053.28  60.00
   2 -    300430   5007.2 |     19.56     20028.94  60.00
   3 -    300590   5009.8 |     19.57     20039.33  60.00
   4 -    299978   4999.6 |     19.53     19998.40  60.00
TOTALS   1201798  20030.0 |     78.24     80119.94
- Random procs=  4 read= 50% bs=  4KB
# 
```

シーケンシャルも20137.1 IOPSと、仕様から期待される通りの性能が出ています。

```:シーケンシャル
# ./ndisk64 -f /data/test/testfile1:/data/test/testfile2:/data/test/testfile3:/data/test/testfile4 -S -r 50 -M 4 -b 4K -s 32M -t 60 -D
Command: ./ndisk64 -f /data/test/testfile1 /data/test/testfile2 /data/test/testfile3 /data/test/testfile4 -S -r 50 -M 4 -b 4K -s 32M -t 60 -D 
        Synchronous Disk test (regular read/write)
        No. of processes = 4 
        I/O type         = Sequential
        Block size       = 4096
        Read-Write       = Equal read and write
        Sync type: none  = just close the file
        File open() mode = Direct I/O mode - O_DIRECT
        Number of files  = 4
        File size        = 33554432 bytes = 32768 KB = 32 MB
        Run time         = 60 seconds
        Snooze %         = 0 percent
----> Running test with block Size=4096 (4KB) ....
start randomise - bs=4096 sizeof(long)=4
stop  randomise
start randomise - bs=4096 sizeof(long)=4
stop  randomise
start randomise - bs=4096 sizeof(long)=4
stop  randomise
start randomise - bs=4096 sizeof(long)=4
stop  randomise
Proc - <-----Disk IO----> | <-----Throughput------> RunTime
 Num -     TOTAL   IO/sec |    MB/sec       KB/sec  Seconds
   1 -    301831   5030.5 |     19.65     20122.13  60.00
   2 -    302455   5041.0 |     19.69     20163.90  60.00
   3 -    301638   5027.3 |     19.64     20109.21  60.00
   4 -    302295   5038.3 |     19.68     20153.04  60.00
TOTALS   1208219  20137.1 |     78.66     80548.28
- Seqential procs=  4 read= 50% bs=  4KB
# 
```

なお、プロセス数が少ないと、別の箇所がネックになるようで、ディスク性能をフルには使えていないようでした。

```:1プロセスの場合
# ./ndisk64 -f /data/test/testfile1 -R -r 50 -M 1 -b 4K -s 32M -t 60 -D
Command: ./ndisk64 -f /data/test/testfile1 -R -r 50 -M 1 -b 4K -s 32M -t 60 -D 
        Synchronous Disk test (regular read/write)
        No. of processes = 1 
        I/O type         = Random
        Block size       = 4096
        Read-Write       = Equal read and write
        Sync type: none  = just close the file
        File open() mode = Direct I/O mode - O_DIRECT
        Number of files  = 1
        File size        = 33554432 bytes = 32768 KB = 32 MB
        Run time         = 60 seconds
        Snooze %         = 0 percent
----> Running test with block Size=4096 (4KB) .
start randomise - bs=4096 sizeof(long)=4
stop  randomise
Proc - <-----Disk IO----> | <-----Throughput------> RunTime
 Num -     TOTAL   IO/sec |    MB/sec       KB/sec  Seconds
   1 -    322749   5379.2 |     21.01     21516.62  60.00
#
```

```:2プロセスの場合
# ./ndisk64 -f /data/test/testfile1:/data/test/testfile2 -R -r 50 -M 2 -b 4K -s 32M -t 60 -D
Command: ./ndisk64 -f /data/test/testfile1 /data/test/testfile2 -R -r 50 -M 2 -b 4K -s 32M -t 60 -D 
        Synchronous Disk test (regular read/write)
        No. of processes = 2 
        I/O type         = Random
        Block size       = 4096
        Read-Write       = Equal read and write
        Sync type: none  = just close the file
        File open() mode = Direct I/O mode - O_DIRECT
        Number of files  = 2
        File size        = 33554432 bytes = 32768 KB = 32 MB
        Run time         = 60 seconds
        Snooze %         = 0 percent
----> Running test with block Size=4096 (4KB) ..
start randomise - bs=4096 sizeof(long)=4
stop  randomise
start randomise - bs=4096 sizeof(long)=4
stop  randomise
Proc - <-----Disk IO----> | <-----Throughput------> RunTime
 Num -     TOTAL   IO/sec |    MB/sec       KB/sec  Seconds
   1 -    309330   5155.5 |     20.14     20622.03  60.00
   2 -    309387   5156.4 |     20.14     20625.78  60.00
TOTALS    618717  10312.0 |     40.28     41247.81
- Random procs=  2 read= 50% bs=  4KB
#
```

#OSのキャッシュが有効な場合
上記は、ストレージ性能を確認するのが目的だったので、-Dオプションを付けていました。
-Dオプションを付けないとOSのキャッシュを使うようになり、ストレージ自体の性能より高い結果になります。

```:ランダム（キャッシュあり）
# ./ndisk64 -f /data/test/testfile1:/data/test/testfile2:/data/test/testfile3:/data/test/testfile4 -R -r 50 -M 4 -b 4K -s 32M -t 60
Command: ./ndisk64 -f /data/test/testfile1 /data/test/testfile2 /data/test/testfile3 /data/test/testfile4 -R -r 50 -M 4 -b 4K -s 32M -t 60 
        Synchronous Disk test (regular read/write)
        No. of processes = 4 
        I/O type         = Random
        Block size       = 4096
        Read-Write       = Equal read and write
        Sync type: none  = just close the file
        Number of files  = 4
        File size        = 33554432 bytes = 32768 KB = 32 MB
        Run time         = 60 seconds
        Snooze %         = 0 percent
----> Running test with block Size=4096 (4KB) ....
start randomise - bs=4096 sizeof(long)=4
stop  randomise
start randomise - bs=4096 sizeof(long)=4
stop  randomise
start randomise - bs=4096 sizeof(long)=4
stop  randomise
start randomise - bs=4096 sizeof(long)=4
stop  randomise
Proc - <-----Disk IO----> | <-----Throughput------> RunTime
 Num -     TOTAL   IO/sec |    MB/sec       KB/sec  Seconds
   1 -   9758340 162640.2 |    635.31    650560.86  60.00
   2 -   9746163 162438.1 |    634.52    649752.24  60.00
   3 -   9209120 153485.9 |    599.55    613943.74  60.00
   4 -   9590731 159845.8 |    624.40    639383.02  60.00
TOTALS  38304354 638410.0 |   2493.79   2553639.85
- Random procs=  4 read= 50% bs=  4KB
# 
```

```:シーケンシャル（キャッシュあり）
# ./ndisk64 -f /data/test/testfile1:/data/test/testfile2:/data/test/testfile3:/data/test/testfile4 -S -r 50 -M 4 -b 4K -s 32M -t 60
Command: ./ndisk64 -f /data/test/testfile1 /data/test/testfile2 /data/test/testfile3 /data/test/testfile4 -S -r 50 -M 4 -b 4K -s 32M -t 60 
        Synchronous Disk test (regular read/write)
        No. of processes = 4 
        I/O type         = Sequential
        Block size       = 4096
        Read-Write       = Equal read and write
        Sync type: none  = just close the file
        Number of files  = 4
        File size        = 33554432 bytes = 32768 KB = 32 MB
        Run time         = 60 seconds
        Snooze %         = 0 percent
----> Running test with block Size=4096 (4KB) ....
start randomise - bs=4096 sizeof(long)=4
stop  randomise
start randomise - bs=4096 sizeof(long)=4
stop  randomise
start randomise - bs=4096 sizeof(long)=4
stop  randomise
start randomise - bs=4096 sizeof(long)=4
stop  randomise
Proc - <-----Disk IO----> | <-----Throughput------> RunTime
 Num -     TOTAL   IO/sec |    MB/sec       KB/sec  Seconds
   1 -   1187841  19803.1 |     77.36     79212.44  59.98
   2 -   1190883  19852.0 |     77.55     79407.87  59.99
   3 -   1190368  19842.1 |     77.51     79368.26  59.99
   4 -   1112224  18493.8 |     72.24     73975.40  60.14
TOTALS   4681316  77991.0 |    304.65    311963.96
- Seqential procs=  4 read= 50% bs=  4KB
# 
```

#100GBボリューム

100GB, Tier1のボリュームは、仕様から想定される通り、ほぼ1,000 IOPSでした。

```:ランダム
# /ndisk64 -f /data2/test2/testfile1 -R -r 50 -b 4K -s 32M -t 60 -D
Command: /ndisk64 -f /data2/test2/testfile1 -R -r 50 -b 4K -s 32M -t 60 -D 
        Synchronous Disk test (regular read/write)
        No. of processes = 1 
        I/O type         = Random
        Block size       = 4096
        Read-Write       = Equal read and write
        Sync type: none  = just close the file
        File open() mode = Direct I/O mode - O_DIRECT
        Number of files  = 1
        File size        = 33554432 bytes = 32768 KB = 32 MB
        Run time         = 60 seconds
        Snooze %         = 0 percent
----> Running test with block Size=4096 (4KB) .
start randomise - bs=4096 sizeof(long)=4
stop  randomise
Proc - <-----Disk IO----> | <-----Throughput------> RunTime
 Num -     TOTAL   IO/sec |    MB/sec       KB/sec  Seconds
   1 -     60951   1015.8 |      3.97      4063.33  60.00
#
```

```:シーケンシャル
# /ndisk64 -f /data2/test2/testfile1 -S -r 50 -b 4K -s 32M -t 60 -D
Command: /ndisk64 -f /data2/test2/testfile1 -S -r 50 -b 4K -s 32M -t 60 -D 
        Synchronous Disk test (regular read/write)
        No. of processes = 1 
        I/O type         = Sequential
        Block size       = 4096
        Read-Write       = Equal read and write
        Sync type: none  = just close the file
        File open() mode = Direct I/O mode - O_DIRECT
        Number of files  = 1
        File size        = 33554432 bytes = 32768 KB = 32 MB
        Run time         = 60 seconds
        Snooze %         = 0 percent
----> Running test with block Size=4096 (4KB) .
start randomise - bs=4096 sizeof(long)=4
stop  randomise
Proc - <-----Disk IO----> | <-----Throughput------> RunTime
 Num -     TOTAL   IO/sec |    MB/sec       KB/sec  Seconds
   1 -     60952   1015.8 |      3.97      4063.38  60.00
#
```

以上です。