尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

VMware虚拟化引擎三项设置详解:VT-x/EPT、性能计数器与IOMMU

VMware虚拟化引擎三项设置详解:VT-x/EPT、性能计数器与IOMMU 每次给VMware虚拟机调配置很多人都会卡在“处理器”那一栏的“虚拟化引擎”里盯着三个复选框发呆虚拟化 Intel VT-x/EPT、虚拟化 CPU 性能计数器、虚拟化 IOMMU。这三个选项听起来都像跟虚拟化有关但到底各自管什么什么时候该勾勾了会不会有副作用不勾又会遇到什么问题网上一搜要么是安装教程里一句带过的“建议全勾”要么是英文文档里绕来绕去的术语轰炸。我折腾VMware Workstation和ESXi这些年踩过不少跟这三个选项直接相关的坑比如虚拟机里装Docker Desktop起不来、KVM嵌套虚拟化直接报错、客户机里跑性能分析工具数据全部失真。这篇文章就把这三个选项掰开揉碎讲清楚看完你就能按自己的使用场景做决定了。1. 三个选项躺在设置面板里多数人不知道它们各自管什么在动手勾选之前先明确一件事这三个选项出现在VMware的虚拟机设置里并不是让你用来调优“宿主机”的而是VMware在替你的虚拟机向物理CPU申请三种不同的“特权能力”。所以理解它们的起点是先想清楚一个底层问题——虚拟机里的操作系统凭什么能跑在物理 CPU 上现代CPU有内核态ring 0和用户态ring 3的权限划分操作系统内核运行在ring 0可以执行特权指令。但虚拟机里的客户机操作系统也以为自己在ring 0它执行的那些特权指令真实物理CPU是不会直接放行的。那VMware怎么处理早期的做法是二进制翻译VMware的成名技术运行时把客户机内核里的特权指令逐条翻译成安全指令再执行相当于给每个特权操作雇了个同声传译性能损耗很大。后来Intel和AMD在硬件层面给出了更好的方案Intel叫VT-xAMD叫AMD-V。CPU增加了VMX根模式和非根模式两种运行状态VMM虚拟机监控器跑在根模式客户机跑在非根模式。客户机执行敏感指令时CPU会自动暂停非根模式的运行切换到根模式让VMM去处理这个切换叫VM Exit处理完再切回去叫VM Entry。这个机制就是虚拟机设置里三个选项的第一块地基没有这个地基后面两个选项无从谈起。在VMware Workstation里“虚拟化引擎”区域在虚拟机设置 - 处理器 页面下方。三个复选项分别对应三类能力虚拟化 Intel VT-x/EPT 或 AMD-V/RVI是否向虚拟机暴露CPU的硬件虚拟化扩展指令和扩展页表能力。虚拟化 CPU 性能计数器是否允许客户机直接访问物理CPU的性能监控单元PMU。虚拟化 IOMMU是否向客户机暴露I/O内存管理单元能力对应Intel VT-d和AMD-Vi。下面逐个拆解。2. Intel VT-x/EPT虚拟机的“特权通行证”也是嵌套虚拟化的前提2.1 为什么要单独勾选VT-x很多人在VMware里装64位系统时遇到过提示“此主机支持Intel VT-x但Intel VT-x被禁用”。这句话有两层含义物理CPU本身支持VT-x但BIOS里被关掉了或者实体机整体不支持。对VMware来说如果物理CPU没有开启VT-x它还能用二进制翻译把虚拟机跑起来但性能会明显下降——这也是很多老机器跑VMware卡顿的原因之一。当你勾选了“虚拟化 Intel VT-x/EPT”VMware会允许客户机直接使用CPU的VMX指令和EPT页表扩展。这里的EPT对应选项里的“EPT”Intel的Extended Page TablesAMD对应RVI/NPT。如果没有EPT虚拟机里的每个内存访问都要经过VMM用软件维护的影子页表做一次地址转换CPU的TLB快表命中率会很难看。有了EPT客户机的虚拟地址到物理地址的转换直接由硬件MMU完成虚拟机内存访问速度和实体机几乎持平。所以这个选项的关键意义可以拆成两层给客户机操作系统提供了“支持虚拟化”的CPUID标志。像Hyper-V、KVM、VirtualBox这些跑在客户机里的虚拟机软件会通过CPUID查询CPU是否支持虚拟化查不到就直接拒绝启动。给客户机提供了接近原生的页表翻译性能。即使你不做嵌套虚拟化只是跑普通Linux/Windows勾上EPT也能让内存密集型应用有明显改善。2.2 嵌套虚拟化的硬性要求热搜词里有“VMware workstation 在此主机上不支持嵌套虚拟化。模块‘hv’启动失败”这个报错几乎百分之百跟没正确勾选VT-x有关。所谓嵌套虚拟化通俗说就是“虚拟机里再开虚拟机”你在VMware Workstation里跑了一个Linux虚拟机然后在这个Linux虚拟机里又装KVM或QEMU想继续叠一层虚拟化。KVM启动时会在客户机内部执行VMXON指令这条指令需要物理CPU的VMX模式支持再由VMware把这种能力透传给客户机。如果VMware没把VT-x暴露给客户机客户机里的KVM就会直接报“KVM: disabled by bios”或类似错误。同理在VMware虚拟机里启用Windows的Hyper-V、安装WSL2的虚拟机平台、跑Docker DesktopWindows版依赖WSL2/Hyper-V全部依赖这一层VT-x透传。我自己的实测经验是在VMware Workstation 17里跑一个Windows 11虚拟机然后在里面启用Hyper-V再开WSL2除了勾选“虚拟化 Intel VT-x/EPT”还得注意几个配套条件客户机Windows里要关闭“基于虚拟化的安全性VBS”或者至少也要调整Hypervisor启动策略否则WSL2的“虚拟机平台”会和VBS抢资源经常出现“无法启动因为此计算机上未启用虚拟化”的误报。宿主机BIOS里VT-x必须处于开启状态这一点人人皆知但很多人忽略了Intel的BIOS选项有时叫“Intel Virtualization Technology”有时叫“VT-x”还有的板子藏在“Advanced CPU Configuration”里AMD平台则叫“SVM Mode”。VMware的虚拟化引擎下方还有一个“向客户机操作系统公开硬件辅助虚拟化”的说明文字意味着这台客户机本身可以作为VMM再去跑虚拟机。2.3 勾了VT-x会不会有性能损失很多人会担心开了硬件虚拟化反而让虚拟机变慢。这个问题实际上要分情况看。对于绝大多数普通负载开启VT-x/EPT不会带来可以感知的损失相反由于省去了二进制翻译和影子页表的开销整体是净收益。但有一种情况需要注意当客户机是同一个操作系统且使用了大量的系统调用时VT-x的VM Exit频率会很高极端场景下虚拟化层开销会占几个百分点。不过这个损失跟二进制翻译相比小得多属于可接受的工程代价。所以我的建议是除了极其特殊的嵌入式或实时场景VT-x/EPT默认勾选就好。3. CPU性能计数器不是给你看任务管理器用的而是给性能分析工具开的一扇门3.1 性能计数器是什么CPU内部有一组被称为PMUPerformance Monitoring Unit的硬件单元包含一系列性能计数寄存器可以记录各种微架构事件缓存未命中次数、分支预测失败次数、指令周期数CPI、TLB未命中次数、浮点运算次数等等。系统级性能分析工具比如Intel VTune、perf、AMD uProf就是靠读取这些硬件计数器来分析程序瓶颈的而不是简单用时间戳做粗略统计。问题在于这些计数器数据位于CPU的特定MSRModel Specific Registers寄存器里。在虚拟机里客户机如果直接去读写这些MSR会有两个问题一是物理CPU的PMU寄存器状态可能被其他虚拟机或VMM自身污染数据不准确二是完全暴露MSR给客户机存在安全隐患。所以VMware默认不让客户机直接访问物理PMU。当你勾选了“虚拟化 CPU 性能计数器”VMware会向客户机虚拟化或直通PMU接口让客户机里的性能分析工具能读到真实的硬件计数数据。这正是这个选项的核心价值它是面向 profiler 和性能调优场景的不是让你在虚拟机里打开任务管理器看一下CPU占用率用的。任务管理器里的CPU百分比是操作系统通过调度统计算出来的跟硬件性能计数器没有直接关系。3.2 为什么默认是关闭的既然性能计数器对分析工具有用为什么VMware不默认打开这里有几个实际考量安全风险。PMU数据可以被用来做侧信道攻击比如通过测量缓存访问时间推测密钥。把PMU暴露给客户机意味着客户机里的恶意代码有机会用更精密的计时手段探测物理CPU的缓存行为。迁移兼容性。在vSphere集群中CPU型号不同的宿主机PMU寄存器布局也不同。如果虚拟机开启了性能计数器直通做vMotion热迁移时可能因为PMU资源不兼容导致迁移失败。Workstation里虽然不涉及在线迁移但这个设计思路是一脉相承的。性能损耗。客户机访问PMU寄存器时VMM可能需要拦截并模拟部分MSR读写操作这本身会引入少量开销。对于不需要性能分析的虚拟机来说这个开销是纯浪费。3.3 哪些场景确实需要勾选我自己在虚拟机里跑ClickHouse压测和数据库TPC-C基准测试时经常需要分析CPU缓存命中率和分支预测情况这时就必须勾选性能计数器。否则perf工具读出来的数据要么全部为零要么报“perf_event_open failed”类似错误。此外像PGO基于配置的性能优化编译器在收集程序运行剖面数据时也会用到硬件计数器开了这个选项才能得到有效的profile数据。还需要注意一个点如果在VMware虚拟机里运行Linux并且用perf stat这类指令默认受限是因为内核的perf_event_paranoid级别限制但即使把paranoid调到允许用户态采样的级别如果VMware侧没勾选性能计数器perf也只能拿到基于软件事件的数据硬件事件cache-misses、branch-misses根本采不到。这个排查链路很容易把人绕进去我先帮你排除掉VMware的这一个变量。4. 虚拟化IOMMU设备直通背后的DMA“门卫系统”4.1 IOMMU到底管什么第三个选项“虚拟化 IOMMU”对应的硬件能力是Intel VT-d或AMD-Vi这个技术解决的是DMA重映射问题。我打个比方没有IOMMU的时候硬件设备比如网卡、显卡发起DMA操作时可以访问物理内存的任意地址相当于一个快递员能按包裹上的原地址直接跑到任意居民楼敲门有了IOMMU设备发起的每一次DMA地址都会被门卫检查并重新翻译门卫手里有一张“哪些地址能去哪栋楼”的对照表快递员只能把包裹送到指定的、经过翻译的真实门牌号。在虚拟化环境下IOMMU的重要性翻倍。虚拟机里的设备驱动使用的是客户机的物理地址GPA但真实硬件DMA需要访问宿主机物理地址HPA。如果没有IOMMU做GPA到HPA的翻译和权限校验直通给虚拟机的物理设备万一驱动有bug或者被恶意攻击就有能力把数据直接写到宿主机物理内存任意位置直接击穿虚拟化隔离边界。这正是很多安全合规场景强烈要求开启虚拟化IOMMU的原因。不过这里要厘清一个概念VMware设置里的“虚拟化 IOMMU”选项和宿主机在BIOS里开启VT-d不是一回事。宿主机BIOS开VT-d是允许物理平台自身做DMA重映射而VMware设置里的这个选项是让VMware向客户机系统暴露一个虚拟IOMMU设备让客户机操作系统以为它自己也有IOMMU能力。客户机里的驱动如果支持IOMMU就会启用自己的DMA重映射逻辑如果没这个选项客户机驱动一般走模拟DMA通道由VMware在VMM层做转发和隔离。4.2 勾选IOMMU的收益和代价收益主要分三种场景设备直通PCI Passthrough。如果你把物理GPU、NVMe盘或万兆网卡直接分配给虚拟机那么宿主机IOMMU是必选项否则直通设备可能因为DMA访问不隔离而失败甚至造成宿主机崩溃。vSphere里做GPU直通比如vGPU时IOMMU相关配置就是硬性前提。客户机内再跑需要IOMMU的虚拟化栈。比如在VMware虚拟机里再装KVM并且希望KVM里做PCI直通就需要这次嵌套链路里每一层都支持IOMMU传递。高安全隔离需求。即使不做直通在客户机里启用IOMMU后虚拟设备之间的DMA隔离级别更高对防御DMA攻击有帮助。代价也很明确IOMMU的地址翻译会带来少量额外延迟每条DMA请求经过重映射表都会多一步查找。这个开销在绝大多数场景下是微秒以下级别的但你如果跑的是极端高频的小包网络或高IOPS存储可能还是会在压测数据里看到1%-3%的差异。所以我个人的经验是没有直通需求和嵌套IOMMU需求时保持默认关闭真有需求了再开开之前先确认宿主机的VT-d已在BIOS里启用。4.3 虚拟机里看IOMMU是否生效Linux客户机里确认IOMMU是否开启有几个常见方法查看dmesg里是否出现DMAR相关的日志有则说明虚拟IOMMU被识别。执行lspci -vvv看设备Capabilities里是否有IOMMU能力。检查/sys/kernel/iommu_groups目录是否存在且包含设备分组如果存在说明IOMMU生效。Windows客户机则可以在设备管理器里看“系统设备”下是否有“Intel(R) Virtualization Technology for Directed I/O”相关条目。如果没有大概率就是VMware没勾选IOMMU或宿主机BIOS没开VT-d。5. 三个选项不是三个孤立开关联动关系和常见报错一锅端5.1 依赖关系与常见理解误区这三个选项表面上是并列的实际是有依赖关系的CPU性能计数器依赖VT-x。没有硬件虚拟化扩展VMM无法安全地隔离PMU资源勾了也白勾。虚拟化IOMMU也依赖VT-x/EPT体系。IOMMU的虚拟化涉及大量页表操作和地址转换需要EPT配合否则无法高效实现GPA到HPA的重映射。嵌套虚拟化通常需要同时满足VT-x透传和EPT透传。KVM或者Windows Hyper-V在客户机里工作不仅需要VMX指令还需要客户机内部的客户机页表能够再走一层EPT所以选项里的“/EPT”不是摆设。常见的理解误区也很典型误区一勾了VT-x虚拟机性能就能翻倍。实际上对于普通I/O型应用提升有限真正收益大的是内存访问密集和需要嵌套虚拟化支持的场景。误区二性能计数器勾了任务管理器能看到更多信息。不是任务管理器不依赖PMU这个选项只对性能分析工具有意义。误区三开了IOMMU虚拟机就能直通设备。IOMMU只是前提之一设备直通还依赖硬件支持、VMware版本和你对设备中断的处理方式。5.2 排查“模块hv启动失败”的完整链路回到热搜词里的“VMware workstation 在此主机上不支持嵌套虚拟化。模块‘hv’启动失败”我复盘一次完整的排查过程这条思路比答案本身更值钱。前置条件宿主机是Windows 11 VMware Workstation 17虚拟机装的是Windows 10虚拟机的任务是在里面启用Hyper-V并跑WSL2。第一次启动就直接报错“此主机不支持嵌套虚拟化”排查步骤如下确认宿主机BIOS的VT-x和VT-d都打开了。进入系统后用任务管理器 - 性能 - CPU查看虚拟化状态是否为“已启用”。打开VMware虚拟机设置确认“虚拟化 Intel VT-x/EPT”勾选。这一步很多人会漏掉因为默认情况下Workstation对普通VM不勾选该选项只有新建特定类型虚拟机或手动勾选后才会启用。确认Windows 11宿主机没有开启内核隔离VBS。Windows 11的基于虚拟化的安全默认开启的话会占用了宿主机侧的Hyper-V层和VMware的嵌套虚拟化机制产生冲突。需要在“Windows安全中心 - 设备安全性 - 内核隔离”里关闭或者通过组策略以及注册表关闭VBS后重启。确认VMware的虚拟机配置文件里没有残留旧版本的虚拟化设置。偶尔有老版本Workstation创建的低版本兼容性虚拟机CPUID设置会干扰新版本的嵌套虚拟化传递可以尝试把虚拟机的硬件兼容性版本升级或者新建一个虚拟机把现有VMDK挂载进去跑。顺着这个链路排查基本能解决九成嵌套虚拟化报错。剩下的情况通常是你用的VMware版本过旧不支持向客户机传递某些虚拟化特性升级版本即可。5.3 WSL2和Docker Desktop的虚拟化开关纠缠还有一个高频场景值得单独说宿主机Windows上VMware虚拟机内跑WSL2或Docker Desktop。很多人发现直接在Windows 11宿主机的VMware Workstation里运行一个“未勾选虚拟化引擎”的虚拟机然后在这个虚拟机里执行wsl --install装完后启动wsl大概率会报“无法启动因为此计算机上未启用虚拟化”即使你在Windows功能里把“虚拟机平台”和“适用于Linux的Windows子系统”都装好了。原因就出在WSL2本身依赖Hyper-V的虚拟机监控程序层而VMware的虚拟化引擎默认没有把VT-x暴露给客户机系统。解决方式跟我上面第5.2节一样先勾选VT-x/EPT再处理VBS冲突。如果你在客户机里用的是Docker Desktop它也会在安装时检测虚拟化能力检测不到直接拒绝安装或启动同样通过勾选VT-x解决。另外注意如果客户机是Windows 11且打开了“基于虚拟化的安全”在客户机内再跑WSL2时会叠加一层嵌套虚拟化。虽然VMware 17能透传VT-x给客户机但客户机内部再叠VBS性能损耗会明显增大。真正需要跑WSL2的场景如果性能敏感我更推荐在宿主机直接装WSL2而不是在虚拟机里再叠一层。省下来的开销是实打实的。6. 按场景直接抄作业的配置清单理论讲了一堆最终落地还是那句我这个场景到底怎么勾选下面是我根据自己日常使用和帮人排错的经验整理的配置建议直接对着自己的需求找即可。使用场景VT-x/EPTCPU性能计数器虚拟化IOMMU说明普通办公/学习跑Windows或Linux桌面勾选关闭关闭VT-x默认有收益其它两项没需求白增加开销虚拟机里跑Docker Desktop/WSL2勾选关闭关闭另外需关闭客户机和宿主机VBS虚拟机里再装KVM/Hyper-V做嵌套虚拟化勾选按需按需KVM嵌套默认只需VT-xIOMMU需嵌套直通时开用perf/VTune做性能分析和压测勾选勾选关闭硬件事件采样必须开性能计数器给虚拟机直通GPU/万兆网卡/NVMe盘勾选关闭勾选同时确保宿主机BIOS开了VT-d高安全隔离需求虚拟化逃逸防御优先勾选关闭勾选接受IOMMU带来的少量IO开销虚拟机里做实时/低延迟任务按需关闭关闭实时任务需要考虑VM Exit和IOMMU翻译延迟这里面还有两个细节值得提一下。第一个是性能计数器的版本兼容问题。如果你在一台较新的Host CPU上创建了虚拟机勾选了性能计数器之后又把虚拟机迁移到CPU较旧的主机上可能会遇到性能计数器不可用或直接无法启动的情况。Workstation单机场景不涉及在线迁移但VMDK文件拷到另一台配置不同的电脑上打开时有可能因为PMU差异导致客户机内perf工具异常。遇到这种情况先取消勾选性能计数器再启动是最快的排除办法。第二个是IOMMU对虚拟设备的影响。默认情况下VMware的虚拟设备如VMXNET3虚拟网卡、PVSCSI控制器在设计上已经由VMM做了隔离并不依赖客户机IOMMU。你只是担心安全性的话不勾IOMMU问题也不大。真正需要IOMMU的是物理设备直通的场景没有直通需求却开了IOMMU纯属给自己增加额外翻译路径收益非常有限。7. 回归到三个选项本身说点实际的建议最后聊点我个人在反复折腾中形成的习惯。第一个习惯是新建虚拟机时只要CPU支持就把“虚拟化 Intel VT-x/EPT”勾上哪怕暂时用不到嵌套虚拟化。理由是它几乎没有副作用而一旦后续想在这个虚拟机上跑WSL2、KVM或者其它虚拟化相关软件能省掉一大轮毫无必要的排错。很多人喜欢等出了问题再回头勾选但那个时候可能已经连BIOS都怀疑了一通浪费时间。第二个习惯是性能计数器在需要时开用完就关。因为开着它确实有微小的性能损耗而且宿主机的杀毒软件或E DR类软件有时会对PMU访问比较敏感容易出现奇怪的安全软件报警。跑完压测和分析把勾选去掉更省心。第三个习惯是每次遇到“虚拟化被禁用”类报错按“宿主机BIOS - VMware勾选 - 客户机VBS/Hyper-V功能”的顺序排查。这个顺序不是我拍的而是根据报错产生链路倒推出来的VMware再强也不可能绕过BIOS禁用客户机系统再友好也不可能忽视VMware未暴露的硬件能力。按这个顺序排错几乎不会走弯路。老实说这三个选项本身并不复杂它们共同构成了VMware向客户机传递“硬件辅助虚拟化能力”的完整通道。搞懂了VT-x是地基性能计数器是给分析工具的窗口IOMMU是DMA的门卫以后再遇到类似的虚拟化设置项你就能举一反三不会被各种术语绕晕了。
返回列表