目錄表

VMware不使用vmem檔

緣由

VMware在虛擬機開機的時候,會在虛擬機所在的資料夾內建立vmem檔案。該檔案大小可能與虛擬機所設定的記憶體大小相同,目的是備份虛擬機記憶體的內容。也就是說,虛擬機每次記憶體的操作行為,實體記憶體與實體硬碟都會收到一次存取請求。虛擬機在進行快照的時候,VMware也會拷貝虛擬機記憶體內容到實體硬碟。這也間接導致實體硬碟的性能對於虛擬機的影響巨大(虛擬記憶體+虛擬硬碟),若VMware SWAP記憶體不在固態硬碟的話效果就會很差。

限制

以下的設定主要建立在VMware on Windows,對於虛擬機本身要有以下的認知。

  1. 虛擬機的作業系統重視記憶體的存取:有些作業系統為了提昇效能,會盡可能使用記憶體作為快取。所以降低VMware對虛擬記憶體的干預確實可以提昇效能,前提是虛擬機的記憶體要給足夠(否則虛擬機的作業系統還是會在虛擬硬碟上規劃SWAP來用)。
  2. 快照的使用:有些虛擬機的目的為測試不可逆的行為(例如系統升級、電腦病毒投放),快照可以保留行為前的狀態(包含記憶體與硬碟的資料)。此時的效能可以考慮用固態硬碟補足,也方便減少多次測試的時間。
  3. 多個相同作業系統虛擬機同時運作:VMware為了上多台虛擬機能夠運行流暢,有做過記憶體的共享以及實體記憶體與SWAP的分配。此時建立的作業系統會專注在CPU的效能,這些最佳化選項提供的幫助就有限。

目前的解法

由於此功能對於一些舊型的作業系統影響不大(Vista以前),所以這裡偏好對虛擬機單獨設定。

步驟

  1. 進入虛擬機所在的資料夾(對著虛擬機右鍵→“Open VM Directory”)
  2. 用文字編輯器打開該虛擬機的vmx設定檔(對著該檔案右鍵→開啟檔案→記事本)
  3. 在內容最後的部份新增以下的內容後存檔
snippet.conf
prefvmx.minVmMemPct = "100"
MemTrimRate = "0"
mainMem.useNamedFile = "FALSE"
sched.mem.pshare.enable = "FALSE"
prefvmx.useRecommendedLockedMemSize = "TRUE"

設定說明

prefvmx.minVmMemPct[與不使用VMware SWAP相關]

預設為50,讓VMware知道此虛擬機的虛擬記憶體要分配多少到實體記憶體上。在預設值下,8GB的虛擬記憶體就會使用4GB的實體記憶體與4GB的VMware SWAP記憶體(建立在實體硬碟上)。所以這裡設定100的目的是把所有虛擬記憶體設定到實體記憶體,也就不會動用到VMware SWAP記憶體。

MemTrimRate[與虛擬記憶體存取相關]

預設為-1,當虛擬機有閒置的記憶體時,VMware會將這些閒置的部份回收給實體作業系統。如果將此選項設定為0,VMware將不會進行此回收機制。

mainMem.useNamedFile[與不使用vmem檔相關]

預設為開,讓VMware在虛擬機所在位置建立vmem檔案,用以存放VMware SWAP記憶體。如果將此選項設定為false,VMware SWAP記憶體會交由作業系統決定(Windows會放到pagefile.sys、Linux會放到/tmp資料夾)。如果你的實體作業系統在固態硬碟(虛擬作業系統在機械硬碟)的話,可以只使用這方法提升效能。

sched.mem.pshare.enable[與虛擬記憶體存取相關]

預設為開,讓VMware為了記憶體共享進行快取,以便多處理器進行存取。目前看到此功能在多個相同規格的虛擬機(尤其是相同作業系統)的幫助較大,但對於單一作業系統的影響較小。關閉此選項的話會讓VMware強制關閉虛擬作業平台的虛擬記憶體管理分享裝置,也能減少VMware對記憶體進行重複存取的機會。

prefvmx.useRecommendedLockedMemSize[與虛擬記憶體存取相關]

預設為關,若虛擬機無法從實體記憶體獲取所需的虛擬記憶體大小時,虛擬機會動態調配自身部份虛擬記憶體到VMware SWAP,以便從實體記憶體獲取剩餘的記憶體分配。開啟此選項會造成虛擬機必須取得足量的實體記憶體分配才能開機,也能阻止虛擬記憶體被縮小的可能。

實際測試結果

結論

若在個人使用單一虛擬作業系統上,只要Host的資源(CPU, 記憶體, 硬碟)充足,讓虛擬機自行管理資源才能獲得最佳的效能。若是要相容一些特殊的作業系統,VMware(或其他虛擬化軟體)提供的功能(包含硬體兼容、快照)才是虛擬機需要的部份。

相關連結