[Oracle Cloud] Block Volume を Software RAID (LVM, mdadm) で複数まとめて性能を上げる

# はじめに

Oracle Cloud Infrastructure (以下OCI) では、Block Volume サービスが提供されています。一般的なパブリッククラウドと同様に、Block Volume 1個あたりの性能上限があります。

**Block Volume 1個あたりの性能上限**
スループット : 480MB/s
IOPS : 35,000 
Performance : Higher Performance

詳細は次の Document に書いています
https://docs.cloud.oracle.com/en-us/iaas/Content/Block/Concepts/blockvolumeperformance.htm

1個あたり性能もそれなりに早いですが、これ以上の性能を出す場合にはどうすればいいのでしょうか？ Software RAID を使って、Block Volume を論理的な1個の Volume にまとめることで、性能を上げられます。

今回の記事では、代表的な2種類の Software RAID の構成方法を紹介します。

- LVM
- mdadm (Multi Device Aministrator という名前が由来らしい)



# 前提条件

**Block Volume について**
今回は、800GB の Higher Performance のBlock Volume を 5 つ纏めます。机上でのカタログスペックはこんな感じです。

- 35,000 IOPS x5 = 175000 IOPS
- 480 MB/s x5 = 2400 MB/s

Software RAID でまとめているため、このままのカタログスペック性能が出るかというと、出ないです。また、どこの性能検証をどのようなパラメータで行うか、によっても変わってきます。が、こういうカタログスペックなんだな、というのは参考値になるはずです。

**Compute Instance について**
Block Volume の性能を出すためには、Compute Instance のネットワーク帯域も重要です。ネットワーク越しに Block Volume を利用しているため、ストレージへのI/O を行うと、Compute Instance のネットワーク帯域も消費します。

今回は、2400MB/s を上回るために、AMD E3 の 20 OCPU を使っています。
ネットワーク帯域 20Gbps = 2.5GB/s 

# Attach LVM Vol

Higher Performance 800GB の Block Volume を 5個アタッチします。その後、LVM を使って1個の Logical Volume にまとめていきます。
PV作成

```
pvcreate /dev/oracleoci/oraclevdc
pvcreate /dev/oracleoci/oraclevdd
pvcreate /dev/oracleoci/oraclevde
pvcreate /dev/oracleoci/oraclevdf
pvcreate /dev/oracleoci/oraclevdg
```



確認

```
[root@lvm01 oracleoci]# pvs
  PV         VG Fmt  Attr PSize   PFree
  /dev/sdc      lvm2 ---  800.00g 800.00g
  /dev/sdd      lvm2 ---  800.00g 800.00g
  /dev/sde      lvm2 ---  800.00g 800.00g
  /dev/sdf      lvm2 ---  800.00g 800.00g
  /dev/sdg      lvm2 ---  800.00g 800.00g
```



VG作成

```
vgcreate vg1 \
/dev/oracleoci/oraclevdc \
/dev/oracleoci/oraclevdd \
/dev/oracleoci/oraclevde \
/dev/oracleoci/oraclevdf \
/dev/oracleoci/oraclevdg
```



確認

```
[root@lvm01 singlevol01]# vgdisplay -v vg1
  --- Volume group ---
  VG Name               vg1
  System ID
  Format                lvm2
  Metadata Areas        5
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                5
  Act PV                5
  VG Size               <3.91 TiB
  PE Size               4.00 MiB
  Total PE              1023995
  Alloc PE / Size       0 / 0
  Free  PE / Size       1023995 / <3.91 TiB
  VG UUID               DNAr9j-eR3a-E87e-ThZY-VLn8-lJYM-ygdjeB

  --- Physical volumes ---
  PV Name               /dev/sdc
  PV UUID               5B399q-cV1q-oeD7-sQ2Y-OI8R-91zj-sTQh1C
  PV Status             allocatable
  Total PE / Free PE    204799 / 204799

  PV Name               /dev/sdd
  PV UUID               nq6VA3-cqVn-0BC4-R3pi-47I4-faTq-FbkXIq
  PV Status             allocatable
  Total PE / Free PE    204799 / 204799

  PV Name               /dev/sde
  PV UUID               anVKHI-Swv1-Uzk8-EcyQ-Phhh-RGBJ-kFptzD
  PV Status             allocatable
  Total PE / Free PE    204799 / 204799

  PV Name               /dev/sdf
  PV UUID               gZUeYO-NZKt-phTY-zbci-WOrk-YXB2-0Fxj5Z
  PV Status             allocatable
  Total PE / Free PE    204799 / 204799

  PV Name               /dev/sdg
  PV UUID               8FJ8C9-FF0g-psTk-ZvhO-0DgV-5oT6-tafGLx
  PV Status             allocatable
  Total PE / Free PE    204799 / 204799

[root@lvm01 singlevol01]#
```



LV作成
`i` : ストライプ数
`I` : ストライプサイズ
`l` : 容量
`type` : raid0(ストライピング)を指定
`n` : 名前

```
lvcreate -i 5 -I 4 -l 100%free --type raid0 -n lv1 vg1
```



