使用 vSphere Client,您可以檢視有關記憶體配置設定的資訊並做出變更。若要有效管理記憶體資源,您也必須熟悉記憶體額外負荷、閒置記憶體稅以及 ESXi 主機回收記憶體的方式。

管理記憶體資源時,可以指定記憶體配置。如果未自訂記憶體配置,ESXi 主機會使用適用於大多數情況的預設值。

可以透過幾種方式指定記憶體配置。

  • 使用可透過 vSphere Client 存取的屬性和特殊功能。vSphere Client可讓您連線到 ESXi 主機或 vCenter Server 系統。
  • 使用進階設定。
  • 將 vSphere SDK 用於指令碼式記憶體配置。
備註: 在本章中,「記憶體」可指實體 RAM 或持續性記憶體。

瞭解記憶體額外負荷

記憶體資源的虛擬化會涉及一些關聯的額外負荷。

ESXi 虛擬機器可以引起兩種記憶體額外負荷:

  • 在虛擬機器內存取記憶體所需的額外時間。
  • ESXi 主機自身程式碼和資料結構所需的額外空間超出向每個虛擬機器配置的記憶體。

ESXi 記憶體虛擬化向記憶體存取新增很少的時間額外負荷。因為處理器分頁硬體直接使用分頁表 (以軟體為基礎的陰影分頁表方法或硬體輔助的兩層級分頁表方法),所以虛擬機器中的大多數記憶體存取在執行時不會產生位址轉譯額外負荷。

記憶體空間額外負荷有兩部分:

  • VMkernel 系統範圍內的固定額外負荷。
  • 每個虛擬機器的其他額外負荷。

額外負荷記憶體包含為虛擬機器框架緩衝區和各種虛擬化資料結構 (如陰影分頁表) 保留的空間。額外負荷記憶體取決於虛擬 CPU 數目以及為客體作業系統設定的記憶體。

虛擬機器上的額外負荷記憶體

若要開啟虛擬機器電源,需要一定數量的可用額外負荷記憶體。您應瞭解此額外負荷量。

虛擬機器所需的額外負荷記憶體數量取決於許多因素,包括 vCPU 數目與記憶體大小、裝置數目與類型、監視器使用的執行模式,以及虛擬機器的硬體版本。您所使用的 vSphere 版本同樣可能會影響所需的記憶體數量。VMX 會自動計算虛擬機器所需的額外負荷記憶體數量。

若要瞭解您的特定組態需要的額外負荷記憶體數量,請先開啟所涉及虛擬機器的電源。查看 vmware.log 檔案。當虛擬機器電源開啟時,其所需的額外負荷記憶體數量會列印到該記錄檔中。在該記錄檔內搜尋 VMMEM,以查看為虛擬機器保留的初始和精確額外負荷記憶體數量。

ESXi 主機如何配置記憶體

主機會將 Limit 參數所指定的記憶體配置給每個虛擬機器,除非記憶體過度認可。ESXi 向虛擬機器配置的記憶體永遠不會超過指定的實體記憶體大小。

例如,1 GB 虛擬機器可能具有預設限制 (無限制) 或使用者指定的限制 (例如 2 GB)。在這兩種情況下,ESXi 主機配置的記憶體永遠不會超過 1 GB,即不會超過為其指定的實體記憶體大小。

當記憶體過度認可時,為每個虛擬機器配置的記憶體數量介於保留限制指定的記憶體數量之間。授與虛擬機器且高於保留量的記憶體數量會因目前的記憶體負載而異。

主機根據配置給虛擬機器的共用率數值和對最近的工作集大小的估計,來確定每個虛擬機器的配置量。

  • 共用率 – ESXi 主機使用已修改的按比例共用記憶體配置原則。記憶體共用率授權虛擬機器一部分可用實體記憶體。
  • 工作集大小 – ESXi 主機透過在連續的虛擬機器執行期間內監控記憶體活動,來估計虛擬機器的工作集。採用快速回應工作集大小增加且慢速回應工作集大小減小的技術,在數個期間內估計順暢進行。

    該方法可確保虛擬機器開始更主動地使用其記憶體時,已經回收閒置記憶體的虛擬機器可以快速提高到以完整共用率為基礎的配置量。

    記憶體活動會受到監控,來估算預設的 60 秒期間內的工作集大小。若要修改此預設值,請調整 Mem.SamplePeriod 進階設定。請參閱 設定進階主機屬性

閒置虛擬機器的記憶體稅

如果虛擬機器未在使用目前所配置的所有記憶體,則相較於使用中的記憶體,ESXi 會對閒置記憶體收取更多的記憶體稅。這樣有助於防止虛擬機器囤積閒置記憶體。

