ESXiでのバルーニングはいつ起こるのか

VMware vSphereのハイパーバイザーESXiでは、オーバーコミット環境で仮想マシン間に適切にメモリを割当るため、透過的ページ共有（TPS: Tranceparency Page Sharing）、バルーニング、圧縮、スワップといったメモリ回収機能があります。これらはいつ動作するのでしょうか。以下の記事やドキュメントからまとめてみます。

* [Mem.MinFreePct sliding scale function - VMware vSphere Blog](https://blogs.vmware.com/vsphere/2012/05/memminfreepct-sliding-scale-function.html)
* [Mem.MemMinFreePct calculation example | VMwarebits.com](http://vmwarebits.com/content/memmemminfreepct-calculation-example)
* [VMware vSphere: What's New [V5.5 to V6]](https://mylearn.vmware.com/mgrreg/courses.cfm?ui=www_edu&a=det&id_course=273794)研修資料

# メモリ回収機能のトリガー

ESXiには「minfree」と呼ばれる、最低限確保しておこうとする最小空きメモリ量があります。この量は搭載された物理メモリ量に応じて決まり、例えば物理メモリ96GBのホストであれば、デフォルトでは約1.56GBになります。

ESXiでは残りの空きメモリ量が、この最小空きメモリ量minfreeの何%あるかに応じてメモリ状態を呼び分け、透過的ページ共有、バルーニング、圧縮、スワップのどのメモリ回収機能までを使うかを決めています。

vSphere 5の場合、次のようになります。ただし透過的ページ共有は、下記の空きメモリ量を何度か下回った時に開始されます。

|空きメモリ量|状態|使用するメモリ回収機能|
|---|---|---|
|minfreeの100%以下|High|透過的ページ共有|
|minfreeの64%以下|Soft|透過的ページ共有、バルーニング|
|minfreeの32%以下|Hard|透過的ページ共有、バルーニング、圧縮|
|minfreeの16%以下|Low|透過的ページ共有、バルーニング、圧縮、スワップ|

vSphere 6.0の場合、次のようになります。

|空きメモリ量|状態|使用するメモリ回収機能|
|---|---|---|
|minfreeの300%以下|High|透過的ページ共有の準備（Large Pageの分割）|
|minfreeの100%以下|Clear|透過的ページ共有|
|minfreeの64%以下|Soft|透過的ページ共有、バルーニング|
|minfreeの32%以下|Hard|透過的ページ共有、バルーニング、圧縮|
|minfreeの16%以下|Low|透過的ページ共有、バルーニング、圧縮、スワップ|

例えば、物理メモリ96GBのホストであれば、minfreeはデフォルトでは約1.56GBなので、メモリ空き容量がその64%である約1GBを切るとバルーニングが発生する計算になります。

# minfree値の確認

それでは、実際の（物理メモリ量が96GBではない）ESXiホストでは、minfreeはいくつで、バルーニングはいつ発生するのでしょうか。

## 実機での確認

もっとも簡単で確実な方法は、ESXi ShellまたはSSHでESXiホストに接続し、`esxtop`コマンドを実行し、`m`キーでメモリ画面に移動して、そこに表示されている実際の値を確認することです。以下がそうした例です。

     2:00:31am up 28 days 18:50, 881 worlds, 25 VMs, 53 vCPUs; MEM overcommit avg: 0.37, 0.37, 0.37
    PMEM  /MB: 122869   total: 3683     vmk,112420 other, 6766 free
    VMKMEM/MB: 122484 managed:  1839 minfree, 16605 rsvd, 105879 ursvd,  high state
    NUMA  /MB: 61428 ( 5786), 61439 (  596)
    PSHARE/MB:   13263  shared,    1836  common:   11427 saving
    SWAP  /MB:       7    curr,       0 rclmtgt:                 0.00 r/s,   0.00 w/s
    ZIP   /MB:       3  zipped,       2   saved
    MEMCTL/MB:       0    curr,       0  target,   78312 max
     6988733  6988733 vCenterSV          11   74.08  119.71    0.07  989.62    1.1
    
         GID NAME               MEMSZ    GRANT     CNSM    SZTGT     TCHD   TCHD_W
      360483 VM-0001         16384.00 16305.27 10020.59 10117.69   983.04   163.84
     7030413 ESXiSV01        16384.00  4128.00  3182.19  3520.49   163.84     0.00
     8243506 vCenter Server  16384.00 16384.00 16007.18 16033.14  2785.28  1638.40

3行目に`1839 minfree`とあります。1,839MBが最小空き容量minfreeの値ということになります。物理メモリ量120GBのこの環境では、例えばメモリ空き容量が1,839MBの64%に当たる約1,177MBを切ったあたりで、バルーニングが発生する計算になります。

## 物理メモリと設定値からの計算

実機で確認できない場合、物理メモリ量と設定値から計算することができます。ここで使用する設定値は、ESXiホストの詳細設定パラメータである`MemMinFreePct`（最小空きメモリ%）です。デフォルト値は0ですが、この時は6%として扱われます。

`MemMinFreePct`が6%の時、MinFreeは物理メモリの最初の4GBに対して6%、次の8GB（つまり4～12GBの分）に対して4%、次の16GB （つまり12～28GBの分）に対して2%、残りに対して1%を足した分になります。ややこしいですね。できるだけ簡単に計算できるように整理すれば、次のようになります。

|物理メモリ量|計算方法|計算結果例|
|---|---|---|
|～4GB|物理メモリ量×6%|物理メモリ4GBの時、約246MB|
|12GB|（物理メモリ量-4GB）×4%＋245.76MB|物理メモリ12GBの時、573MB|
|28GB|（物理メモリ量-12GB）×2%＋573.44MB|物理メモリ28GBの時、901MB|
|それ以上|（物理メモリ量-28GB）×1%＋901.12MB|物理メモリ120GBの時、1,843MB|

前述の`esxtop`で実際の値が1,839MBなのを確認した環境は、物理メモリ120GBです。最後の行の計算結果例が1,843MBで、だいたい一致しています。より正確には、`esxtop`で表示されている`VMKMEM/MB: 122484`の値、122,484MBから計算すると、1,843MBとなります。

これで机上計算からも、minfreeの値と、バルーニングが発生するメモリ空き容量を算出できました。

# 参考

* [Mem.MinFreePct sliding scale function - VMware vSphere Blog](https://blogs.vmware.com/vsphere/2012/05/memminfreepct-sliding-scale-function.html)
* [Mem.MemMinFreePct calculation example | VMwarebits.com](http://vmwarebits.com/content/memmemminfreepct-calculation-example)
* [VMware vSphere: What's New [V5.5 to V6]](https://mylearn.vmware.com/mgrreg/courses.cfm?ui=www_edu&a=det&id_course=273794)研修資料

----
本ページ内容は作成者の個人的なメモです。内容を保証するものではありません。また作成者の所属組織等とは一切かかわりがありません。