VMware vSphereのハイパーバイザーESXiでは、オーバーコミット環境で仮想マシン間に適切にメモリを割当るため、透過的ページ共有(TPS: Tranceparency Page Sharing)、バルーニング、圧縮、スワップといったメモリ回収機能があります。これらはいつ動作するのでしょうか。以下の記事やドキュメントからまとめてみます。
- Mem.MinFreePct sliding scale function - VMware vSphere Blog
 - Mem.MemMinFreePct calculation example | VMwarebits.com
 - VMware vSphere: What's New [V5.5 to V6]研修資料
 
メモリ回収機能のトリガー
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
 - Mem.MemMinFreePct calculation example | VMwarebits.com
 - VMware vSphere: What's New [V5.5 to V6]研修資料
 
本ページ内容は作成者の個人的なメモです。内容を保証するものではありません。また作成者の所属組織等とは一切かかわりがありません。