VMware ESXにおけるメモリ管理(3) - メモリに関する仮想化支援機能(Intel EPT/VPID, AMD RVI/Tagged TLB)

(1) - 序:他のリソースとの違いはなに?
(2) - 仮想化インフラにおけるメモリ管理って?
…の続きです。

Shadow Page Tableを使って「ゲストOS上のアプリケーション」のための仮想メモリ空間(Logical Page Numbers / LPNs)とHypervisorが管理する実メモリ空間(Machine Page Numbers / MPNs)のページ変換を直接的に紐づけている仕組みをハードウェア的に実装するとはどういうことでしょうか?
メモリ管理に関する仮想化支援機能には、IntelのEPT (Extended Page Table)と、AMDのRVI (Rapid Virtual Indexing)があります。
Intel EPTはその名が示すとおり、拡張されたページテーブルを実装することによりメモリのページテーブル変換の処理性能を事実上単一階層化する技術です。つまり、Intel EPTそのものはメモリにおけるページテーブル変換の性能を向上させるものではなく、ページテーブル変換が多層化することによるオーバーヘッドを(Shadow Page Tableのようなソフトウェア的な実装を用いることなく)発生させないようにする技術といえます。
Intelの仮想化支援機能であるIntel VTでは、リング階層とは全く別の仕組みであるVMX (Virtual Machine Extensions)によってVMX rootモードとVMX non-rootモードの2つのVMXモードを設けることによってハードウェアによる仮想化支援機能を実装しているわけですが、ゲストOSの実行モードであるVMX non-rootモードから特権命令を処理するためにVMX rootモードに移行する"VM exit"処理と、逆にVMM (Virtual Machine Monitor)による特権命令の処理が完了しVMX non-rootモードに戻る"VM entry"処理のそれぞれにおける「移行処理」にかかるオーバーヘッドは必ずしも小さくはありませんでした。

CPUの発展に伴い移行処理に要するオーバーヘッドは次第に改善されていき、Intel EPTを用いない理由はなくなりましたが、VMware ESXがIntel EPTに対応したのはそもそもがESX4.0からとなります。逆説的ではありますが、Intel EPTはメモリにおけるページテーブル変換時にVM exit処理が「なるべく実行されないように」するための実装ともいえます。

CPU世代ごとに、ESX4.0がEPTを用いるのか、それともShadow Page Table (SPT)を用いるのかについてはVMwareのウェブサイトhttp://communities.vmware.com/docs/DOC-9882にまとめられています。

この表にもあるとおり、EPTが積極的に使われるようになるのはCore-i7(Nehalem)以降のCPUが搭載されている場合のみとなります。
対するAMD RVIはIntel EPTに先駆けてESX3.5からサポートされていました。

基本的にはAMD RVIもIntel EPTとやっていることは同じで、メモリのページテーブル変換をハードウェアチップ回路で処理してしまう仕組みとなっています。
ここで示したように、ハードウェアによる仮想化支援機能を用いることが必ずしも処理性能を向上させるとは限らないわけですが、SPTとEPT/RVIを柔軟に使い分けられることもVMware ESXが他の仮想化ソフトウェアよりも優れている点の1つといえるかとは思います。
もう1つ、IntelAMDの双方が用意しているメモリに関するハードウェア支援実装がTLB (Translation Look-aside Buffer)の最適化に関する技術です。IntelはVPID (Virtual Processor ID)、AMDはTagged TLBと命名しています。TLBは前回Wikipediaへのリンクによって説明をしませんでしたが、要はCPUにおけるメモリページテーブルの変換バッファキャッシュです。TLBがあることによってOSは非常に高速なページテーブル変換を実現しています。仮想化環境においてTLBが問題になるのは、仮想マシンにおけるメモリページテーブルとHypervisorにおけるメモリページテーブルがそれぞれ異なるため、たとえばIntelの場合であれば、VMXモードの変移に伴ってTLBがフラッシュされてしまうことにあります。頻繁に発生するVMXモード変移のたびにTLBがフラッシュされてしまっていてはメモリ性能が大幅に低下してしまいます。
Intel VPIDはIDによって管理される複数のTLBを実装することによりこの問題に対応しています。Hypervisorが0番のIDを持つTLBを、各仮想マシンがそれ以外のIDのTLBを使用し、VMX non-rootモードでは各仮想マシンのTLBを、VMX rootモードではHypervisorのTLBを使うことによってTLBが都度フラッシュされてしまうことを抑止しています*1

AMD Tagged TLBもやっていることはおおよそ同じ。こちらは複数用意したTLBに対してタグをつけて仮想マシンとの紐付けを管理し、仮想マシン毎に紐づけられたTLBを使うことでTLBフラッシュを防ぐ仕組みとなっています。
今回はちょっとハードウェアよりの話だったので自分自身、書いていてちょっと難しかったです。次回は改めてVMware ESXの話に戻り、ESXホストがどのような仕組みでメモリを効率的に使うのか、一度割り当てたメモリをどのように「回収」しているのかなどの話に進みたいと思います。

*1:必要に応じてHypervisorは仮想マシン用のTLBを「意図的に」フラッシュすることも可能