Virtual Machine Pinning 機能について

#はじめに
この記事は[Nutanix Advent Calendar 2015](http://www.adventar.org/calendars/1124)の12月22日分として作成しました。
今回はVirtual Machine Pinning機能について解説します。

先にお伝えしておきますと、この機能は執筆時点ではPrism(Web GUI)では設定できず、CLIのみの対応です。また、あらゆる場面で使うような汎用的なものではなく、特定の場面でピンポイントで使用するものですので、その点を踏まえて読んでいただければ幸いです。

#この機能が登場した背景
Nutanixの環境で使用されるディスクは、多くの場合SSDとHDDの混在構成です(一部モデルはオールフラッシュ)。SSDは単なるキャッシュ領域として使用されるのではなく、永続的にデータを保持するストレージとしても使用されます。データがSSDとHDDのどちらに配置されるかは、Controller VM(CVM)がデータの特性（ランダムデータかシーケンシャルデータか）やアクセス頻度、ディスクの使用状況などに応じて制御します。この制御はデータの階層化（Tiering）と呼ばれます。

SSDに空き容量があるうちはSSDが優先的に使用されますが、SSDがフルの場合にはアクセス頻度の低いデータが適時HDDに移されます。その場合当然I/Oパフォーマンスも変わってきます。

#機能概要
Tieringの影響を受けずに、常にSSDのハイパフォーマンスを享受したいVMに対して行う設定が『Virtual Machine Pinning』です。簡単に行ってしまえば、対象のVMのストレージをSSDに固定する（ピンを刺す＝Pinning）機能です。

なおPinningに使用できる容量は、クラスタ全体のSSD領域の25%が上限として決まっています。これはNutanixの仕組み上、CVMや管理データをSSD上に持っているのに加え、Write BufferやRead CacheなどI/O処理の最適化にSSDを使用していることから、PinningしていないVMのパフォーマンスに対する影響を抑えるために設定されているものです。

Virtual Machine Pinningの概要は[Acropolis Advanced Administration Guide](https://portal.nutanix.com/#/page/docs/details?targetId=Advanced_Admin-Acr_v4_5:wc_vm_pinning_wc_c.html)に記載されています。

名前としてはVirtual Machine Pinningですが、実際の設定はVirtual Diskに対して行います。Pinningの設定は大きく分けて以下の2つの方法があります。（意訳していますので、正式な情報は上のリンクを参照してください）
####Full Pinning
- 対象のVirtual Disk全体がSSDに固定される
- HDDへの移動は行われない
- SSD領域の使用率が100%を超えると以降のWriteに失敗するので要注意

####Partial Pinning
- 対象のVirtual Diskの一部がSSDに固定される
- SSDに固定するサイズを指定可能
- 指定サイズを超えたデータはHDDに移動される（ただしSSDに空きがある限りはSSDが使用される）
- SSD上にはVirtual Diskの中のHot Working Set（アクセス頻度の多いデータ）が優先的にが残される

#設定してみた
実際の環境で実行してみました。"（*ここを確認）"と書いた部分は次に打つコマンドで使用する部分です。

#### 1.virtual-diskのidを確認
```virtual-diskのidを確認
nutanix@NTNX-9671a9ce-A-CVM:192.168.10.251:~$ ncli

Welcome, admin
You're now connected to 1899600058729533791 (HomeCluster) at 127.0.0.1

ncli> vm list name="Win2012R2-Shimazaki"

    ID                        : 00052528-e26b-8a9c-1a5c-bc305be2915f::8d99fee4-ad01-4ba3-a21e-b592594659f1
    Name                      : Win2012R2-Shimazaki
    VM IP Addresses           : 192.168.10.223, 192.168.100.182
    Hypervisor Host ID        : 00052528-e26b-8a9c-1a5c-bc305be2915f::2
    Hypervisor Host Name      : NTNX-9671a9ce-A
    Memory                    : 2 GiB (2,147,483,648 bytes)
    Virtual CPUs              : 2
    VDisk Count               : 1
    VDisks                    : 00052528-e26b-8a9c-1a5c-bc305be2915f::NFS:137150（*ここを確認）
    Protection Domain         :
    Consistency Group         :

ncli> vdisk list names=00052528-e26b-8a9c-1a5c-bc305be2915f::NFS:137150

    Name                      : 00052528-e26b-8a9c-1a5c-bc305be2915f::NFS:137150
    UUID                      : d44bbd16-acc7-430d-a711-c34cf8906b56
    Container ID              : 00052528-e26b-8a9c-1a5c-bc305be2915f::745
    Max Capacity              : 40 GiB (42,949,672,960 bytes)
    Reserved Capacity         : -
    Read-only                 : false
    NFS File Name             : c0cd5ae9-cca8-47a1-8359-3d4f16fa61db（*ここを確認）
    NFS Parent File Name (... : 022b276b-b01c-4870-abce-bab43769ec81
    Fingerprint On Write      : none
    On-Disk Dedup             : none

ncli> virtual-disk list id=00052528-e26b-8a9c-1a5c-bc305be2915f::c0cd5ae9-cca8-47a1-8359-3d4f16fa61db

    Virtual Disk Id           : 00052528-e26b-8a9c-1a5c-bc305be2915f::c0cd5ae9-cca8-47a1-8359-3d4f16fa61db
    Virtual Disk Path         : /Container1/.acropolis/vmdisk/c0cd5ae9-cca8-47a1-8359-3d4f16fa61db
    Attched VM Name           : Win2012R2-Shimazaki
    Cluster Uuid              : 00052528-e26b-8a9c-1a5c-bc305be2915f
    Virtual Disk Capacity     : 42949672960
    Pinning Enabled           : False（*注：Pinningはデフォルトでは無効であることが確認できます）
```

####Pinningを有効化
`ncli virtual-disk tier-name=SSD-SATA id=<Virtual Disk Id> pinned-space=<Number of Pinned space in GiB> `

```
ncli> virtual-disk update-pinning tier-name=SSD-SATA id=00052528-e26b-8a9c-1a5c-bc305be2915f::c0cd5ae9-cca8-47a1-8359-3d4f16fa61db pinned-space=20

    Virtual Disk Id           : 00052528-e26b-8a9c-1a5c-bc305be2915f::c0cd5ae9-cca8-47a1-8359-3d4f16fa61db
    Virtual Disk Path         : /Container1/.acropolis/vmdisk/c0cd5ae9-cca8-47a1-8359-3d4f16fa61db
    Attched VM Name           : Win2012R2-Shimazaki
    Cluster Uuid              : 00052528-e26b-8a9c-1a5c-bc305be2915f
    Virtual Disk Capacity     : 42949672960
    Pinning Enabled           : True
    Tier Name                 : SSD-SATA
    Pinned Space              : 20 GiB (21,474,836,480 bytes)
```

####Pinningを無効化
`ncli virtual-disk tier-name=SSD-SATA id=<Virtual Disk Id> pinned-space=0`

```
ncli> virtual-disk update-pinning tier-name=SSD-SATA id=00052528-e26b-8a9c-1a5c-bc305be2915f::c0cd5ae9-cca8-47a1-8359-3d4f16fa61db pinned-space=0

    Virtual Disk Id           : 00052528-e26b-8a9c-1a5c-bc305be2915f::c0cd5ae9-cca8-47a1-8359-3d4f16fa61db
    Virtual Disk Path         : /Container1/.acropolis/vmdisk/c0cd5ae9-cca8-47a1-8359-3d4f16fa61db
    Attched VM Name           : Win2012R2-Shimazaki
    Cluster Uuid              : 00052528-e26b-8a9c-1a5c-bc305be2915f
    Virtual Disk Capacity     : 42949672960
    Pinning Enabled           : False
```

#おわりに
2015年12月現在のバージョン（Acropplis 4.5系）では、この機能はCLIのみで設定可能ですが、将来的にはGUIからの設定も可能になるかと思います。
ただし、NutanixはそもそもSSDとHDDを最適に使えるようにデータ配置を制御していますので「SSDレベルのパフォーマンスが必須！」というVMが少数ある場合にピンポイントで使うものだと思います。（先に書いた注意点からも、特にFull Pinningの濫用はお勧めしません。）

SSDレベルのパフォーマンスが必要なVMがたくさんある場合には、素直にオールフラッシュモデルを選択するのも1つの手ですし、それ以外のモデルも機種ごとにSSDとHDDの搭載本数や比率が異なっており、容量も選べる（SSDは1本あたり480GB~1.6TB、HDDは1本あたり1~6TB）ようになっていますので、柔軟な対応が可能です。最終的にはハードウェアのキャパシティがシステム全体の性能に大きくかかわりますので、最適なサイジングができるよう、導入ご検討の際にはご相談に頂ければ幸いです。