閒置記憶體稅以漸進方式套用。有效稅率會隨著虛擬機器閒置記憶體對使用中記憶體的比率的提高而增長。(在不支援階層式資源集區的舊版 ESXi 中,以同等比率對虛擬機器的所有閒置記憶體徵稅。)

可以使用 Mem.IdleTax 選項來修改閒置記憶體稅率。將此選項與 Mem.SamplePeriod 進階屬性一同使用,可控制系統如何決定虛擬機器的目標記憶體配置。請參閱 設定進階主機屬性

備註: 在大多數情況下,沒有必要變更 Mem.IdleTax,如果變更的話,反而不合適。

VMX 分頁檔

使用虛擬機器可執行檔 (VMX) 分頁檔,主機可大幅減少為 VMX 程序保留的額外負荷記憶體數量。

備註: VMX 分頁檔與交換到主機交換快取功能或一般主機層級分頁檔不相關。

ESXi 出於多種原因會保留每個虛擬機器的記憶體。開啟虛擬機器電源時,將完全保留特定元件 (如虛擬機器監控器 (VMM) 和虛擬裝置) 所需的記憶體。但可以交換為 VMX 程序保留的部分額外負荷記憶體。VMX 交換功能大幅減少了 VMX 記憶體保留區 (例如,從每個虛擬機器大約 50 MB 或更多減少為每個虛擬機器大約 10 MB)。這樣可在主機記憶體過度認可時換出剩餘記憶體,從而減少了每個虛擬機器的額外負荷記憶體保留區。

如果開啟虛擬機器電源時有足夠的可用磁碟空間,主機便可自動建立 VMX 分頁檔。

記憶體回收

ESXi 主機可以從虛擬機器中回收記憶體。

主機會將保留指定的記憶體數量直接配置給虛擬機器。超出保留的任何部分都使用主機的實體資源進行配置,如果實體資源無法使用,則使用佔用或交換等特殊技術進行處理。主機可使用兩種技術,來動態增加或減少配置給虛擬機器的記憶體數量。

  • ESXi 系統使用記憶體氣球驅動程式 (vmmemctl),該驅動程式已載入到虛擬機器中執行的客體作業系統。請參閱 記憶體氣球驅動程式
  • ESXi 系統從虛擬機器將分頁換出至伺服器分頁檔,而無需客體作業系統參與。每個虛擬機器均有自己的分頁檔。

記憶體氣球驅動程式

記憶體氣球驅動程式 (vmmemctl) 與伺服器協同作業,可回收客體作業系統認為最不重要的分頁。

該驅動程式使用專屬佔用技術,提供在類似的記憶體限制下與原生系統的行為極為相似的可預測效能。此技術可增加或減少客體作業系統的記憶體壓力,使客體能夠使用自己的原生記憶體管理演算法。當記憶體容量吃緊時,客體作業系統會決定要回收哪些分頁,並在必要時將這些分頁交換到自己的虛擬磁碟上。

圖 1. 客體作業系統中的記憶體佔用

此圖說明客體作業系統中的記憶體佔用。
備註: 您必須設定客體作業系統具有足夠的交換空間。部分客體作業系統具有其他限制。

如有必要,您可以透過為特定虛擬機器設定 sched.mem.maxmemctl 參數,來限制由 vmmemctl 回收的記憶體數量。此選項指定了可以從虛擬機器回收的記憶體數量上限 (以 MB 為單位)。請參閱 設定進階虛擬機器屬性

在虛擬機器之間共用記憶體

許多 ESXi 工作負載存在跨虛擬機器 (以及在單一虛擬機器中) 共用記憶體的機會。

ESXi 記憶體共用做為背景活動執行,隨著時間的推移而掃描共用機會。儲存的記憶體數量隨著時間而變化。對於相當固定的工作負載,在利用所有共用機會之前,數量通常會緩慢增加。

若要確定給定工作負載記憶體共用的有效性,請嘗試執行工作負載,並使用 resxtopesxtop 觀察實際節省量。此資訊可在 [記憶體] 頁面中互動模式的 PSHARE 欄位中找到。

使用 Mem.ShareScanTimeMem.ShareScanGHz 進階設定,可控制系統掃描記憶體的速率,以識別記憶體共用的機會。

您也可以透過設定 sched.mem.pshare.enable 選項來對個別虛擬機器設定共用。

基於安全考量,虛擬機器間的透明分頁共用預設會停用,分頁共用僅限於虛擬機器內的記憶體共用。這表示,分頁共用並不會在虛擬機器之間發生,而僅會在虛擬機器內部發生。為協助解決系統管理員對於透明分頁共用可能產生的安全疑慮,引入了 Salting 的概念。Salting 使得參與透明分頁共用的虛擬機器,能夠比以往受到更細微的管理。使用新的 Salting 設定時,salt 值與分頁內容必須完全相同,虛擬機器才能共用分頁。若要啟用或停用 Salting,可以設定新的主機組態選項 Mem.ShareForceSalting

