OCI のベアメタルインスタンスは起動までにどのくらいかかる？

# はじめに
Oracle Cloud Infrastructure(以後OCIと記載)では、IaaS サービスにおいて一般的な VM インスタンスだけでなく、ベアメタルインスタンスを提供しています。
「クラウドでベアメタル？」と思われる方もいるかも知れませんが、パフォーマンスが要求されるワークロードやハイパフォーマンスコンピューティング分野、VMware サービスの基盤などなど幅広い用途で利用されています。

# なぜ調べようと思ったのか
IaaS において一般的な VM インスタンスは1分程度で起動してきます。
約1分ですので、例えば Web UI でインスタンスを作成し、作成された IP を確認し、ターミナルを開いて ssh コマンドを実行したころには接続が可能な状態になっています。

それに対してベアメタルインスタンスは物理サーバの電源スイッチ On から始まりますので VM インスタンスしか触ったことのない方は「あれ、まだインスタンスが上がってこない・・・」という状況になってしまいます。

また、ハイパフォーマンスコンピューティングでは複数のベアメタルインスタンスを利用するので、別途そのような仕組みがあります。

よく「どのぐらいで上がってくきますか？」というご質問を頂くので、現在の最新ベアメタルインスタンスでどのくらい起動に時間が掛かるか計測してみました。
OCI でベアメタルインスタンスを利用の際はこの結果を参考にして頂ければと思います。

# どのようなベアメタルインスタンスがあるか？
OCI で利用可能なベアメタルインスタンスは大きく以下の3つに大別されます。
- 標準シェイプ
    - Intel や AMD、 Arm を搭載したベースとなるシェイプ
- Dense I/O シェイプ
    - 標準シェイプの一部に対して NVMe を搭載したシェイプ
- GPU シェイプ
    - 標準シェイプの一部に対して GPU を搭載したシェイプ
- HPC シェイプ
    - HPC ワークロードに特化したシェイプ。RDMA I/F や NVMe を搭載している。

詳細なスペックについては、以下のドキュメントを参照してください。
https://docs.oracle.com/ja-jp/iaas/Content/Compute/References/computeshapes.htm#baremetalshapes

## 計測対象のインスタンス

| シェイプ名 | Core 数 | メモリ容量(GB) | 物理 NIC | その他デバイス |
|:-:|-:|-:|-:|:-|
| BM.standard.E4.128 | 128  | 2048  | 50Gb x2  | NA |
| BM.Standard3.64  |  64 |  1024 | 50Gb x2  | NA  |
| BM.Standard.A1.160  | 160  | 1024  |  50Gb x2 | NA  |
| BM.DenseIO.E4.128  | 128  | 2048  | 50Gb x2  |  - NVMe x8 |
| BM.GPU4.8  | 64  | 2048 | 50Gb x1 | - A100 GPU x8<br> - RDMA 100Gb NIC x16<br> - NVMe x8 |
| BM.GPU.A10.4  | 64  | 1024  | 50Gbx2  |  - A10 GPU x4<br> - NVMe x2 |
| BM.Optimized3.36  | 36  | 512GB  | 50Gb x2  | - RDMA 100Gb NIC x1<br> - NVMe x1  |


# 起動時間の予想してみよう
OCI には上記のような様々なベアメタルインスタンスがありますが、起動に必要な時間はどのようになるでしょうか。

これまで x86 サーバや SPARC サーバまで物理サーバを触ってきた経験から、規模が大きい、デバイス数が多いほど POST の時間が長い傾向があると思っています。

そう考えると、おそらく一番起動に時間が掛かるのは BM.GPU4.8 で、一番速いのは BM.Optimized3.36 または BM.Standard3.64 でしょうか。

# 計測方法
インスタンスが起動した時間と起動が完了した時間は以下のように設定しました。
## 起動開始の時刻
OCI ではインスタンスを作成すると画面には Launch time が記録されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108605/87b9b9d3-53f0-0ba2-0419-8d6278550e19.png)

これはまさにインスタンスを作成をしたタイミングの時刻となりますので、これを利用します。

ベアメタルなので、この時刻がいわゆるサーバの Power On ボタンを押したタイミングとご理解ください。それにより BIOS が起動し POST が走り、Bootloder が起動され OS が起動します。

## 起動完了の時刻
起動完了は OS が起動完了した時刻にしたいと思います。
それをどこで判断するかはいくつかあると思いますが、今回は cloud-init に以下を設定し、その時刻を OS 起動が完了した時刻としたいと思います。

```
#!/bin/bash
date > /var/tmp/time.txt
```

