vSphere 8.0 U3のメモリ階層化(Memory Tiering)を有効にしてみた

この投稿は、[vExperts Advent Calendar 2024](https://adventar.org/calendars/10310 "vExperts Advent Calendar 2024")の16日目です。

## 1. はじめに
VMware vSphere 8.0 U3では、さまざまな新機能が追加されました。その中でもTech Previewとして追加された「メモリ階層化 (Memory Tiering)」は、NVMeストレージをメモリの延長として利用することで、効率的なリソース管理とコスト削減を実現します。

今回は、Nested環境でこの機能を試してみたので、設定内容などを共有します。

ただ、前提として、お伝えしておきますが、今回は物理の環境は用意できてませんので、Nested環境で検証してしまいました。
本来、Nested環境はサポートされていません。
メモリ階層化用NVMeデバイスは指定のサポートされたデバイスを使用する必要があります。

そのため、実際の挙動とは異なる可能性があることをあらかじめご了承ください。

機能の概要やサポートされるデバイスの詳細については、以前投稿した[こちら](https://qiita.com/dayama/items/634a869a5c51af059d7b "vSphere 8.0 U3 メモリ階層化(Tech Preview)")の記事ご確認ください。

## 2.使用した環境

使用した環境は以下のNestedです。
OS：ESXi 8.0 U3b
CPU：4コア
メモリ：32GB
メモリ階層化用のNVMeドライブ：350GB
※今回は、ホスト4台構成のvSphere/vSAN環境の内、1台を使用します

#### 環境の事前準備
Nested ESXiの仮想マシン自体にNVMeドライブ(350GB)を追加しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385304/67cd2923-02c4-9033-b5c1-877046b94fbf.png)

## 3.実際にやってみた

対象のESXiのメモリを最初にチェックしておきます。
32GBです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385304/e8f76c7f-607f-9211-0439-c2b7a7d6539b.png)

事前に追加したNVMeデバイスを認識しているか確認します。
vSphere Clientから対象のESXiホストの[構成]-[ストレージデバイス]の画面を開きます。
350GBのデバイスが追加されていることがわかります。
この際、識別子とローケーション（パス）を控えておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385304/addb755f-ee8d-6473-46a7-5fec6cd3d268.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385304/9cc30e2f-0260-34be-00f3-80bdf61af946.png)

※対象のデバイスにてパーティションが作成されている場合は、削除しておく必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385304/22a683a8-82aa-4a4c-18c1-e8a726b739d5.png)

既存のメモリ情報を確認しておきます。
ESXiホストを選択し、[構成]-[ハードウェア]-[概要]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385304/4d610e1a-9a83-747c-c504-aa2ee00cd4e2.png)


対象のホストをメンテナンスモードにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385304/5d0fcc8c-82cb-7d8f-3be5-23f3fb92e772.png)

SSHでログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385304/7ec259e2-e19b-6c4e-88f4-db3a137abe6b.png)

ESXCLIで、NVMeデバイスに「ティアパーティション (Tier Partition)」を作成します。
```
esxcli system tierdevice create -d <NVMeデバイスのパス>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385304/1a4f7dc9-7db5-adf1-818f-d4305792e00d.png)

メモリ階層化を有効にします。
```
esxcli system settings kernel set -s MemoryTiering -v TRUE
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385304/3d556b9c-1804-685f-9e49-db79b9c97767.png)