如需如何設定進階選項的相關資訊,請參閱vSphere 中的進階屬性

記憶體壓縮

ESXi 提供記憶體壓縮快取,可在使用記憶體過度使用時提高虛擬機器效能。記憶體壓縮預設為啟用。當主機記憶體過度使用時,ESXi 會壓縮虛擬分頁並將其儲存在記憶體中。

由於存取壓縮的記憶體比存取交換到磁碟的記憶體更快,因此,透過 ESXi 中的記憶體壓縮可以過度使用記憶體,但不會明顯影響效能。當需要交換虛擬分頁時,ESXi 會首先嘗試壓縮該分頁。可壓縮至 2 KB 或更小的分頁儲存在虛擬機器的壓縮快取中,從而增加主機的容量。

您可以使用 vSphere Client 中的 [進階設定] 對話方塊設定壓縮快取的大小上限並停用記憶體壓縮。

啟用或停用記憶體壓縮快取

記憶體壓縮預設為啟用。您可以使用 vSphere Client 中的 [進階系統設定] 來啟用或停用主機的記憶體壓縮。

程序

  1. vSphere Client 中,瀏覽到主機。
  2. 按一下設定
  3. 系統下,選取進階系統設定
  4. 找到 [Mem.MemZipEnable],然後按一下編輯按鈕。
  5. 輸入 1 啟用記憶體壓縮快取,或輸入 0 停用記憶體壓縮快取。
  6. 按一下確定

設定記憶體壓縮快取的大小上限

可以設定主機虛擬機器的記憶體壓縮快取大小上限。

您可以將壓縮快取的大小設定為虛擬機器的記憶體大小百分比。例如,如果輸入 20,而虛擬機器記憶體大小為 1000 MB,則 ESXi 最多可使用 200MB 的主機記憶體來儲存虛擬機器的壓縮分頁。

如果您未設定壓縮快取的大小,ESXi 會使用預設值 10%。

程序

  1. vSphere Client 中,瀏覽到主機。
  2. 按一下設定
  3. 系統下,選取進階系統設定
  4. 找到 Mem.MemZipMaxPct,然後按一下編輯按鈕。
    此屬性的值會決定虛擬機器的壓縮快取大小上限。
  5. 輸入壓縮快取的大小上限。
    此值是虛擬機器大小的百分比,必須介於 5% 到 100% 之間。
  6. 按一下確定

測量和區分各種記憶體使用量

vSphere Client效能索引標籤顯示了可用於分析記憶體使用量的多個度量。

某些記憶體度量用於衡量客體實體記憶體,而有些用於衡量機器記憶體。例如,可以使用效能度量進行檢查的兩種記憶體使用量為客體實體記憶體和機器記憶體。可以使用 [授與的記憶體] 度量 (對於虛擬機器) 或 [共用的記憶體] (對於主機) 來衡量客體實體記憶體。但是,若要衡量機器記憶體,請使用 [耗用的記憶體] (對於虛擬機器) 或 [共用的一般記憶體] (對於主機)。瞭解這些類型的記憶體使用量之間的概念差異,對於瞭解這些度量的衡量對象以及如何進行解釋十分重要。

VMkernel 會將客體實體記憶體對應到機器記憶體,但它們並不總是一對一對應。它可能會將客體實體記憶體的多個區域對應到機器記憶體的同一區域 (當存在記憶體共用時),或者未將客體實體記憶體的特定區域對應到機器記憶體 (當 VMkernel 換出或佔用客體實體記憶體時)。在這些情況下,個別虛擬機器或主機的客體實體記憶體使用量和機器記憶體使用量的計算方法有所不同。

請考慮下圖中的範例,該圖顯示了在某台主機上執行的兩個虛擬機器。每個區塊代表 4 KB 記憶體,每個色彩/字母代表相應區塊上不同的資料集。

圖 2. 記憶體使用量範例

此圖說明了兩台虛擬機器之記憶體使用量的範例。

可以按照如下方式確定虛擬機器的效能度量:

  • 若要判定虛擬機器 1 的 [授與的記憶體] (對應到機器記憶體的客體實體記憶體數量),請計算虛擬機器 1 的客體實體記憶體中的區塊 (含有指向機器記憶體的箭頭) 數目,然後乘以 4 KB。由於有五個區塊含有箭頭,因此 [授與的記憶體] 是 20 KB。
  • [耗用的記憶體] 是配置給虛擬機器的機器記憶體數量,包括從共用記憶體中節省的記憶體數量。首先,計算機器記憶體中的區塊 (含有從虛擬機器 1 的客體實體記憶體指出的箭頭) 數目。此類區塊有三個,但其中一個區塊與虛擬機器 2 共用。因此,計算兩個完整的區塊加上第三個區塊的一半,然後乘以 4 KB,最終得到總量為 10 KB 的 [耗用的記憶體]。
