はじめに
OCIのブロック・ボリュームには、パフォーマンス・レベル という設定があります。
これは、ブロックボリュームのパフォーマンスを表す ボリューム・パフォーマンス・ユニット(VPU) をいくつ割り当てるかで パフォーマンス・レベル が決定します。
パフォーマンス・レベル には、以下4つのレベルが存在し、VPUを多く割り当てる程、高パフォーマンスをだせるようになります。
レベル | VPU | 用途 |
---|---|---|
より低いコスト | 0 | コスト最適型でシーケンシャルIOのスループット重視のワークロード向け |
バランス | 10 | ランダムIOを実行する様々なワークロードに最適なバランス型 |
より高いパフォーマンス | 20 | 超高パフォーマンスまでのパフォーマンスは必要ないが、高I/O要件のワークロード向け |
超高パフォーマンス | 30-120 | I/O要件が非常に高く、最大限のパフォーマンスを必要とするワークロード向け |
それぞれの パフォーマンス・レベル 及び VPU でのスループット等は、以下のリファレンスをご確認下さい。
超高パフォーマンスが使用できる対象について
最も高パフォーマンスとなる「超高パフォーマンス」を使用したいと思っても、全ての コンピュート・シェイプ 及び イメージ で使用できる訳ではありません。
マルチパスに対応している必要があり、ブロック・ボリュームのアタッチメントタイプによって、異なります。
アタッチメントタイプ = iSCSI の場合
対応するコンピュート・シェイプ
- VMシェイプの場合
- iSCSIでアタッチされたボリュームのVMシェイプ をご確認下さい。
- BMシェイプの場合
- 全てのシェイプが対象
対応するイメージ
- Oracle Linux、またはOracle Linuxイメージをベースとするカスタム・イメージが対象
詳細については、以下のリファレンスをご確認ください。
アタッチメントタイプ = 準仮想化 の場合
対応するコンピュート・シェイプ
- VMシェイプの場合
- 16 OCUP以上が割り当てられているインスタンスが対象
- BMシェイプの場合
- 全てのシェイプが対象外(※iSCSI アタッチメントのみが対象)
対応するイメージ
- Oracle Linux
- Ubuntu
- CentOS
- Windows
詳細については、以下のリファレンスをご確認ください。
超高パフォーマンスの使用
それでは、「超高パフォーマンス」を設定したブロックボリュームを実際に使用してみたいと思います。
コンピュート及びブロック・ボリュームは、それぞれ以下のように設定しています。
- コンピュート
項目 | 設定 |
---|---|
シェイプ | VM.Standard.E4.Flex |
イメージ | Oracle Linux 8 |
OCPU | 16 |
Memory(GB) | 32 |
- ブロック・ボリューム
項目 | 設定 |
---|---|
アタッチメントタイプ | iSCSI |
VPU/GB | 30 |
ボリューム・サイズ | 1024 GB |
ブロック・ボリューム管理プラグインの有効化
アタッチメントタイプ を iSCSI とする場合は、コンピュートの設定で、「Oracle Cloud エージェント」の「ブロック・ボリューム管理」を有効化する必要があります。
こちらは、デフォルトでは無効となっていますので、有効にします。
有効化処理が完了すると、/etc/multipath.conf
が作成されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$ ls /etc/multipath.conf /etc/multipath.conf $ cat /etc/multipath.conf defaults { user_friendly_names yes find_multipaths yes rr_weight uniform path_selector "queue-length 0" path_grouping_policy multibus polling_interval 30 path_checker tur checker_timeout 300 failback immediate verbosity 2 rr_min_io 1 rr_min_io_rq 1 dev_loss_tmo 9000 fast_io_fail_tmo -1 no_path_retry queue skip_kpartx no features "2 queue_mode bio" } |
ブロック・ボリュームの作成
アタッチするブロック・ボリュームを作成します。
ボリューム・サイズは、デフォルトの 1024GB
、VPU は 超高パフォーマンス となるように 30
を設定します。
ブロック・ボリュームのアタッチ
作成したブロック・ボリュームをコンピュートにアタッチします。
アタッチメント・タイプは ISCSI
、デバイス・パスは /dev/oracleoci/oraclevdb
としました。
アタッチ処理が完了すると、「マルチパス」が「はい」になっていることを確認します。
パーティション、ファイルシステムの作成
ブロック・ボリュームのアタッチ後にコンピュートでブロック・ボリュームをマルチパス構成で認識していることが確認できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# ls -l /dev/oracleoci/oraclevdb lrwxrwxrwx 1 root root 18 Mar 22 13:49 /dev/oracleoci/oraclevdb -> /dev/mapper/mpatha # lsblk /dev/oracleoci/oraclevdb NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT mpatha 252:2 0 1T 0 mpath # multipath -ll mpatha Mar 22 15:17:29 | /etc/multipath.conf line 15, value for fast_io_fail_tmo too small, capping at 1 mpatha (36076702eb9214c9bb6eccd2c9ecf274c) dm-2 ORACLE,BlockVolume size=1.0T features='4 queue_if_no_path retain_attached_hw_handler queue_mode bio' hwhandler='0' wp=rw `-+- policy='queue-length 0' prio=1 status=active |- 3:0:0:2 sdb 8:16 active ready running |- 4:0:0:2 sdc 8:32 active ready running |- 5:0:0:2 sdd 8:48 active ready running |- 6:0:0:2 sde 8:64 active ready running |- 7:0:0:2 sdf 8:80 active ready running |- 8:0:0:2 sdg 8:96 active ready running |- 9:0:0:2 sdh 8:112 active ready running |- 10:0:0:2 sdi 8:128 active ready running |- 11:0:0:2 sdj 8:144 active ready running `- 12:0:0:2 sdk 8:160 active ready running |
それでは、以下の手順に沿って、パーティション及びファイルシステムの作成を行っていきます。
まずは、パーティションの作成を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# fdisk /dev/mapper/mpatha Welcome to fdisk (util-linux 2.32.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Device does not contain a recognized partition table. Created a new DOS disklabel with disk identifier 0x57c22387. Command (m for help): n Partition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions) Select (default p): e Partition number (1-4, default 1): First sector (2048-2147483647, default 2048): Last sector, +sectors or +size{K,M,G,T,P} (2048-2147483647, default 2147483647): Created a new partition 1 of type 'Extended' and of size 1024 GiB. Command (m for help): t Selected partition 1 Hex code (type L to list all codes): 83 Changed type of partition 'Extended' to 'Linux'. Command (m for help): w The partition table has been altered. Failed to add partition 1 to system: Invalid argument The kernel still uses the old partitions. The new table will be used at the next reboot. Syncing disks. |
Failed to add partition 1 to system: Invalid argument
とエラーが出力されていますが、以下は RedHat の情報になりますが、マルチパス構成の場合は必ず出力されるもので、対応不要とされています。
- RedHat Customer Portal / fdisk shows ‘Failed to add partition 1 to system: Invalid argument’ message
※閲覧には RedHat Customer Portalのアカウントが必要です。
パーティションが作成されていることが確認できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
# fdisk -l /dev/mapper/mpatha Disk /dev/mapper/mpatha: 1 TiB, 1099511627776 bytes, 2147483648 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 1048576 bytes Disklabel type: dos Disk identifier: 0x57c22387 Device Boot Start End Sectors Size Id Type /dev/mapper/mpatha1 2048 2147483647 2147481600 1024G 83 Linux # lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 46.6G 0 disk ├─sda1 8:1 0 100M 0 part /boot/efi ├─sda2 8:2 0 1G 0 part /boot └─sda3 8:3 0 45.5G 0 part ├─ocivolume-root 252:0 0 35.5G 0 lvm / └─ocivolume-oled 252:1 0 10G 0 lvm /var/oled sdb 8:16 0 1T 0 disk └─mpatha 252:2 0 1T 0 mpath └─mpatha1 252:3 0 1024G 0 part sdc 8:32 0 1T 0 disk └─mpatha 252:2 0 1T 0 mpath └─mpatha1 252:3 0 1024G 0 part sdd 8:48 0 1T 0 disk └─mpatha 252:2 0 1T 0 mpath └─mpatha1 252:3 0 1024G 0 part sde 8:64 0 1T 0 disk └─mpatha 252:2 0 1T 0 mpath └─mpatha1 252:3 0 1024G 0 part sdf 8:80 0 1T 0 disk └─mpatha 252:2 0 1T 0 mpath └─mpatha1 252:3 0 1024G 0 part sdg 8:96 0 1T 0 disk └─mpatha 252:2 0 1T 0 mpath └─mpatha1 252:3 0 1024G 0 part sdh 8:112 0 1T 0 disk └─mpatha 252:2 0 1T 0 mpath └─mpatha1 252:3 0 1024G 0 part sdi 8:128 0 1T 0 disk └─mpatha 252:2 0 1T 0 mpath └─mpatha1 252:3 0 1024G 0 part sdj 8:144 0 1T 0 disk └─mpatha 252:2 0 1T 0 mpath └─mpatha1 252:3 0 1024G 0 part sdk 8:160 0 1T 0 disk └─mpatha 252:2 0 1T 0 mpath └─mpatha1 252:3 0 1024G 0 part |
続いてファイルシステムを作成してマウントします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# mkfs.xfs /dev/mapper/mpatha1 meta-data=/dev/mapper/mpatha1 isize=512 agcount=4, agsize=67108800 blks = sectsz=4096 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 bigtime=0 inobtcount=0 data = bsize=4096 blocks=268435200, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=131071, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 Discarding blocks...Done. # mkdir /mnt/uhp # blkid /dev/sda1: SEC_TYPE="msdos" UUID="9814-8B9E" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="e673ae28-ba2f-401d-b02b-695892283475" /dev/sda2: UUID="f7cf63bd-4975-44bb-ba99-b81e037be7e1" BLOCK_SIZE="4096" TYPE="xfs" PARTUUID="3840f016-52ac-4561-835a-02dfa72af0e8" /dev/sda3: UUID="DXweFJ-3mk1-wvdP-SAud-VhKx-okGb-s7dQh1" TYPE="LVM2_member" PARTUUID="66916148-c5f5-4833-8fae-8a4de95421fd" /dev/mapper/ocivolume-root: UUID="8b8d3b19-9faa-4dee-b3ba-765c3515b283" BLOCK_SIZE="4096" TYPE="xfs" /dev/mapper/ocivolume-oled: UUID="21d53c77-7876-4a1c-b4e1-a8cd74d1938c" BLOCK_SIZE="4096" TYPE="xfs" /dev/mapper/mpatha1: UUID="65eeb2a5-c06c-42a4-b978-fd48f98ede20" BLOCK_SIZE="4096" TYPE="xfs" PARTUUID="57c22387-01" /dev/mapper/mpatha: PTUUID="57c22387" PTTYPE="dos" # echo "UUID=65eeb2a5-c06c-42a4-b978-fd48f98ede20 /mnt/uhp xfs defaults,_netdev,noatime 0 2" > /etc/fstab # mount -a # df -hT Filesystem Type Size Used Avail Use% Mounted on devtmpfs devtmpfs 16G 0 16G 0% /dev tmpfs tmpfs 16G 0 16G 0% /dev/shm tmpfs tmpfs 16G 17M 16G 1% /run tmpfs tmpfs 16G 0 16G 0% /sys/fs/cgroup /dev/mapper/ocivolume-root xfs 36G 12G 24G 34% / /dev/mapper/ocivolume-oled xfs 10G 119M 9.9G 2% /var/oled /dev/sda2 xfs 1014M 323M 692M 32% /boot /dev/sda1 vfat 100M 5.0M 95M 6% /boot/efi tmpfs tmpfs 3.2G 0 3.2G 0% /run/user/0 tmpfs tmpfs 3.2G 0 3.2G 0% /run/user/988 tmpfs tmpfs 3.2G 0 3.2G 0% /run/user/1000 /dev/mapper/mpatha1 xfs 1.0T 7.2G 1017G 1% /mnt/uhp ★追加したボリューム |
正常にマウントされています。
簡易検証
もう1つバランスタイプ(VPU=10)のブロック・ボリュームを同じボリュームサイズで /mnt/balance
にアタッチしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# df -hT Filesystem Type Size Used Avail Use% Mounted on devtmpfs devtmpfs 16G 0 16G 0% /dev tmpfs tmpfs 16G 0 16G 0% /dev/shm tmpfs tmpfs 16G 17M 16G 1% /run tmpfs tmpfs 16G 0 16G 0% /sys/fs/cgroup /dev/mapper/ocivolume-root xfs 36G 12G 24G 34% / /dev/mapper/ocivolume-oled xfs 10G 131M 9.9G 2% /var/oled /dev/sda2 xfs 1014M 323M 692M 32% /boot /dev/sda1 vfat 100M 5.0M 95M 6% /boot/efi tmpfs tmpfs 3.2G 0 3.2G 0% /run/user/0 tmpfs tmpfs 3.2G 0 3.2G 0% /run/user/988 tmpfs tmpfs 3.2G 0 3.2G 0% /run/user/1000 /dev/mapper/mpatha1 xfs 1.0T 7.2G 1017G 1% /mnt/uhp /dev/sdl1 xfs 1.0T 7.2G 1017G 1% /mnt/balance |
両方のブロック・ボリュームに対して、以下のリファレンスに記載されているFIOを使用した「IOPSパフォーマンス・テスト」の「ランダム読取り/書込みをテスト」を実施してみました。
バランス(VPU=10)
-
検証コマンド
123456# sudo fio --filename=/dev/sdl1 \--direct=1 --rw=randrw --bs=4k \--ioengine=libaio --iodepth=256 \--runtime=120 --numjobs=4 --time_based \--group_reporting --name=iops-test-job \--eta-newline=1 --allow_mounted_write=1 -
結果
123iops-test-job: (groupid=0, jobs=4): err= 0: pid=86216: Thu Mar 23 16:43:24 2023read: IOPS=12.6k, BW=49.4MiB/s (51.8MB/s)(5925MiB/120016msec)write: IOPS=12.6k, BW=49.4MiB/s (51.8MB/s)(5925MiB/120016msec);
ブロック・ボリューム・パフォーマンス によると、バランス(VPU=10)では、1GB あたり 60 IOPS
となるので、1024 GB × 60 = 61,440 となりますが、ボリュームあたりの最大 IOPS は 25,000
と記載されています。
read,write ともに 12.6k なので、合算した値からすると、最大IOPSで制限されているように思います。
超高パフォーマンス(VPU=30)
-
検証コマンド
123456sudo fio --filename=/dev/mapper/mpatha1 \--direct=1 --rw=randrw --bs=4k \--ioengine=libaio --iodepth=256 \--runtime=120 --numjobs=4 --time_based \--group_reporting --name=iops-test-job \--eta-newline=1 --allow_mounted_write=1 -
結果
123iops-test-job: (groupid=0, jobs=4): err= 0: pid=87550: Thu Mar 23 16:48:10 2023read: IOPS=37.9k, BW=148MiB/s (155MB/s)(17.4GiB/120124msec)write: IOPS=37.9k, BW=148MiB/s (155MB/s)(17.4GiB/120124msec);
超高パフォーマンス(VPU=30)では、1GB あたり 90 IOPS
となるので、1024 GB × 90 = 92,160 となりますが、ボリュームあたりの最大 IOPS は 75,000
となります。
read,write ともに 37.9k なので、合算した値からすると、こちらも最大IOPSで制限されているように思いますが、バランスの3倍程度のIOPSとなっています。
まとめ
必要に応じて、ブロック・ボリュームのパフォーマンス・レベルを変更することで性能の向上が見られますが、当然、高いパフォーマンスになる程、利用価格が高くなります。
執筆時点での コスト試算ツール では、以下のようになっていますが、パフォーマンス・レベルを変更する場合は、価格の差分についても把握しておくようにしましょう。
パフォーマンス・レベル(VPU) | 1GBあたりの月単価 |
---|---|
より低いコスト(0) | 3.57円 |
バランス(10) | 5.95円 |
より高いパフォーマンス(20) | 8.33円 |
超高パフォーマンス(30) | 10.71円 |
超高パフォーマンス(40) | 13.09円 |
超高パフォーマンス(50) | 15.47円 |
超高パフォーマンス(60) | 17.85円 |
超高パフォーマンス(70) | 20.03円 |
超高パフォーマンス(80) | 22.61円 |
超高パフォーマンス(90) | 24.99円 |
超高パフォーマンス(100) | 27.37円 |
超高パフォーマンス(110) | 29.75円 |
超高パフォーマンス(120) | 32.13円 |