実行例

```
[root@lvm01 singlevol01]# lvcreate -i 5 -I 4 -l 100%free --type raid0 -n lv1 vg1
  Logical volume "lv1" created.
```



確認

```
lvs -a -o +devices -o +stripesize
```



実行例
Logical Volume が使っている、Physical Volume 及び、ストライプサイズを確認可能

```
[root@lvm01 singlevol01]# lvs -a -o +devices -o +stripesize
  LV             VG  Attr       LSize    Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert Devices                                                                         Stripe
  lv1            vg1 rwi-a-r---   <3.91t                                                     lv1_rimage_0(0),lv1_rimage_1(0),lv1_rimage_2(0),lv1_rimage_3(0),lv1_rimage_4(0)  4.00k
  [lv1_rimage_0] vg1 iwi-aor--- <800.00g                                                     /dev/sdc(0)                                                                         0
  [lv1_rimage_1] vg1 iwi-aor--- <800.00g                                                     /dev/sdd(0)                                                                         0
  [lv1_rimage_2] vg1 iwi-aor--- <800.00g                                                     /dev/sde(0)                                                                         0
  [lv1_rimage_3] vg1 iwi-aor--- <800.00g                                                     /dev/sdf(0)                                                                         0
  [lv1_rimage_4] vg1 iwi-aor--- <800.00g                                                     /dev/sdg(0)                                                                         0
```



Device Mapper を確認

```
[root@lvm01 mapper]# ls -la /dev/mapper/
total 0
drwxr-xr-x.  2 root root     180 Jul 11 07:24 .
drwxr-xr-x. 21 root root    3540 Jul 11 07:24 ..
crw-------.  1 root root 10, 236 Jul 10 18:13 control
lrwxrwxrwx.  1 root root       7 Jul 11 07:24 vg1-lv1 -> ../dm-5
lrwxrwxrwx.  1 root root       7 Jul 11 07:24 vg1-lv1_rimage_0 -> ../dm-0
lrwxrwxrwx.  1 root root       7 Jul 11 07:24 vg1-lv1_rimage_1 -> ../dm-1
lrwxrwxrwx.  1 root root       7 Jul 11 07:24 vg1-lv1_rimage_2 -> ../dm-2
lrwxrwxrwx.  1 root root       7 Jul 11 07:24 vg1-lv1_rimage_3 -> ../dm-3
lrwxrwxrwx.  1 root root       7 Jul 11 07:24 vg1-lv1_rimage_4 -> ../dm-4
```



FileSystem作成
性能を気にする場合は、Block Size の指定も検討しましょう。

```
mkfs.xfs /dev/mapper/vg1-lv1
```



実行例

```
[root@lvm01 mapper]# mkfs.xfs /dev/mapper/vg1-lv1
meta-data=/dev/mapper/vg1-lv1    isize=512    agcount=4, agsize=262142720 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=1048570880, imaxpct=5
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=511997, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@lvm01 mapper]#
```



fstab 編集

```
vim /etc/fstab
```



末尾に追加
iSCSI デバイスなので、`_netdev` を入れています。また、`nobarrier`で多少性能を上げています。(あまり変わらない気がする)

```
/dev/mapper/vg1-lv1 /mnt/lvmvol01 xfs nobarrier,_netdev,nofail 0 2
```



mount

```
mkdir /mnt/lvmvol01
mount /mnt/lvmvol01
```



確認

```
[root@lvm01 mnt]# df -hT
Filesystem          Type      Size  Used Avail Use% Mounted on
devtmpfs            devtmpfs  158G     0  158G   0% /dev
tmpfs               tmpfs     158G     0  158G   0% /dev/shm
tmpfs               tmpfs     158G  8.8M  158G   1% /run
tmpfs               tmpfs     158G     0  158G   0% /sys/fs/cgroup
/dev/sda3           xfs        39G  2.0G   37G   6% /
/dev/sda1           vfat      512M   12M  501M   3% /boot/efi
tmpfs               tmpfs      32G     0   32G   0% /run/user/1000
/dev/sdb            xfs       800G  5.1G  795G   1% /mnt/singlevol01
/dev/mapper/vg1-lv1 xfs       4.0T   33M  4.0T   1% /mnt/lvmvol01
```



# Attach mdadm Vol

Higher Performance 800GB の Block Volume を 5個アタッチします。その後、mdadm を使って1個にまとめていきます。
参考 : https://qiita.com/sugimount/items/7d7267c9ff82b0da0126

Dir 作成

```
mkdir /dev/md/
```



SoftwareRAID 作成

```
md_name=mdadm-vol01
mdadm --create /dev/md/${md_name} --level=raid0 --name=${md_name} --chunk=4 --raid-devices=5 /dev/oracleoci/oraclevdh /dev/oracleoci/oraclevdi /dev/oracleoci/oraclevdj /dev/oracleoci/oraclevdk /dev/oracleoci/oraclevdl
```



実行例

