💻

ESXiのゲストOSからの容量解放をゆるく理解する

2024/05/26に公開

はじめに

シンプロビジョニングの場合、VMFS6ではゲストOSからのunmapコマンドによって容量を解放してくれますが、そのあたりの動作についてゆるく理解するために書き残します。

そもそも解放ってどういうこと?

VMwareでは仮想ディスクを作成する際、シックプロビジョニングかシンプロビジョニングかを選択することができます。シックだと最初からその分の容量がVMFSデータストア内に確保されますが、シンであれば使用している容量分しか確保されないため、ストレージ利用効率の向上が期待できます。ただし、ゲストOS側でのデータ削除によって、仮想ディスクがその容量分縮小されるとは限りません。ゲストOS側でこれだけ削除したから空きがでたというのをVMwareの世界で検知する必要があります。
VMFS6ではゲストOSがunmapコマンドを発行すれば、それをVMwareの世界で検知して、VMFSデータストアからその分の容量を解放してくれます。すなわち、仮想ディスクのサイズが縮小されます。[1]

Windowsだとファイル削除時にunmapコマンドが発行される

NTFSであれば、ファイルを削除した際、削除されたことを通知する設定にデフォルトでなっているようです。設定値は以下コマンドで確認できます。出力結果が0であれば有効となっています。

fsutil behavior query DisableDeleteNotify

Disables (1) or enables (0) delete notifications. Delete notifications (also known as trim or unmap) is a feature that notifies the underlying storage device of clusters that have been freed due to a file delete operation. In addition:[2]

For systems using NTFS, trim is enabled by default unless an administrator disables it.

なので、ファイルを削除すると、VMwareの世界でも検知して、シンプロビジョニングであれば、仮想ディスクが縮小されます。

Windowsのドライブの最適化でもunmapコマンドが発行される

ドライブの最適化は、デフォルトでも定期的に実行されています。設定状況は以下から確認できます。


この最適化処理は以下のタスクスケジューラと連動しています。
[タスク スケジューラ] → [タスク スケジューラ ライブラリ] → [Microsoft] → [Windows] → [Defrag] → SchduledDefrag

このタスクは以下のコマンドを実行しています。

defrag –c –h –k –g

/kはスラブ統合を実施するオプションで、/lオプションのTRIM処理(unmapコマンド発行)も含まれてます。[3]
なので、この最適化処理が実行されたタイミングで、VMwareの世界でも検知して、仮想ディスクが縮小される可能性があります。

なお、使用している領域をスラブという単位で割り当て、使用領域が増えたら必要な個数分スラブが割り当てられるという形でシンプロビジョニングを捉えているのがWindowsだとざっくり理解してます。/kオプション(スラブ統合)は、スラブ内のデータを整理し、空になったスラブを通知する(通知する部分は恐らく/lオプション)みたいな動きだと考えてます。

ちなみに削除されたことを通知する設定(fsutil behavior query DisableDeleteNotifyが0)になっていないと、ドライブの最適化を動かしてもunmapコマンドは発行されないようです。

Windowsの場合のまとめ

ディスク種別も意識してまとめると以下のように理解してます。

項番 ディスク種別 プロビジョニング ドライブの最適化 ファイル削除時の動作
1 HDD シック なし なし
2 HDD シン スラブ統合(TRIM) TRIM
3 SSD シック TRIM TRIM
4 SSD シン スラブ統合(TRIM) TRIM

シックプロビジョニングで構成している場合は、仮想ディスクは容量分確保されるため、減ることはないですが、SSDの場合は、空きブロック確保のためにTRIMが動作していると考えてます。[4](上記表の3)

なお、シックプロビジョニングでSSDを利用していて、TRIMを実行させたい場合、WindowsOSが該当ボリュームをSSDであると認識している必要があります。もしSSDと認識していない場合は以下サイトに記載の内容を実施するとよいかもしれません。
https://docs.vmware.com/jp/VMware-vSphere/7.0/com.vmware.vsphere.storage.doc/GUID-99BB81AC-5342-45E5-BF67-8D43647FAD31.html

Linuxでファイル削除時にunmapコマンドを発行するには

ディストリビューションによって若干違うところもあるかと思いますので、この後全て、RHELを想定して書きます。
Windowsのようにファイル削除時にunmapコマンドを発行するには、-o discardオプションを付けてマウントすれば良さそうです。

mount -o discard device mount-point

ただこの方法(Online discard)はあまり推奨されてない感はあります。[5]

Linuxで定期的にunmapコマンドを発行するには

Windowsのドライブの最適化のように定期的にunmapコマンドを実行させたい場合は、systemdタイマーを有効化すれば良さそうです。

systemctl enable --now fstrim.timer

有効化すると1週間に1回unmapコマンドを実行してくれます。以下コマンドで状況を確認することが可能です。

systemctl status fstrim.timer

LVM使っているときは

LVMを使っているときは、ここまで紹介した方法はサポートされてなさそうです。(VDOとか構成すればいけそうだが、未確認)
/etc/lvm/lvm.confにissue_discards = 1を入れて、いろいろ試しましたが、うまくいいきませんでした。やりようによってはLVM使っててもunmap実行させて、VMwareの世界に通知することもできるのかもしれませんが、そもそもゲストOS上でLVM組むのはどうかなと思っている派なので、深追いはしてません。

おわりに

昔はゲストOS上でゼロ埋めしてからESXi上でコマンド叩いてシンプロビジョニングディスクを縮小してましたが、もう結構よしなにやってくれる世界観になっているようでした。
なお、以下KBのように、複数処理のバッティングも今サポートしているESXiバージョンであれば特に意識しなくて良さそうですね。
https://knowledge.broadcom.com/external/article?legacyId=56608

脚注
  1. VMFS5でも要件を満たせばゲストOSのunmapコマンドにより容量解放が可能。https://docs.vmware.com/jp/VMware-vSphere/7.0/com.vmware.vsphere.storage.doc/GUID-5E1396BE-6EA8-4A6B-A458-FC9718E2C55B.html ↩︎

  2. https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/fsutil-behavior ↩︎

  3. -kと/kは同じオプション。 ↩︎

  4. SSDを利用している場合、上書きできないという特性から事前に削除して空きブロックを確保しておいた方が性能面で有利ということがあります。 ↩︎

  5. https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/9/html/managing_storage_devices/discarding-unused-blocks_managing-storage-devices とか https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/managing_storage_devices/discarding-unused-blocks_managing-storage-devices とか ↩︎

Discussion