## その他条件
起動時間に影響する要素として OS があります。
どの OS のどの ver を利用するかで起動時間は変動するので、今回は OCI として標準の Oracle Linux 8.7 で計測をいたします。
シェイプによっては GPU や RDMA I/F など特殊なデバイスを実装しており、それによって利用する OS の種類を変える必要があります。今回の計測では以下の OS Image を利用しました。
| シェイプ種類 | OS Image 名 |
|:-|:-|
| 標準シェイプ(x86)  | Oracle-Linux-8.7-2023.05.24-0  |
| 標準シェイプ(Arm)  | Oracle-Linux-8.7-aarch64-2023.05.24-0 |
| Dense I/O シェイプ  | Oracle-Linux-8.7-2023.05.24-0  |
| GPU シェイプ  | Oracle-Linux-8.6-Gen2-GPU-2023.05.24-0  |
| HPC シェイプ  | Oracle-Linux-8.7-2023.05.24-0 |



# 計測結果
## 単体インスタンスの結果

| シェイプ名 | 所要時間 |
|:-|-:|
| BM.Optimized3.36   | 255秒 (4分15秒)  |
| BM.GPU.A10.4       | 263秒 (4分23秒)  |
| BM.Standard3.64    | 289秒 (4分49秒)  |
| BM.Standard.A1.160 | 309秒 (5分09秒)  |
| BM.standard.E4.128 | 361秒 (6分01秒)  |
| BM.DenseIO.E4.128  | 378秒 (6分18秒)  |
| BM.GPU4.8          | 777秒 (12分57秒) |

## Cluster Network での結果
Cluster Network とはハイパフォーマンスコンピューティング分野で利用される環境を作成するための仕組みです。
現状、Cluster Network に対応している最新のシェイプは以下の通りです。
- BM.Optimized3.36
- BM.GPU4.8

この仕組みを利用すると、複数のインスタンスを一度に作成でき、そのインスタンスでは RDMA I/F が構成されます。

構成方法としては大きく2種類あり、それぞれの方法で`BM.Optimized3.36`を対象に 1 〜 32 インスタンスを構成し起動時間を確認しました。
また、Cluster Network では専用の OS Image が必要となり、 `OracleLinux-8-RHCK-OFED-5.4-3.6.8.1-2023.01.10-0` を利用しました。

計測方法としては単体インスタンスと同じですが、Cluster Network では複数のインスタンスを起動することになるので、起動完了時刻については一番起動時間が遅かったインスタンスの時間を採用することにしました。

### 手動構成
シンプルに複数のインスタンスをまとめて作成する、というのがこの構成方法になります。
Web コンソールから構成する方法で、詳細は以下のチュートリアルをご確認ください。

https://oracle-japan.github.io/ocitutorials/hpc/spinup-cluster-network/

#### 手動構成による計測時間
| インスタンス数 | 所要時間 |
|-:|:-:|
| 1  | 322秒 (5分22秒)  |
| 2  | 313秒 (5分13秒)  |
| 4  | 307秒 (5分7秒)   |
| 8  | 335秒 (5分35秒)  |
| 16 | 336秒 (5分36秒)  |
| 32 | 382秒 (6分22秒)  |

### HPC Cluster デプロイ
HPC Cluster というのは、ハイパフォーマンスコンピューティングですぐに利用できる環境を構築することができます。
上記の手動構成と比較し、Cluster Network の構成からジョブスケジューラや LDAP、共有ファイルシステムなどのセットアップを含み、それらと Terraform と Ansible で自動構成します。
詳細については以下のチュートリアルをご確認ください。

https://oracle-japan.github.io/ocitutorials/hpc/spinup-hpc-cluster-withautoscaling/

#### HPC Cluster 構成による計測時間

| インスタンス数 | 所要時間 |
|-:|:-:|
| 1  | 654秒 (10分54秒)  |
| 2  | 636秒 (10分36秒)  |
| 4  | 682秒 (11分22秒)  |
| 8  | 742秒 (12分22秒)  |
| 16 | 814秒 (13分34秒)  |
| 32 | 1072秒 (17分52秒) |

# 最後に
まず、計測結果を見て概ね私の感覚は合っていたとホッとしました。

OCI では VM と同じ手順でベアメタルインスタンスインスタンスを簡単に作成し利用することができます。
今回の計測でほとんどのベアメタルインスタンスが5分前後、巨大なインスタンスでも約13分で起動し、利用できることが分かりました。

OCI のベアメタルインスタンスの特徴などについては以下を参照ください。
https://www.oracle.com/jp/cloud/compute/bare-metal/