ブロック・ボリュームの新機能Elastic Performanceを調べてみたよ

# 1. はじめに

ブロック・ボリュームの新機能としてElastic Performanceが追加された（2019/11/14）。ブロック・ボリュームは、Computeのコア・コンポーネントなので、どのようなものなのか調べてみた。

* [Oracle Cloud Infrastructure Blog: Elastic Performance with the Next Generation Block Storage on Oracle Cloud](
https://blogs.oracle.com/cloud-infrastructure/elastic-performance-with-the-next-generation-block-storage-on-oracle-cloud)
* [OCIマニュアル: Block Volume Elastic Performance]
(https://docs.cloud.oracle.com/iaas/Content/Block/Concepts/blockvolumeelasticperformance.htm)

# 2. Elastic Performanceとは

Elastic Performanceとは、ブロック・ボリュームの性能に**Lower Cost**、**Balanced**（デフォルト）、**Higher Performance**という三つの性能レベルを導入することで、コスト最適化を図る機能だ。

性能数値の違いは表を見てもらうとして、おもな違いは以下のとおり。

<dl>
  <dt>Balanced</dt>
  <dd>従来と同じデフォルト設定で、ほとんどのワークロードに適している。</dd>
  <dt>Higher Performance</dt>
  <dd>大規模データベースなど、高いIOPS性能を求められるときに適している。</dd>
  <dt>Lower Cost</dt>
  <dd>ログやストリーミング、DHWなど、IOPSよりもスループットを重視する用途に適している。</dd>
</dl>

下表はマニュアルから引用
![blockperf03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/74773465-5d69-84a8-256c-839af80bcdd7.png)
<font color="blue">2021/06/10追記</font>
<font color="blue">上記に加え、現在は[Ultra High Performance](https://docs.oracle.com/en-us/iaas/Content/Block/Concepts/blockvolumeultrahighperformance.htm#Higher_Performance)が追加されています。</font>


# 3. Elastic Performanceの使いこなし

スペックだけ見せられても「フーン」で終わってしまうかもしれない。使いこなしを考えるには、ストレージの性能特性や価格も合わせて考える必要がある。

### 3-1. ストレージ性能に関する基礎知識

基礎知識として、以下のことを理解する必要がある。

* <font color="blue">ストレージの性能指標には、IOPS（ランダム・アクセス指向）と帯域幅／スループット（シーケンシャル・アクセス指向）がある</font>
* <font color="blue">VMシェイプでは、シェイプごとにネットワークの帯域幅が制限されている。例えば、VM.Standard2.1（1 Gbps）、VM.Standard2.2（2 Gbps）。[Compute Shapes→](https://docs.cloud.oracle.com/iaas/Content/Compute/References/computeshapes.htm)</font>
* <font color="blue">StandardIOシェイプは外部ストレージを利用しているので、ストレージの最大スループットはシェイプに依存する。例えば、高いスループットが必要なときは、CPUが低使用率でも大きなシェイプに変更する必要がある</font>
* <font color="blue">IOPS性能はストレージ・サイズに依存する。デフォルトは1GBytesあたり60 IOPS</font>

### 3-2. ストレージ価格も合わせて考える
次に価格も合わせて考えてみよう。比率列は、Block Volume（Balanced）を100としたときの割合である。

| ストレージの種類 | 1GB単価/月  | 比率 |
|:--|:-:|:-:|
| Block Volume (Balanced)| $ 0.0425  | 100  |
| Block Volume (Higher Performance)  | $ 0.0595  | 140  |
| Block Volume (Lower Cost) | $ 0.0255  | 60 |
| Object Storage  | $ 0.0255 | 60 |
| Archived Storage  | $ 0.0026 | 6 |

* [Oracle Storage Cloud Pricing→](https://www.oracle.com/cloud/storage/pricing.html)

**Archived Storage**は直接アクセスできないので、そもそも用途が異なる（事前にリストアが必要）。したがって比較対象から除外する。

注目すべきは<font color="red">**Lower Cost**</font>だ。**Object Storage**と同じ価格になっている。**Balanced**と比べてIOPSは開きがあるが、スループットの差は少ない。ログやDHWなどのシーケンシャル・アクセス・データや、安価なので、あまり使用しないデータに適している。

| Level | IOPS/GB | MAX Throughput/GB |
|:-:|:-:|:-:|
| Lower Cost| 2 | 240 |
| Balanced  | 60 | 480 |

次に<font color="red">**Higher Performance**</font>だ。スペックは以下のとおり。**Balanced**と比べて、性能は1.25倍になり、価格は1.4倍になる。スループットはシェイプに依存するので、高いIOPSが必要なときに適している。

| Level | IOPS/GB | MAX IOPS | MAX Throughput/GB |
|:-:|:-:|:-:|:-:|
| Higher Performance| 75 | 35,000 | 600 |
| Balanced  | 60 | 25,000 | 480 |

最後に<font color="red">**Object Storage**</font>と**Lower Cost**の使い分けだ。価格は同じだが、特性は大きく異なる。

**Object Storage**の特徴は「容量制限が無い」「可用性が高い」「比較的安価」「REST APIでアクセス」などがある。これらのメリットがある反面、一般的なアプリケーションからはアクセスできない、もしくはアクセスしづらいことが課題だ。

一般的なアプリケーションからオブジェクト・ストレージ上のデータに直接アクセスするには以下の方法がある。前者は安定性に課題があり、後者は追加のサーバーが必要になる。

* goofysやs3fs-fuseのような、S3互換マウントツールを使用する
* [Storage Gateway](https://docs.oracle.com/cd/E97706_01/Content/StorageGateway/Concepts/storagegatewayoverview.htm)を利用し、NFSサーバーのようにアクセスする

バックアップやログ、画像など、アクセス頻度が低いものや、高可用性が必要なデータが適している。

### 3.3. コストの計算方法

Elastic Performanceによって、Block Volume Performance Units（VPUs）という価格が導入された。先ほどは説明しないで単価を紹介したが、実際の計算式は次のとおり。

**<font color="blue">一カ月のコスト**
<font color="blue">＝ストレージサイズ［GB］×ストレージ単価＋ストレージサイズ［GB］×VPUs値×VPUs単価［GB］
<font color="blue">＝ストレージサイズ［GB］×（ストレージ単価＋（VPUs値×VPUs単価［GB］））</font>


Balancedの場合、VPUs値が10なので、1000GBのときは以下のように計算できる。

```
1000 * ($0.0255 + (10 * $0.0017))
 = 1000 * ($0.0255 + $0.017)
 = 1000 * ($0.0425)
 = $42.5
```

[Cost Estimator](https://www.oracle.com/cloud/cost-estimator.html)では、次のように入力する。
![block_cost01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/147a5cc9-51c1-569f-9379-798eae022c25.png)

### 3-4. ストレージの使い分けまとめ

これまでの検討内容をまとめると、次のようになるだろうか。

* 通常 → Block Volume (Balanced)
* アクセス頻度が少ない、シーケンシャル中心 → Block Volume (Lower Cost)
* 高いIOPSが必要 → Block Volume (Higher Performance)
* 高可用性・低価格 → Object Storage
* 高いスループット/帯域幅 → シェイプのアップグレード

# 4. 管理コンソールで確かめる

ボリュームのパフォーマンスは「新規作成時に指定」もしくは「既存のボリュームを変更」が可能だ。管理コンソールでブート・ボリュームもしくはブロック・ボリュームを選択し、**[Edit Size or Performance]**をクリックすると変更画面を表示できる。

![blockvol_resize02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/f7de14bd-0431-5249-9c16-4739cabc7b4e.png)
ブロック・ボリュームでは、Lower Cost、Balanced、Higher Performanceが選択できる。
![blockvol_resize04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/9f587d9b-4b15-bf90-9fdb-b60e7f6a8903.png)
ブート・ボリュームではBalanced、Higher Performanceが選択できる。
![blockvol_resize05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/c333bcee-e661-3531-8c64-d12b4cf2d9c8.png)
それぞれの画面で**[Save Changes]**をクリックすると動的に設定を変更できる。インスタンスの再起動は不要だ。

# 6. Auto Tuneについて

2020年7月からAuto Tune機能が付いた。これを有効にすると、ボリュームをデタッチすると自動でパフォーマンスがLower Costに変更されコスト削減できる。デタッチしたブロックボリュームを長期間保持するユースケースは少ないと思うが、そのようなときに便利だ。
![blockvolume-tune01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/a794a0fa-5d0c-1cf4-87fc-0e50450244d8.jpeg)

# 7. まとめ

* ブロック・ボリュームの新機能Elastic Performanceはコスト最適化に役立つ
* 新たにLower Cost、Balanced（デフォルト）、Higher Performanceという三種類の性能レベルが導入
* 新規作成ボリュームだけで無く、既存のボリュームも動的に変更できる
* Lower Costは、Object Storageと同じ価格で、シーケンシャル・アクセス・データに適している
* Higher Performanceは、IOPS性能が必要なときに適している。性能は1.25倍、価格は1.4倍