Oracle Cloud(OCI)のBlock Volume の性能動的スケーリングを試してみた

本記事は[Oracle Cloud Infrastructure Advent Calendar 2022](https://qiita.com/advent-calendar/2022/oci)と、[JPOUG Advent Calendar 2022](https://adventar.org/calendars/7680)の三日目の記事となります。
Oracle Cloud Infrastructure Advent Calendar 二日目の記事はshukawamさんの記事「[OCI Search Service with OpenSearch を使うための最低限の環境を IaC 化した](https://qiita.com/shukawam/items/4e6866dbf3d65d6657ec)」、JPOUG Advent Calender 二日目の記事はcharade_oo4oさんの記事「[Oracle on Hyper-V 2022](http://charade.seesaa.net/article/493717357.html)」でした。


# はじめに
2022年8月の終わりに、[OCI Block Storageの自動チューニングによる動的パフォーマンス・スケーリング](https://blogs.oracle.com/oracle4engineer/post/ja-ann-dynamic-performance-scaling)が発表された。
他のパブリッククラウドの場合だと、基本的に高性能なブロックボリュームディスクのプロビジョニングは先に実施しておかねばならず、また、IOPSを消費するとその分課金される仕組みであることが多い。
OCIの性能が動的にスケーリングされるブロックボリュームがどのように動作するのか、確認してみた。

# [動的パフォーマンス・スケーリングとは？](https://docs.oracle.com/ja-jp/iaas/Content/Block/Tasks/autotunevolumeperformance.htm)
動的パフォーマンス・スケーリングは2つのタイプからなる。
1. パフォーマンス・ベースの自動チューニング
    - 該当のボリュームでモニターされたパフォーマンスに基づき、指定したレベルの中でボリュームのパフォーマンスが調整される
1. デタッチ済ボリューム自動チューニング
    - 該当のボリュームとインスタンスがアタッチされているかデタッチされているかに基づいて、ボリュームのパフォーマンス・レベルが調整される

###### VPUについて
VPUとは[ボリューム・パフォーマンス・ユニット](https://docs.oracle.com/ja-jp/iaas/Content/Block/Concepts/blockvolumeperformance.htm#perf_levels)のことであり、OCIのブロックボリュームのパフォーマンスを表す。
VPUを追加しボリュームに追加のリソースを割り当てることにより、IOPS/GBおよびGB当たりのスループットを増やすことができる。（減らすことも可能）

- [VPU当たりのIOPS](https://docs.oracle.com/ja-jp/iaas/Content/Block/Concepts/blockvolumeperformance.htm#perf_levels)
![05-VPU.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/fb6fb676-d857-2b83-eeaf-11fb752db0ae.png)
- [VPU当たりの費用](https://www.oracle.com/cloud/storage/pricing/)
![05-VPU-Price.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/aeb6ebe7-fc83-ca60-877a-44290f3cddfe.png)

###### 超高パフォーマンスの制限
コンピュート・シェイプによってネットワーク帯域に制限があるのは周知の話だが、高性能なブロック・ボリュームのマウントの際にはもう一つ制限がある。
その制限はマルチパス対応の有無となり、マルチパスが対応しているシェイプでないと、超高パフォーマンスとして設定されている30VPU以上のボリュームをマウントしても、20VPUまでしか性能がでない、というものになる。
マルチパス対応の制限の説明は[超高パフォーマンス・ボリュームのためのアタッチメントの構成](https://docs.oracle.com/ja-jp/iaas/Content/Block/Tasks/configuringmultipathattachments.htm#multipath)に記載がある。
通常のVMシェイプの場合、16OCPU以上が搭載されているシェイプでないと、マルチパス非対応となる。
また、ボリュームのアタッチ方法によってサポートされるOSが変わってくる、等の制限がある。


## 1. [パフォーマンス・ベースの自動チューニング](https://docs.oracle.com/ja-jp/iaas/Content/Block/Tasks/autotunevolumeperformance.htm#perf)
パフォーマンス・ベースでの自動チューニングでは、ボリュームで実際にモニターされたパフォーマンスに基づき、指定したレベルの中でボリュームのパフォーマンスが調整される。
パフォーマンスを上げるための調整は数十秒単位で繰り返され、パフォーマンスを下げるための調整は、最初の調整が有効になるのが1時間以内で、その後の調整は数分で実施される。

## 2. [デタッチ済ボリューム自動チューニング](https://docs.oracle.com/ja-jp/iaas/Content/Block/Tasks/autotunevolumeperformance.htm#detached)
本機能ではボリュームがデタッチされるとパフォーマンス・レベルが「より低いコスト」(0VPU/GB)に調整される。ボリュームがデタッチされた14日後に「より低いコスト」へのパフォーマンス調整が開始される。

また、ボリュームが再アタッチされると、デフォルトのVPU/GB設定で指定されたパフォーマンス・レベルに戻る。こちらは再アタッチ直後に調整される。

# パフォーマンスベースの自動チューニングを試してみた
1.の「パフォーマンス・ベースの自動チューニング」について、OCIの環境で確認を行った。
検証の流れは以下。

1. デフォルトのブロックボリュームと、動的パフォーマンス・ボリュームを作成し、仮想マシンにアタッチする
1. それぞれのボリュームに1GBのファイルをddで作成し、負荷をかける
1. それぞれのボリュームのスループットと、動的パフォーマンス・ボリュームのスケール状況を確認する

#### 検証環境
検証環境は以下。
- 仮想マシン：VM.Standard.E2.1.Micro(前述の通りマルチパス非対応シェイプのため、～20VPUの確認となる)
    - デフォルトのブロックボリューム：　50GB　10VPU
    - 動的パフォーマンス・ボリューム：　50GB　10～120VPU
    
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/36c7ffab-8e0f-e21e-336c-04f49ab1447f.png)



## デフォルトのボリュームの作成
ブロックボリューム作成時に「デフォルト」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/59f5c3db-7d43-3a99-d48e-39d5cf6d6d8b.png)


## 動的パフォーマンス・ボリューム作成
ブロックボリューム作成時に「カスタム」を選択し、パフォーマンス・ベースの自動チューニングを「オン」に設定するとデフォルト・最大のVPU/GBを選択できるようになる。
通常時のVPU/GB、最大VPU/GBをそれぞれ選択することが可能となる。
なお、デタッチ済ボリューム自動チューニング機能もこの画面の下のトグルを「オン」にすることで設定することが可能となる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/c251e75e-cf6b-b340-dbde-5e1a83000454.png)

## 作成したボリュームの確認
作成したデフォルトのボリュームと、動的パフォーマンス・ボリュームはそれぞれ以下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/0c42662f-586c-3004-529c-c8bd95496b7c.png)

## 各ボリュームへの負荷がけの実施
ddコマンドにてそれぞれのボリュームに1GBのファイル作成を行った。
結果、以下のように動的パフォーマンスボリュームの方が若干性能が向上している。
- デフォルトのボリューム

```SHELL
$ sudo dd if=/dev/zero of=/mnt/bv1/dummy bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 38.5024 s, 27.2 MB/s
```

- 動的パフォーマンス・ボリューム

```SHELL
$ sudo dd if=/dev/zero of=/mnt/bv2/dummy bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 36.5389 s, 28.7 MB/s
```

## 各ボリュームの負荷がけ後の状況確認
負荷がけ後、動的パフォーマンス・ボリュームは「**より高いパフォーマンス(VPU/GB):20**」に変化した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/3b3513f2-56a6-8e8a-10cb-1b2f159f4f04.png)

また、この状態で再度動的パフォーマンス・ボリュームに負荷がけを行うと、1回目に比べてさらに性能が向上していた。
```SHELL
$ sudo dd if=/dev/zero of=/mnt/bv2/dummy bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 29.7642 s, 35.2 MB/s
```

まとめると、動的パフォーマンス・ボリュームはスループットが向上していることが確認できる。
|ボリューム|回数|所要時間(秒)|スループット(MB/s)| 
|-|-|-|-|
|バランス|1|38.5024|27.2| 
|バランス|2|37.382|28.1| 
|バランス|3|38.2707|27.4| 
|動的パフォーマンス|1|36.5389|28.7| 
|動的パフォーマンス|2|29.7642|35.2| 
|動的パフォーマンス|3|30.3904|34.5| 

#### 負荷がけとスケーリングの関係
負荷がけのタイミングから少なくとも１分以内にはパフォーマンスがチューニングされていることが確認できていたため、改めてどの程度の負荷で、どのくらいのタイミングでチューニングが行われるのかを確認する。
負荷のサイズを少しずつ増加させて確認したところ、300MBの負荷(約10秒間の負荷がけ)でチューニングが発生した。
また、チューニングされるタイミングは、負荷がけ開始のタイミングから**約30秒後**となっていた。

ちなみにチューニングが発生するタイミングはOCI監査で**com.oraclecloud.BlockVolumes.UpdateVolume.end**のTypeを検索すると確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/3e880467-185b-f341-559a-a8a5a68d2cb8.png)
```JSON
      "stateChange": {
        "current": {
          "VPU": 20
        },
        "previous": {
          "VPU": 10
        }
      }
```

また、ガイド通り約1時間でチューニングが戻ることも確認できた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/7602417f-c492-fa49-5952-be037172f984.png)
```JSON
      "stateChange": {
        "current": {
          "VPU": 10
        },
        "previous": {
          "VPU": 20
        }
      }
```

# まとめ
Oracle CloudのBlock Volumeの性能動的スケーリングを確認した。
性能チューニングは約30秒程度で実行され、特にユーザ側は気にすることなくチューニングの恩恵を受けることができた。
この機能を利用することで、必要なタイミングで必要なだけ性能を確保することができ、細かいチューニングや比較的高価な高性能ボリュームの予約をすることなく必要な性能を確保することができる。
超高パフォーマンス（VPU>30）を利用する場合にはいくつか制限があるが、利用できる環境の場合にはAutonomousな恩恵を享受できるため、高性能が必要な可能性がある場合には設定しておいて損はないと考えている。