[Cloud] 仮想化技術について

クラウド関連の話をするときに、もはや外すことができなくなってきている仮想化技術に説明します。

## 当記事の想定読者
想定読者としてはインフラエンジニア初心者やバックエンド寄りのソフトウェア開発者です。

## １．仮想の前に物理の話
仮想的なコンピュータについて話す前に、物理的なコンピュータについての話をしようと思います。

皆さんが普段使用しているPC（パーソナルコンピュータ）。
その中身を見たことがありますでしょうか？
大抵の人は興味がなければ見ないと思います。
そこで物理的なコンピュータについて主要な部品を解説したいと思います。
（利権周りが面倒なので画像は[いらすとや](https://www.irasutoya.com/)のものになります。実物はご自身で画像検索願います。）

### CPU

<img width="300" alt="computer_cpu.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73791/34db0306-b945-e70b-214c-2d085c169bde.png">

CPUは「Central Processing Unit」の略称であり、中央演算処理装置のことです。
CPUは命令を判断して処理する演算装置と、各装置に必要な指示を与える制御装置という2つの役割を担っています。

例えば、マウスを動かしたときの処理について考えます。
厳密な処理ではないですが、概ね以下のような処理をしています。

1. マウスを動かす
2. CPUがマウスの移動量を把握
3. マウスの移動量から画面上ののマウスカーソルの移動量を演算
4. 画面上のマウスカーソルを移動場所まで移動させる

この1.～4.の流れをわずか数ナノ秒～数マイクロ秒のうちに行っています。
そのため、CPUが高負荷時でなければラグなくマウスが移動しているように見えるわけです。
簡単な例でしたが、CPUはこれ以外にもコンピュータ上のすべての入出力の処理を行っています。

### メモリ（RAM）

<img width="300" alt="computer_memory.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73791/638f2132-1eaa-3f2c-f084-a2170ae31041.png">

ここで説明するメモリはRAM（Random Access Memory）のことです。
以降、「メモリ」との表記が出てきた場合はRAMと解釈してください。
因みに、普段皆さんが耳にする「USBメモリ」は「RAM」ではなく「フラッシュメモリ」です。

メモリはコンピュータの起動中に一時的に記憶するために使用される作業用の主記憶装置です。
このメモリ上のデータはコンピュータの電源が切れると、全て消失してしまいます。

主記憶装置というからには副記憶装置もあるのか？という疑問が思い浮かぶかもしれませんが、答えは「ある」です。
そして、副記憶装置ではなく「補助記憶装置」です。
補助記憶装置は後述するHDDやSSDなどがその役割を担っています。

例えばWindowsのメモ帳でメモを取っていたとしましょう。
この時、キーボードからの入力はCPUで処理され、メモ帳の画面上に文字が表示されます。
と同時に、このメモリ上にデータが保存されています。
そして、「名前を付けて保存」を行うことによって初めて、データが主記憶装置から補助記憶装置に保存されます。
メモリ上のデータはコンピュータの電源が切れると、全て消失してしまうので、こまめな保存が大切になるのです。

ではなぜ、この主記憶装置が必要なのかと疑問に思わないでしょうか？
補助記憶装置を主記憶装置として利用できないのか？と。
答えは、補助記憶装置の読み書きアクセス速度が遅すぎるから主記憶装置が必要なのです。

例えばメモリとしては最近主流の規格であるDDR4で一番遅い2133MHzの動作周波数のものですら、最大データ転送速度の理論値は17.02GB/sです（2020年4月現在）。
片や単体で最速の速度を誇る補助記憶装置としてNVMeタイプのSSDとして最速のものですら、最大データ転送速度の理論値は7.88GB/sとなります（2020年4月現在）。
4割程度の速度なら代替可能では？と思うかもしれませんが、超高速なSSDは高額な上に主記憶装置として利用できる接続規格も無いため、実質的には利用不可能です。
そして、もしもHDDしかなければ、さらに低速になります。

このメモリの容量が多いと一度に多くのアプリケーションを開くことができます。

### マザーボード

<img width="300" alt="computer_motherboard.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73791/097d01b0-39ef-9403-7365-0dd79483cd59.png">

マザーボードは物理的なコンピュータの土台のような役割を担っており、CPUやメモリや補助記憶装置等、物理的なコンピュータの構成するすべての部品を取り付けるための基盤（ボード）です。
様々な構成品を接続するためのソケットやスロット、コネクタやポートがついており、それぞれがCPUで処理できるようにプリント配線で接続されています。

### GPU（グラフィックカード）

<img width="300" alt="computer_graphic_card.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73791/6728aff8-4bd8-a5dd-fc04-4fc86d64191c.png">

GPUは「Graphics Processing Unit」の略称であり、リアルタイム画像処理に特化した演算装置です。
GPUを内蔵したCPUも存在しており、普段あまり気にしないことも多いと思われる装置です。

GPUが内蔵されていないCPUで映像出力をするためには、グラフィックカードと呼ばれるGPUを搭載した拡張カードが必要になります。
GPUは並列演算性能がCPUよりも優れているため、機械学習、とりわけ深層学習ベースのAI向けに利用されることが多くなってきています。
そのため、AI向けに特化したGPUを搭載するグラフィックカードも存在しています。

### 電源ユニット

<img width="300" alt="computer_dengen_unit.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73791/9375817e-a2eb-55e4-f0fc-381dc3ef5a94.png">

電源ユニットは交流電源（一般家庭のコンセントから出てくる電源）を直流電源に変換し、物理的なコンピュータの各部品に電源を供給する役割を担っております。

### HDD

<img width="300" alt="computer_harddisk.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73791/f6535b7b-3f9b-7973-7bbc-e54fb97791ad.png">

HDDはOSのデータやアプリケーションで作成されたデータを保存するために使用される補助記憶装置です。
特徴は低コストで大容量のデータを保存することができることです。
2020年4月時点で20TBもの容量を保存できるHDDが存在しています。

### SSD

<img width="300" alt="computer_ssd.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73791/fe6bf925-0e19-5a07-cd06-40e39786bc95.png">

SSDはOSのデータやアプリケーションで作成されたデータを保存するために使用される補助記憶装置です。
特徴は記憶領域に電源を切っても永続的に記憶可能なフラッシュメモリを利用し、HDDよりも高速にデータを読み書きできることです。
ただし、容量あたりの値段はHDDよりも高いです。

---

以上、物理的なコンピュータに搭載されている主要部品について解説してきました。
仮想的なコンピュータで主に議論の対象となるのはCPUとメモリです。
それでは、以上のことを踏まえて仮想的なコンピュータの話に移りたいと思います。

## ２．仮想化とは
仮想化とは端的に述べると**「リソースを抽象化すること」**です。
しかし、この説明では大半の方は意味不明だと思います。

少し話は変わりますが、日本語の「仮想」とは「virtual」の訳語です。
しかし、「[virtual](https://ejje.weblio.jp/content/virtual)」の英語としての本来的な意味は「事実上の、実際の」です。
「仮想」の意味に近しい「virtual image（虚像）」の用法は日常会話的にはあまり使われません。

そう捉えると、**仮想的なコンピュータ（virtual computer）とは「事実上の（物理的な）コンピュータ」と考えて問題ない**と思います。
そうです、仮想的なコンピュータもコンピュータで間違いないのです。

つまり、<font color="OrangeRed">**「リソースの抽象化」とは「その物理的なリソースと事実上何ら変わらぬ動作をするリソースのこと」**</font>です。
これが仮想化の本質です。

後は**リソースが何になるか？**ということを考えるだけです。
リソースが「コンピュータ」（virtual computer / virtual machine）を指すのか、「LAN」（virtual LAN = VLAN）を指すのか。
こう考えると仮想化の理解も進むと思われます。

では、具体的に仮想マシン（仮想的なコンピュータのことを以後このように表記します）について考えましょう。
仮想マシンは物理的なコンピュータ上に存在して、物理的なコンピュータと同様の振る舞いをします。
物理的な1台のコンピュータ上で、複数の仮想的なコンピュータ（仮想マシン）を運用することを**「コンピュータの仮想化」**と言います。

<img width="545" alt="virtual_machine.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73791/18da133a-92d0-3ce4-fd96-8f32c22ad468.png">

## ３．仮想化のメリット・デメリット
この章では説明においてはわかりやすさを重視するために、リソースをコンピュータに絞ります。

### ■仮想化のメリット

#### （１）リソースの有効活用
皆さんがPCを利用しているときのCPU使用率やメモリの使用量はどの程度でしょうか？
おそらくどんなに使用していても50%程度ではないでしょうか？
ネットサーフィンをするだけなら10%程度しか使っていないかもしれませんね。

ですが、CPUもメモリも100%の使用率になっていないのであれば、それはCPUやメモリのリソースが余っていると言えると思います。
そこで、物理的なコンピュータを仮想化して1台の物理的なコンピュータに集約することで、物理的なリソースを有効に活用することができます。
例えば、それぞれの仮想マシンのCPUやメモリの使用率が20%程度だったとしても、合計で80%・90%使用できていれば、それは物理的なコンピュータのリソースを有効に活用できていると言えるかと思います。
仮想化の最大のメリットはここにあると思っております。

#### （２）コストの削減
（１）が理解できれば簡単な話だと思います。
物理的なコンピュータを集約して仮想化したのですから、当然物理的なコンピュータの台数は減ることになります。
結果的に管理・運用コストやTCO（総保有コスト）の削減に繋がります。

#### （３）新規仮想リソースをすぐに準備できる
物理的なコンピュータを1台新たに準備するのはとても面倒なことです。
例えば、クライアントPCならまだしも、サーバならなおさら面倒です。

しかし、仮想マシンとなると管理ソフトウェアの操作やコマンドを実行するだけで簡単に準備する事ができます。
また、テンプレートという雛形の仮想リソースから簡単に新しい仮想マシンを準備する方法もあります。
新しいコンピュータが欲しいとなったときでも、すぐに準備できることは大きなメリットだと思います。

### ■仮想化のデメリット

#### （１）オーバーヘッドを常に考慮する必要がある
物理的なコンピュータとは違い、仮想的マシンを動作させるために仮想化ソフトウェアが処理に介在しています（後述）。
そのためオーバーヘッド（余分な処理）が発生し、その分物理的なコンピュータよりも全体的に処理が遅くなる可能性があります。

#### （２）適切にサイジングを行わないとパフォーマンスを発揮できない
物理的なコンピュータに対し余裕を持って仮想マシンの配置を行わないと正しくパフォーマンスを発揮できません。

例えば、仮想マシンが10台まで搭載可能な物理的なコンピュータがあったとします。
そこに20台仮想マシンを搭載したらどうなるでしょう。
お互いがお互いのリソースを食いつぶし合って、全ての仮想マシンで動作が遅くなる可能性があります。
このようなことが起こりえますので、仮想化システムの設計に際しては専門の技術者が適切に設計しなければなりません。

#### （３）障害対策が基本的に必須である
物理的なリソース側に障害が発生した場合、当然のことですが仮想的なリソース全てが巻き添えを食らうことになります。
したがって、可用性の担保やフォールトトレランスな設計が基本的に必須となります。

## ４．OS仮想化技術の種類
ここではOS仮想化技術の種類について解説します。
単に仮想化との用語が出た場合、OS仮想化を指すことが多いからです。

### （１）ハイパーバイザー
ハイパーバイザーには以下の2種類があります。
作成した仮想マシンでそれぞれのOS（ゲストOS）を動かすことができます。

* ハードウェアの上で直接稼働する（後述の**ネイティブハイパーバイザー**）
* 他のOSの上で稼働する（後述の**ホストハイパーバイザー**）

また、ゲストOSを修正せずそのまま稼働できる（ハードウェアを完全にエミュレートする）ものを**完全仮想化**、性能などの理由でゲストOSに修正が必要なものを**準仮想化**とも呼びます。

#### ネイティブハイパーバイザー

<img width="545" alt="hypervisor_center.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73791/9cec4678-afb6-8658-c8f2-64d9c58d9e0b.png">

ベアメタルハイパーバイザーとも呼ばれています。
ハイパーバイザーがハードウェア（物理HW）上で直接動作し、ゲストOSはそのハイパーバイザー上で動作します。

例：VMWare ESX, ESXi, vSphere / Microsoft Hyper-V / Xen / Kernel-based Virtual Machine(KVM)

#### ホストハイパーバイザー

<img width="545" alt="host.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73791/c088087d-2a38-e85b-3cf3-7ee86123e8c3.png">

ハードウェア（物理HW）上でまずホストOSが稼働し、その上で仮想化アプリケーション（ハイパーバイザーの役割）がホストOSのアプリケーションとして稼働します。
更に、仮想化アプリケーションの上でゲストOSを稼働させます。
狭義においてはハイパーバイザーに含まれません。
ハイパーバイザーに含まないと見做した時、「ホストOS型仮想化」と呼ばれることもあります。

例：VMware Workstation, Player, Fusion / Oracle VM VirtualBox

### （２）コンテナ仮想化

<img width="545" alt="container_center.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73791/6d9c4ac2-abfd-5f2e-ec18-21fcb4eac336.png">

ホストOSと同一のカーネルを使用し、カーネルのリソースを分割したユーザー空間上でプロセスを稼働させます。

例：Docker / LXC / OpenVZ

### ■ハイパーバイザーとコンテナ仮想化
比較のための図を記載します。

| ホストハイパーバイザー | ネイティブハイパーバイザー | コンテナ仮想化 |
|:---:|:---:|:---:|
| ![host.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73791/c088087d-2a38-e85b-3cf3-7ee86123e8c3.png) | ![hypervisor.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73791/b19884b6-9f52-66c7-de7b-38581524b6a7.png) | ![container.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73791/de566f1a-9ced-b3c4-4f99-331079445d52.png) |

ハイパーバイザーにおいては、必ず仮想化アプリケーションの処理がオーバーヘッド（余分な処理）としてのしかかってきます。
そのため起動速度や処理速度がコンテナ仮想化よりも遅くなります。
逆に、コンテナ仮想化はオーバーヘッドが少ない分ハイパーバイザーよりも高速です。

しかし、コンテナ仮想化にはさらなる欠点もあります。

* ユーザー空間上のプロセスへのリソース割当が苦手
* 異なるバージョンのカーネルを動かす事ができない

結論としましては、目的によって適切にハイパーバイザーとコンテナ仮想化を使い分けるべきだと思います。
ここの図には記載しきれていませんが、当然ハイパーバイザーとコンテナ仮想化を併用することもあります。
（ハイパーバイザーのゲストOS上でコンテナ仮想化を利用することです。）

## ５．OS仮想化の歴史
かなりざっくりですが、仮想化の歴史についてお話したいと思います。

実は仮想化の歴史は古く1958年まで遡ることができます。
世界初の電子式汎用コンピュータであるとされている「[ENIAC](https://ja.wikipedia.org/wiki/ENIAC)」が誕生してからわずか10年弱の年月しか経っていません。
この時はじめて仮想マシンがOS上で実行されました（厳密にはエミュレータです）。

それから更に約10年後、世界初のハイパーバイザー型仮想化OSである、「IBM z/VM」の源流にあたるCP-67が登場します。
この頃はまだメインフレーム上でしか仮想化は実行されていませんでした。
当然、コンピュータが一般的に（大企業にすら）普及していないからです。

メインフレーム上での仮想化技術の試行錯誤が汎用CPUを搭載したサーバでも有効的に利用されるようになるのが、1990年代後半から2000年代前半のことです。
最大の要因は、ハードウェア能力の拡大による1台当たりの同時処理量が増大したからだと思います。
結果、メインフレームではなく汎用CPUを搭載したサーバでも、仮想化が行われるようになっていきました。

2000年代後半、折しも世の中はインターネットの普及に伴って、汎用CPUを搭載したサーバの爆発的な数の増大が問題となっていました。
インターネットのアクセス数増大に伴って、必要とされるWebサーバの台数を増やさないといけなかったからです。
そこで、仮想化されたサーバを用いることによって増えすぎたサーバの統合を図るようになっていきました。

この増えすぎたサーバの統合ソリューションの1つとしてクラウドが登場します。

## ６．クラウドとの関係性
2000年代後半、AWSやGCPやAzureといったパブリッククラウドがサービスを開始しました。
そのサービス群を支えているのは当然仮想化技術です。

パブリッククラウド提供者は大量のリソースを準備し、そのリソースを数多の法人や個人に提供する。
まさに仮想化としてのメリットが多分に生かされたサービスです。

クラウドサービスはIaaS・PaaS・SaaSに分類されますが、そのリソース提供概要図を示すと以下のようになります。

<img width="600" alt="cloud_services" src="https://i.imgur.com/0GfoKVd.png">

青色が準備すべきリソースで、緑色がサービスとして提供されるリソースです。
いずれもVirtualization（仮想化）が含まれています。

そしてパブリッククラウドはこのVirtualizationレイヤー、つまりハイパーバイザー等を独自に実装しています。
なぜなら、限りなくオーバーヘッドを少なくして、効率よく物理リソースを利用するためです。
そういった努力のもとパブリッククラウドが成り立っているのですね。

## 最後に
仮想化（主にOS仮想化）に関する技術について簡単にですが解説いたしました。
「ネットワーク仮想化（SDN）」「Java仮想マシン」「論理ボリューム」などその他の仮想化技術の説明は話し始めるとキリがありませんので、ここでは割愛いたします。
インフラ関連について話をするときには、仮想化技術はもはや外せない項目になっていますので、是非理解しておくべきだと思います。
その理解の一助になれば幸いです。

## 参照文献
* [仮想化 - wikipedia](https://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E5%8C%96)
* [ハイパーバイザ - wikipedia](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%82%A4%E3%83%91%E3%83%BC%E3%83%90%E3%82%A4%E3%82%B6)
* [x86仮想化 - wikipedia](https://ja.wikipedia.org/wiki/X86%E4%BB%AE%E6%83%B3%E5%8C%96)
* [仮想機械 - wikipedia](https://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E6%A9%9F%E6%A2%B0)
* [各仮想化技術の違いをざっと理解するッ!! - Qiita](https://qiita.com/Hiroki-IT/items/0cea21a83394634d284a)
* [クラウドとは](https://altus.gmocloud.com/suggest/cloud/)
* [サーバーの仮想化とは？仕組み、メリット・デメリットをわかりやすく解説します](https://www.kagoya.jp/howto/rentalserver/virtualization/)
* [仮想化ソフトウェアの比較](http://changineer.info/server/virtualization/virtualization_diff.html)
* [画像参照元記事](https://digitalskynet.com/blog/cloud-service-models-saas-paas-iaas-which-is-better-for-your-business)