再起動します。
```
reboot
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385304/088bd63e-17e0-ee93-2380-c7f66ea2b2d5.png)

ESXiホストのストレージデバイスの画面を再度確認すると、対象のデバイスのデータストア列が「メモリ階層化に使用」になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385304/f2ee8cbf-ab97-179c-d257-31798f8691ae.png)

vSphere Clientで、ESXiホストを選択し、[構成]-[ハードウェア]-[概要]をクリックします。
メモリの合計が、8GB加算され40GBに増えています。かつ、メモリ階層化の情報が記載されています。
※なぜ8GBなのかについては後ほど解説します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385304/bb015b5f-c386-8739-6036-b88c8d3b2562.png)

ESXiのDCUIを直接確認しても40GBでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385304/e10f2fc7-591e-61d6-d70e-3547f4c232a5.png)

メモリ階層化を有効にすることができました。

## 4.疑問点
有効にできましたが、私は単純に既存の「32GB」メモリに「350GB」のNVMeデバイスを追加したので合算され「382GB」メモリになるのでは？と思ってしまっていました。
しかし、実際は、NVMeデバイスの領域から8GBが加算される結果でした。

こちらについてですが、メモリ階層化では、DRAM（Tier 0）とNVMe（Tier 1）を組み合わせて使用しますが、NVMeの容量が無制限に加算されるわけではありません。
デフォルト設定では、NVMeの利用可能な容量はDRAMの「25%」に制限されています。
この設定値は「Mem.TierNvmePct」で管理されており、今回の場合、32GB（DRAM）の25%である「8GB」がNVMeから利用されるようになったということです。

試しに、以下のコマンドで「Mem.TierNvmePct」の値を「50%」に変更してみます。
```
esxcfg-advcfg -s 50 /Mem/TierNvmePct
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385304/35ab5f68-e43e-60b6-820f-e1e43ca799ed.png)

再度、リブートして、メモリ量を確認してみます。NVMeのメモリ量が「8GB」→「16GB」に増量していることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385304/99153728-80f2-96bf-192a-df05cefdf3d6.png)

メモリ階層化では、NVMe全体をそのままメモリとして使うわけではなく、一定の割合に基づいて計算される仕組みになっています。この制限は、NVMeがDRAMほど高速ではないため、システム全体の性能を維持するための設計と考えられます。
なお、「Mem.TierNvmePct」は、最大400%まで設定可能ですが、上記の通り実際に使用するケースはなさそうです。

（参考）400%に設定した合計「160GB」（32GBに400%加算）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385304/44c7d457-a625-2bf4-78c8-722c2f9e3b1c.png)

一応、Windows Server OSの仮想マシンにメモリ100GBを割り当ててみましたが、しっかり反映されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385304/50898c04-f653-b58b-69a5-3db526ea13a1.png)

## 5.まとめ
今回、vSphere 8.0 U3の新機能（Tech Preview）であるメモリ階層化 (Memory Tiering) の設定方法、実際の動作結果について確認しました。この機能により、DRAMとNVMeの組み合わせによる柔軟なメモリ管理が可能になり、特にメモリリソースが限られる環境で有効であることがわかりました。

今回の検証のポイントを以下に記載します。
・Mem.TierNvmePctの設定
デフォルトではDRAMの25%に相当するNVMe容量が使用されます。そのため、より多くのメモリ量を設定したい場合は、この設定を調整することで、NVMeの利用効率をさらに高めることが可能です。

・Tier Partition の役割
NVMeデバイスをMemory Tieringに適用するためには、専用のTier Partitionが必要です。これにより、NVMe全体をメモリとして使用するわけではないという設計上の制限も理解できました。

・性能への影響
NVMeはDRAMほど高速ではないため、NVMeがメモリとして使用される場合、特定のワークロードでレイテンシの増加が発生する可能性があります。適切な設定と用途の選定が重要です。

メモリ階層化は、現在はTech Previewの段階であり、本番環境での利用は推奨されていません。
しかし、リソース効率を高め、総所有コスト (TCO) を削減する可能性があるとされているため、今後の正式リリースに期待します。

## 6.参考情報
今回の検証をするにあたって参考にした情報を記載します。

Using the "Memory Tiering over NVMe" feature in vSphere 8.0 Update 3.
https://knowledge.broadcom.com/external/article?legacyId=95944
※上記のリンク先からPDFをダウンロードすると詳細の制約や手順を確認できます。