我想知道在 Windows 的虚拟机中运行 Linux 会对性能产生什么影响。我需要 Linux 来完成繁重的工作,而且几乎不间断地使用 GCC 进行代码编译。双启动看起来不是一个非常有吸引力的解决方案,所以我现在指望较低的 VM 开销(10-20% 对我来说没问题,但 50% 或更高是不可接受的)。有人尝试测量性能差异吗?有比较表吗?您会建议哪种虚拟机的开销最低?
我的主机操作系统是 Win7,并且我有一个带有 VT-x 的现代 Core i7。
谢谢!
答案1
警告:以下内容基于我的主观观察,而不是适当的客观测试。
某些负载模式的磁盘 I/O 将处于 10-20% 范围的顶端,可能略高一些,但不会接近您所述的 50%。您可以通过多种方式缓解 I/O 负载,包括:
- 为虚拟机提供足够的 RAM 以供操作系统用作缓存(这当然意味着主机拥有足够的 RAM,否则它将会耗尽资源并开始交换自身和虚拟机)
- 告诉虚拟机管理器不要让任何分配给虚拟机的 RAM 交换,如果它可能有帮助的话
- 通过将 /tmp 和类似文件挂载为 tmpfs 文件系统,确保 VM 在 RAM 中托管临时存储。
- 在虚拟机中,选择好磁盘上的文件系统并进行相关调整。如果所有代码和编译器输出也保存在其他地方,即在源代码控制和备份中,则取消日志记录以减少写入活动。此外,如果您的文件系统是 ext2/3/4,则使用 noatime 选项(如果您的构建过程可以接受这个选项,大多数(如果不是全部)都可以),或者如果 noatime 不可行,则使用 relatime(我认为现在大多数发行版都默认使用 relatime)。
- 类似地,如果您的代码和输出被安全地复制到其他地方,请告诉您的 VM 管理器可以缓冲对 VM 的虚拟磁盘的写入。
- 如果您觉得上述风险较高的选项不安全(可能存在延迟写入缓存、没有 FS 日志),您可以调整构建过程以使用 RAM 进行临时存储,方法是尽可能多地使用挂载 /tmp 的 tmpfs。
- 如果可以的话,将虚拟机的虚拟磁盘放在单独的驱动器上,这样,如果它确实需要执行大量的 I/O 操作,它就不会与主机操作系统和其他虚拟机进行太多竞争。
- 确保虚拟机使用固定大小的虚拟磁盘。可增长磁盘会增加 IO 性能损失,有时会造成相当大的影响。
I/O 命中将使任何 CPU 命中都相形见绌,尽管这里也有一些性能下降。但与 I/O 不同,您对此几乎无能为力。使用现代 CPU 和可以利用 CPU 的显式虚拟化支持的虚拟化产品,完全 CPU 绑定操作的差异应该不会超过几个百分点。尽量避免虚拟 SMP - 由于物理 CPU 时间的调度方式,这实际上可能比为 VM 提供单个 vCPU 更慢。在 VMWare 中,至少具有 2 个 vCPU 的客户机必须等到两个核心空闲才能从主机调度程序获得时间片 - 如果主机在 VM 之上负载过重,这可能会产生很大的不同,如果任务主要是 CPU 绑定并且可以适当拆分,您通常最好运行两个或更多 VM(假设您有足够的 RAM 来支持这一点),而不是为一个 VM 提供多个 vCPU。
您所述的使用模式(恒定的编译周期)将受到这些性能损失的影响,但我预计您将会失去很多这样可以节省时间,而不必担心双启动带来的不便。如果您的 Windows 占用的 CPU 和 I/O 较少,即只使用办公应用程序,而不是繁重的数据库工作或游戏等,您可能需要考虑将 Linux 作为主机,在 VM 中运行 Windows。