```
[root@lvm01 oracleoci]# mdadm --create /dev/md/${md_name} --level=raid0 --name=${md_name} --raid-devices=5 /dev/oracleoci/oraclevdh /dev/oracleoci/oraclevdi /dev/oracleoci/oraclevdj /dev/oracleoci/oraclevdk /dev/oracleoci/oraclevdl
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md/mdadm-vol01 started.
```



設定値保存

```
mdadm --detail --scan > /etc/mdadm.conf
```



確認

```
[root@lvm01 oracleoci]# mdadm --detail --scan
ARRAY /dev/md/mdadm-vol01 metadata=1.2 name=lvm01:mdadm-vol01 UUID=b650d2fd:de895fbf:39a59894:10b744c5
```



確認

```
[root@lvm01 oracleoci]# mdadm --detail /dev/md/mdadm-vol01
/dev/md/mdadm-vol01:
           Version : 1.2
     Creation Time : Sat Jul 11 08:32:51 2020
        Raid Level : raid0
        Array Size : 4193643520 (3999.37 GiB 4294.29 GB)
      Raid Devices : 5
     Total Devices : 5
       Persistence : Superblock is persistent

       Update Time : Sat Jul 11 08:32:51 2020
             State : clean
    Active Devices : 5
   Working Devices : 5
    Failed Devices : 0
     Spare Devices : 0

        Chunk Size : 4K

Consistency Policy : none

              Name : lvm01:mdadm-vol01  (local to host lvm01)
              UUID : de777861:5e62caaa:030b36b9:cdf777d5
            Events : 0

    Number   Major   Minor   RaidDevice State
       0       8      112        0      active sync   /dev/sdh
       1       8      128        1      active sync   /dev/sdi
       2       8      144        2      active sync   /dev/sdj
       3       8      160        3      active sync   /dev/sdk
       4       8      176        4      active sync   /dev/sdl
[root@lvm01 oracleoci]#
```



memo : SoftwareRAID 削除コマンド

```
mdadm --stop /dev/md/mdadm-vol01
mdadm --zero-superblock /dev/oracleoci/oraclevdh /dev/oracleoci/oraclevdi /dev/oracleoci/oraclevdj /dev/oracleoci/oraclevdk /dev/oracleoci/oraclevdl
rm /etc/mdadm.conf
```



FileSystem作成

```
mkfs.xfs /dev/md/mdadm-vol01
```



実行例

```
[root@lvm01 md]# mkfs.xfs /dev/md/mdadm-vol01
meta-data=/dev/md/mdadm-vol01    isize=512    agcount=4, agsize=262102720 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=1048410880, imaxpct=5
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=511919, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@lvm01 md]#
```



fstab 編集

```
vim /etc/fstab
```



末尾に追加

```
/dev/md/mdadm-vol01 /mnt/mdadmvol01 xfs nobarrier,_netdev,nofail 0 2
```



mount

```
mkdir /mnt/mdadmvol01
mount /mnt/mdadmvol01
```



確認

```
[root@lvm01 md]# df -hT
Filesystem          Type      Size  Used Avail Use% Mounted on
devtmpfs            devtmpfs  158G     0  158G   0% /dev
tmpfs               tmpfs     158G     0  158G   0% /dev/shm
tmpfs               tmpfs     158G  8.8M  158G   1% /run
tmpfs               tmpfs     158G     0  158G   0% /sys/fs/cgroup
/dev/sda3           xfs        39G  2.0G   37G   6% /
/dev/sda1           vfat      512M   12M  501M   3% /boot/efi
tmpfs               tmpfs      32G     0   32G   0% /run/user/1000
/dev/mapper/vg1-lv1 xfs       4.0T  5.1G  3.9T   1% /mnt/lvmvol01
/dev/sdb            xfs       800G  5.1G  795G   1% /mnt/singlevol01
/dev/md127          xfs       4.0T   33M  4.0T   1% /mnt/mdadmvol01
```



# まとめ

具体的な数値の公開は控えさせていただきますが、1個の Block Volume の性能と、5個の Block Volume をソフトウェアで1個にまとめた性能を比較すると、後者の方が性能が向上しています。また、LVM と mdadm の性能を比較しましたが、若干 mdadm の方が性能が良かったです。本の少しだけなので、どちらを選んでも良いと思います。

性能を非公開の理由は、ファイルシステムの Block Size や、RAID の Stripe Size によって性能が大きく変わるためです。普段使用しているアプリケーションから投げられる ストレージ I/O が、どれくらいのものなのかによって、これらのパラメータを調整すると良いはずです。


# 参考URL

https://docs.cloud.oracle.com/en-us/iaas/Content/Block/References/samplefiocommandslinux.htm

https://docs.cloud.oracle.com/en-us/iaas/Content/Block/References/fstaboptionsconsistentdevicepaths.htm

https://docs.cloud.oracle.com/en-us/iaas/Content/Block/Concepts/blockvolumeperformance.htm

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/logical_volume_manager_administration/lv_overview

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/logical_volume_manager_administration/lv#LV_stripecreate

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/logical_volume_manager_administration/lv#stripe_extend



mdadmの拡張
https://kledgeb.blogspot.com/2014/04/ubuntu-mdadm-122-raid-0.html