Virtualization: VMware 虚拟机性能优化
https://wiki.archlinux.org/title/VMware_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)/Installing_Arch_as_a_guest_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
下面这些技巧可以帮你改善虚拟机性能。
准虚拟化 SCSI 驱动
VMware 准虚拟化 SCSI (PVSCSI) 驱动 (或称半虚拟化)是为 VMware ESXi 设计的 SCSI 驱动。可以明显提升吞吐量,降低 CPU 消耗。
在虚拟机设置的 SCSI 适配器类型里可以找到 VMware 准虚拟化
选项。
如果你在虚拟机设置里找不到该选项,可以用这个办法:首先确保将 PVSCSI 模块添加进内核的内存盘镜像。具体的做法是修改 mkinitcpio.conf
文件:
cat /etc/mkinitcpio.conf
... MODULES="... vmw_pvscsi" ...
然后重建内存盘镜像:
# mkinitcpio -p linux
将虚拟机关机,在虚拟机的 .vmx
配置文件里用如下的方法指定 SCSI 驱动:
scsi0.virtualDev = "pvscsi"
平行虚拟化网络驱动
VMware 虚拟机提供了 多种网络适配方案。默认的网卡适配器一般是e1000
,它能模拟 Intel 82545EM 千兆以太网卡。该网卡可以被常见的操作系统(含 Arch)直接支持。
若要 提升性能,并引入更多高级功能(比如多队列支持),可以考虑使用 VMware 原生的 vmxnet3
网络适配器。
正常安装的 Arch 就包含有 vmxnet3
内核模块。该模块可以通过 mkinitcpio 来启用(或者被自动加载。可以用 lsmod | grep vmxnet3
命令来验证加载成功),然后关闭虚拟机,并如下修改 .vmx 文件:
ethernet0.virtualDev = "vmxnet3"
指定更换网卡驱动之后,你还要更新网络与 dhcpcd 的设置来真正使用新网卡:
# dhcpcd new_interface_name # systemctl enable dhcpcd@new_interface_name.service
运行 ip link
命令可以找到新网卡的名字。
虚拟机设置
按照 Vmware KB1008885 给出的如下优化方法,可以减少硬盘 I/O 操作数量,但代价是提升宿主机内存占用:
mainMem.useNamedFile = "FALSE" MemTrimRate = "0" prefvmx.useRecommendedLockedMemSize = "TRUE" MemAllowAutoScaleDown = "FALSE" sched.mem.pshare.enable = "FALSE"
- mainMem.useNamedFile: 把这个参数的值设为 "FALSE" 可以让 VMware 不再创建 .vmem 文件。这样有助于减少虚拟机关机时的硬盘操作,但这么做只对 Windows 宿主系统有效。如果你的宿主系统是 Linux,建议用这个配置:mainmem.backing = "swap"。
- MemTrimRate: 这项优化会使客机释放的内存在宿主机得不到释放。
- prefvmx.useRecommendedLockedMemSize: 很遗憾,这项优化没给出什么解释。貌似会阻止宿主系统把客机系统的部分内存进行内存换页。
- MemAllowAutoScaleDown: 阻止 VMware 在申请不到内存的时候自动调整虚拟机的内存大小。
- sched.mem.pshare.enable: 如果同时有多台虚拟机运行,VMware 会尝试找到它们之间相同的内存页,并且在共享这些页。但这是个 I/O 消耗很大的操作。
下面这些配置可以在 VMware Workstation 的配置对话框里调整 (Edit -> Preferences... -> Memory/Priority)。
prefvmx.minVmMemPct = "100" mainMem.partialLazySave = "FALSE" mainMem.partialLazyRestore = "FALSE"
- prefvmx.minVmMemPct: 指定虚拟机的内存应该有多大的部分来自物理内存,单位是百分比。如果这个值设得较低,那么虚拟机可见的内存总量是可以超过物理机的物理内存的。但这就会带来大量的硬盘读写。如果你的物理内存够大的话,这个值应该维持在 100。
- mainMem.partialLazySave and mainMem.partialLazyRestore: 这两项参数的优化是为了阻止虚拟机出于休眠的目的来创建不完整内存快照。如此优化之后,虚拟机的休眠操作耗时会稍长些,但相应地也会减少硬盘读写。
故障排除
客户机网络速度减慢
Arch Linux,和其他 Linux 客户机一样,当使用 NAT 模式的时候也许会碰到网络速度减慢的问题。为了解决这个问题,请在宿主机下把对应的客户机的网络模式切换为 桥接模式 ,在必要时修改客户机网络的配置文件。有关配置的详细信息请参阅 Network configuration (简体中文) 。如果在 Windows 宿主机下,使用正确的客户机网络配置仍然无法正确连接网络, 可使用 管理员 运行 虚拟网络编辑器 并点击左下方的 还原默认设置 按钮。
较新的内核下的文件共享问题
由于 open-vm-tools-dkmsAUR[损坏的链接:package not found] 包已经不再更新,较新的内核无法正确地使用它的做出兼容宿主机和客户机之间文件共享的修补。该Github 仓库 有一些修补文件可以手动应用它们并解决问题。
你还被推荐查看该包的 AUR comment 部分。
声音问题
如果虚拟机发出了恼人的巨响,那有可能是 PC 扬声器的原因。在客户机系统里禁用 PC 扬声器即可解决:
# echo "blacklist pcspkr" > /etc/modprobe.d/nobeep.conf
鼠标问题
虚拟机可能会出现下列鼠标问题:
- 自动获取/失去焦点的功能可能会在鼠标箭头移入窗口时失效
- 按键无响应
- 卡顿、延迟
- 在个别软件中点击无响应
- 箭头在移入/移出虚拟机时跳跃
- 箭头会跳跃到从虚拟机移出的位置
可以先卸载软件包 xf86-input-vmmouse 试试看。
为解决鼠标箭头跳跃到从虚拟机移出的位置的问题,可以试试在 .vmx
配置文件里写入这些:
~/vmware/<Virtual Machine name>/<Virtual Machine name>.vmx
mouse.vusb.enable = "TRUE" mouse.vusb.useBasicMouse = "FALSE"
VMware 还会为游戏做自动的鼠标优化。如果这一优化产生了问题,可以在这里将其禁用:Edit > Preferences > Input > Optimize mouse for games: Never
再者,尝试在 60-libinput.conf
里禁用 catchall
事件也可能有用:
/usr/share/X11/xorg.conf.d/60-libinput.conf
#Section "InputClass" # Identifier "libinput pointer catchall" # MatchIsPointer "on" # MatchDevicePath "/dev/input/event*" # Driver "libinput" #EndSection
启动故障
启动速度慢
如果 VMware 开启了内存热扩容功能,那么有可能会出现如下错误:
- add_memory failed
- acpi_memory_enable_device() error
若要禁用内存热扩容功能,可以在 .vmx
配置文件里写入 mem.hotadd = "FALSE"
。
~/vmware/<Virtual Machine name>/<Virtual Machine name>.vmx
mem.hotadd = "FALSE"
关机/重启时卡住不动
试着降低 vmtoolsd 服务的超时阈值(默认是 90 秒):
/etc/systemd/system/vmtoolsd.service.d/timeout.conf
[Service] TimeoutStopSec=1
窗口分辨率自动适配
自动适配的意思是,当你在宿主机里缩放 VMware 窗口之后,Arch 作为客户机系统,应该自动根据主系统窗口的新尺寸来调整分辨率。
方案 1
确保在设置里开启了自动适配。
VMware Worksation 的这一设置位于:View -> Autosize -> Autofit Guest
方案 2
分辨率自动适配的功能依赖 gtkmm 和 gtk2 软件包。确保客户机里装上这两个包。如果你没安装 X,或者你使用的桌面环境不依赖 GTK(比如 KDE),那么你需要手动安装这两个包。
方案 3
通过 mkinitcpio.conf 加载以下模块:
/etc/mkinitcpio.conf
MODULES="vsock vmw_vsock_vmci_transport vmw_balloon vmw_vmci vmwgfx"
然后运行:
# mkinitcpio -p linux
再重启试试看。
方案 4
启用 vmtoolsd.service
.
拖拽与复制粘贴
提示: 由于与 gtkmm3 的依赖关系没有明确声明导致该功能无法正常使用。此问题在 FS#43159有详述。
为了确保拖拽与复制粘贴功能正常工作,需要安装 open-vm-tools 和 gtkmm3 这两个包。
使 vmware-user
在 X11 之后运行:
- 确保
etc/xdg/autostart/vmware-user.desktop
存在,如果文件不存在,请运行:
# cp /etc/vmware-tools/vmware-user.desktop /etc/xdg/autostart/vmware-user.desktop
或
- 添加
vmware-user
到 Xinitrc
在 VMware Workstation 11 版上运行共享 VM
Workstation 11 有个 bug:当 Arch 客户机以共享 VM 模式运行,且启动了 vmtoolsd 服务时,vmware-hostd 会崩溃。open-vm-tools 有个补丁来绕过这一问题。
系统更新后共享文件夹没有被挂载
这个问题基本上只会在 open-vm-tools 出现。 自从 vmhgfs
模块属于 open-vm-tools-dkmsAUR[损坏的链接:package not found] 以后,使用 pacman -Syu
命令并不会升级传统的文件系统驱动。 因此在升级官方仓库之前应该手动升级 open-vm-tools-dkmsAUR[损坏的链接:package not found] 。
如果在系统升级之后共享文件夹没有被挂载,则删除共享文件系统自动挂载,升级 open-vm-tools-dkmsAUR[损坏的链接:package not found] 后执行 pacman -Syu
,最后执行 mkinitcpio -p linux
。不要忘记恢复文件系统自动挂载。