這兩個度量之間的重要差異是:[授與的記憶體] 計算在客體實體記憶體層級包含箭頭的區塊數目,[耗用的記憶體] 計算在機器記憶體層級包含箭頭的區塊數目。由於存在記憶體共用,這兩個層級的區塊數目有所不同,因此 [授與的記憶體] 和 [耗用的記憶體] 也不同。透過共用或其他回收技術節省了記憶體。
在判定主機的 [共用的記憶體] 和 [共用的一般記憶體] 時,會取得類似的結果。
  • 主機的 [共用的記憶體] 是每個虛擬機器 [共用的記憶體] 的總和。透過查看每個虛擬機器的客體實體記憶體,並計算含有指向機器記憶體區塊 (機器記憶體區塊本身也含有多個指向自己的箭頭) 的箭頭的區塊數量,進而計算出共用的記憶體。在此範例中,此類區塊有六個,因此,主機的 [共用的記憶體] 為 24 KB。
  • [共用的一般記憶體] 是由虛擬機器共用的機器記憶體數量。若要判定一般記憶體,請查看機器記憶體,並計算含有多個指向自己的箭頭的區塊數量。此類區塊有三個,因此,[共用的一般記憶體] 為 12 KB。
[共用的記憶體] 涉及到客體實體記憶體,即箭頭的起點。而 [共用的一般記憶體] 涉及到機器記憶體,即箭頭的目標點。

用於衡量客體實體記憶體和機器記憶體的記憶體度量可能會出現矛盾。實際上,它們衡量的是虛擬機器記憶體使用量的不同方面。透過瞭解這些度量之間的差異,可以更好地使用它們來診斷效能問題。

記憶體可靠性

透過記憶體可靠性 (也稱為錯誤隔離),ESXi在確定可能出現失敗以及已出現失敗時,停止使用部分記憶體。

在特定位址報告了足夠的已更正錯誤時,ESXi會停止使用該位址,防止已更正錯誤變成未更正錯誤。

記憶體可靠性提供了更高的 VMkernel 可靠性,而與 RAM 中已更正和未更正的錯誤無關。透過記憶體可靠性,系統還可避免使用可能包含錯誤的記憶體分頁。

修正錯誤隔離通知

藉助於記憶體的可靠性,VMkernel 可停止使用接收錯誤隔離通知的分頁。

當 VMkernel 從無法修正的記憶體錯誤中復原,VMkernel 因大量可修正錯誤而淘汰相當大比例的系統記憶體,或者存在大量無法淘汰的分頁時,使用者會在 vSphere Client中收到事件。

程序

  1. 空出主機。
  2. 移轉虛擬機器。
  3. 執行記憶體相關的硬體測試。

系統交換

系統交換是一個記憶體回收程序,可以利用整個系統內未使用的記憶體資源。

系統交換允許系統從記憶體取用者處 (非虛擬機器) 回收記憶體。啟用系統交換後,需要在回收其他程序記憶體的影響與將記憶體指派給可使用它的虛擬機器的功能之間進行權衡。系統交換所需的空間量為 1 GB。

記憶體的回收透過將資料移出記憶體並寫入背景儲存區實現。從背景儲存區存取資料的速度比從記憶體存取資料的速度慢,因此一定要仔細選取儲存交換資料的位置。

ESXi 可自動確定應儲存系統交換的位置,這是慣用分頁檔位置。選取某一組選項可幫助確定儲存位置。系統會選取最可行的選項。如果任何選項都不可行,則不會啟動系統交換。

可用選項包括:

  • 資料存放區 - 允許使用指定的資料存放區。請注意,無法為系統分頁檔指定 vSAN資料存放區或 VMware vSphere® Virtual Volumes™ 資料存放區。
  • 主機交換快取 - 允許使用部分主機交換快取。
  • 慣用分頁檔位置 - 允許使用為主機設定的慣用分頁檔位置。

設定系統交換

您可自訂用於判定系統交換位置的選項。

必要條件

編輯系統交換設定對話方塊中選取已啟用核取方塊。

程序

  1. vSphere Client 中,瀏覽到主機。
  2. 按一下設定
  3. 系統下,選取系統交換
  4. 按一下編輯
  5. 選取要啟用的每個選項所對應的核取方塊。
  6. 如果選取資料存放區選項,請從下拉式功能表中選取一個資料存放區。
  7. 按一下確定