VMware Workstation是我最喜欢的虚拟化软件。其主要原因在于其性能卓越的虚拟网络、IO和显示加速。然而在实际部署VMware虚拟机的时候限于个人电脑的性能,总是希望尽可能做到性能的优化。不幸的是,官方文档对许多功能的描述却不足以说明某项功能的具体用途和原理,网友们的总结也大多停留在一般性的优化和老旧版本,不能满足一个极客的心。
在此,我对一个月以来对Fedora 31下运行的VMware Workstation 15.1虚拟机性能调优的经验做一个总结。理论上应该适合15系列版本,一般性原则亦可迁移到其它版本,Windows版本略有不同(主要在显示和内存管理两个方面)。
一般性原则
- 使用最新版本的VMware Workstation
- 使用最新版本的vmware-tools或者open-vm-tools
- 使用最新版本的硬件兼容性配置(对旧版本VMware创建的虚拟机导入到新版本后会出现一个升级此虚拟机)
- 条件允许的情况下使用性能更高的宿主机
- 8G内存起步,16GB通常够用,32GB最佳
- 尽量少添加无用的组件和虚拟硬件
- 开启CPU的虚拟化支持
虚拟硬件部分
Memory
即内存配置。这一部分的配置界面相当简单,只有一个滑动条,但却是很多人非常纠结的地方。要搞清楚到底你的虚拟机应该分配多少内存需要从用途和你的使用环境出发去考量。
首先,你分配的内存最少需要达到能够让目标虚拟机正常启动并进行一些简单操作。这一点是毫无疑问的,但是仍然有坑。每个操作系统的发行者或发行商总会给出一个最低配置和推荐配置,一般来说你分配的内存应该高于这个最低配置。问题就在于不同的用途上我们实际需求的内存量可能与此不同。一个没有运行什么服务的系统,如果我们始终不需要运行什么服务,那就可以甚至更少一点内存。如果这个系统是需要运行一些程序的,那么就还要加上这个程序所需的内存,这也是毫无疑问的。
一个好的实践是分配多一点内存,然后开机去进行一段时间的使用,打开此虚拟机常用的程序,看一看内存占用情况,在此数据的基础上再适当添加就会是一个比较合适的数据了。那么这个适当是多少呢?这要根据到底是什么系统以及到底是什么服务来决定。我给出个人的一些经验以作参考:
- Windows XP SP3 32位,80MB
- Windows 7 SP1 64位,300MB
- Windows Server 2012 R2 64位,500MB
- Windows 10 pro 64位, 800MB
- Windows 10 pro 64位,常操作的主力虚拟机,2GB
有以下两点需要特别注意:
- 以上讨论基于希望尽可能少分配内存的主观目的
- 滑动条旁边的推荐和最小是一个很好的参考,但仍需进一步实验。尤其是对Linux系统,推荐内存非常小,但是由于Linux常常跑很多服务,实际所需内存往往大于推荐值。
Processors
这一处配置更是加倍令人感到不知所措。这一配置分为两个部分,处理器配置和虚拟化引擎配置。
先说虚拟化引擎部分
第一个选项,虚拟化Intel-VT。很简单,如果需要在虚拟机里面使用虚拟化技术,则打开此选项,否则不要打开。此选项会指示VMware虚拟化引擎对硬件虚拟指令进行模拟,对提高嵌套虚拟化性能有很大的帮助,典型的场景有虚拟机里允许虚拟机、虚拟机里开安卓模拟器、虚拟机里运行或测试使用了虚拟化指令的加壳程序(通常是病毒)。特别提醒,基于文件系统驱动实现的沙盒类应用(如sandboxie)、docker、虚拟机壳(如VMP)等并没有使用硬件虚拟化指令。打开此选项对性能有些微的负面影响,所以不需要使用时不要打开。
第二个选项,虚拟化CPU性能计数器。此选项会传递物理CPU性能信息给虚拟CPU,使得虚拟CPU的性能统计信息具有参考价值,仅对在虚拟机里面进行的性能调优有意义。通常来说,如果你不在虚拟机里面做计算密集的开发工作就不需要开启此选项。开启后对性能有轻微的负面影响,所以即使你会用到这个功能也只要在测试前打开就好了。
第三个选项,虚拟化IOMMU。简单来说,你不需要开启此选项。IOMMU是英特尔的一项虚拟化辅助技术,具体来说,可以赋予虚拟机直接管理某物理设备的能力,如PCIe pass-through(个人用户典型场景为显卡直通)、分配某USB接口或磁盘给虚拟机等。需要注意的是,即使你的电脑不支持IOMMU,也可以借由VMware等虚拟化软件的驱动或内核模块获得一部分直接控制物理设备的能力;IOMMU的开启需要主板支持(支持的主板还是比较少的,维基上有一个支持列表,你也可以直接询问你的主板制造商)、操作系统支持(截至到5.6版本Linux内核仍需要传递内核参数来开启支持)、虚拟化软件支持(KVM是支持的)。可见开启并不容易而且对个人用户意义不大。再多提一句,消费级显卡主动屏蔽了显卡直通并且较新的显卡和显卡驱动是不容易绕开这一屏蔽的。
再说处理器设置
一般推荐是,物理CPU支持的情况下,两个CPU,各两个core是最佳性能设置。
要搞清楚这个问题,首先要知道虚拟机是如何与物理机上的虚拟化管理软件进行通信的。这个问题不需要认识很深刻,只要直到是通过网络连接就可以了。那么在这里一个CPU就对应了一条连接,多核的CPU共用一条连接。这是一个对多核CPU的直观且简单的模拟,正好对应到多核CPU不同核心的数据共享状态。到这一步,我们得到了第一个结论,那就是两个虚拟单核CPU要好于一个虚拟双核CPU。(因为现在虚拟化管理软件有了两个数据处理队列)
由上面的讨论很容易引出一个推论,那就是虚拟CPU越多越好。实际情况显然并非如此。
首先,对于个人版本的Windows(专业版、工作站版、数据中心版、服务器版、企业版等都可以支持更多,根据情况数量不等,但基本上可以支持几百个以上,微软官方网站有更多细节),最多支持四个独立CPU。其次,更多的虚拟CPU意味着虚拟化管理程序需要处理更多额外的调度工作,可能反而导致性能的下降。第三,虚拟CPU上提交的任务最终是要映射到物理CPU上进行处理的,所以如果虚拟CPU数量超过物理CPU数量会导致巨大的性能下降。第四,从可靠性和稳定性考虑,不要把所有物理核心都分配给虚拟机,否则可能出现虚拟机性能良好但宿主机操作卡顿的情况。众所周知,虚拟化管理程序是运行在宿主机上的,所以如果宿主机不能平稳运行,虚拟机的可靠性就只是空中楼阁。第五,多CPU意味着可以开启更多并发的线程(或者进程),对有多线程优化的或者面对大量网络连接的应用(例如nmap或者mysql)会有较大的性能提升,但对大多数程序来说并无明显区别,所以除非明确需要,两个虚拟CPU核心是现代操作系统在虚拟机中良好运行的最佳配置。
Hard Disk
先说一个小知识点,“当前大小”指的是当前使用的虚拟磁盘文件的大小。如果你当前运行在一个快照上,那么就是快照文件的大小。下面一些冷门知识知道这个小知识会少一些疑惑。
从创建磁盘说起
从最佳性能考虑,你应该使用SCSI接口,物理磁盘。这一点有争议,原因是直接使用物理磁盘减少了中间层的转换映射也避免了虚拟磁盘文件在文件系统中的物理分布的影响,但是VMware为虚拟磁盘创建了一个缓冲层,这个缓冲会让你在对同一块数据反复读写的场景下性能表现甚至优于原始磁盘的表现。具体可参照网上的测试,不再详述。
第二性能是预分配的单个磁盘文件。对运行了有大量磁盘IO的程序的虚拟机而言,预分配磁盘空间对性能的提升是明显的。
接口选择对性能影响不大,毕竟不是真的接口。默认的SCSI是最好的,在虚拟机有特殊需求的情况下,选择其他接口。
通常情况下,默认的SCSI接口动态增长多文件虚拟磁盘性能足够好,并能带来迁移的便利性和节约了的磁盘空间。
高级设置
开启写入缓存。这是默认打开的,从性能角度考虑当然应该打开,除非你有足够特殊的理由在关闭缓存的情况下可以获得更高性能。
独立磁盘及其非持久选项有些情况下对性能有帮助。独立磁盘即被快照管理排除的磁盘,非持久即关机回退数据。较深的快照会带来性能退化,显然独立磁盘就没有这个困扰。非持久会带来“硬盘保护卡”“影子系统”的效果,干净的系统通常都会表现更好。这一功能并非为性能而来,通常在一个虚拟机多个磁盘的情况下使用,并把需要保持的数据放在独立磁盘,以便于同时获得快照和数据持久化的好处。
磁盘整理
大致相当于对虚拟磁盘文件进行碎片整理,让有效数据在物理分布上集中起来。整理后配合压缩磁盘功能可以回收一部分空间。碎片整理么,当然有利于性能提高,但如果虚拟磁盘文件放在SSD上面呢?VMware社区的推荐做法是,在虚拟机内部运行磁盘碎片整理程序即可,不需要整理磁盘碎片。当然,如果目的在于回收空间,那么在内部运行碎片整理后再运行磁盘整理功能将能够回收更多空间(本质上是使更多空闲空间,即全零部分,集中在虚拟磁盘末尾)。
CD/DVD
只在安装系统和安装升级VMware tools时有用,其他时候可以取消勾选在开机时连接选项或者干脆删除。
Network
与性能考虑没有太大关系,更多的是基于业务需求考虑。需要使用时,性能略差也是要使用的。没有特殊需求时,NAT是推荐的默认选项。
Display
对有图形界面的桌面操作系统,应该开启3D加速并使用推荐的显存设置。如果确实除了基本图形界面不再需要其他图形运算,可以降低至64MB显存,32MB显存也是可以接受的。参考值:Linux开启了所有动画效果的Gnome占用28MB显存,使用vlc观看h264编码的1080p视频占用7MB显存。
有两点需要特别提醒,第一,VMware虽然号称可以加速DirectX调用但只支持到版本10;第二,虚拟机内显示的是虚拟的VMware显卡,并没有Nidia或者AMD或者Intel的信息,依赖于专有加速技术的程序是不能利用到特殊能力的;第三,对于双显卡笔记本,VMware默认配置不能利用任何显卡加速功能。再结合显卡厂商对消费级显卡直通的屏蔽,我劝你放弃在虚拟机里面玩比较新的3D游戏的心。顺便提一句,Steam的Proton系统已经可以比较完美地运行了。
需要利用CUDA等技术的GPU计算任务直接在物理机上运行就可以了,或者使用nvidia-docker技术。
其他
USB和虚拟打印机建议保留,即使不常用也应该保留。这是出于兼容性考虑,部分系统和软件假设其存在。
USB接口还可以无副作用地用来传送文件到USB存储设备(直接使用复制功能时会在虚拟机内部和外部各留下一个拷贝,实际复制过程会经历三次复制,非常低效),以及直接连接外部USB设备(例如无线网卡和手机),这些功能有时候非常重要,会用到的人自然懂得。
选项部分
操作系统类型要尽可能准确地进行选择,如果是不在列表中的Linux系统,选择正确版本的内核。如果选择不正确有时候也可以正常运行,但选择正确时可以正确应用更多专用的优化。
高级里面的选项都不要动就是最高性能。有些人会建议勾选Disable memory page trimming,实际上如果这一条能够让你变快那么你需要考虑两点:提高内存大小,更换硬盘。在无法变更硬件条件的情况下,这一选项是有帮助的,但你真的应该考虑升级硬件,因为你的计算机已经不能适应你当前的虚拟机运行需求了。
全局设置部分
勾选“Keep VMs running after Workstation close”。当你仅需要保持其运行并通过网络与其进行交互的时候,保留其在宿主机上的图形界面是不必要的。关闭窗口可以节约一部分图形运算。较小的分辨率也会有所帮助,尤其是图形加速不可用的情况下。
当你需要同时运行很多需要图形界面的虚拟机并不断在不同的虚拟机之间切换的时候,保持不要改变窗口大小的习惯,如果你不能主动良好保持这一习惯,关闭Display中的Autofit或者为虚拟机单独设置。自动改变分辨率很方便,但有时候很慢。
如果你不需要共享虚拟机,关闭Shared VMs中的服务器。
Memory选择默认选项。理论上全部放在内存里面会得到更好的性能,但当你运行的虚拟机占用内存接近物理内存极限的时候或者物理内存即将分配完毕的时候,全部放在内存要么会导致宿主机系统不稳定要么会导致宿主机进行大量的内存交换。两种场景都会导致极大的性能下降,这个时候系统管理员再要处理也非常困难了。默认选项虽然看起来会交换一部分内存,但在内存充足时并不会大量交换而且交换的都是冷数据,对性能的影响微乎其微;内存紧张时也可以通过提前交换缓解后期的极度紧张局面,系统管理员可以快速介入进行处理。
黑魔法
- 开启Disable memory page trimming
- 开启所有适合的虚拟机内存为保留主机RAM
- 开启prefvmx.useRecommendedLockedMemSize
- prefvmx.minVmMemPct改成一个足够小的数
- 取消mainMem.useNamedFile
- 取消Schedmemkpsharekenable
- 取消MemAllowAutoScaleDown
- 设置更大的swap分区或虚拟内存
这些魔法都是对物理内存不足的妥协,仅列出,不推荐。
赞 (0)
本文由 Hur 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Sep 1, 2022 at 06:06 pm