x86 / x64虚拟化有多少开销?


24

对于使用Intel硬件虚拟化的Win64主机和Linux64 guest虚拟机,以下每个操作中x86 / x64虚拟化(我可能将使用VirtualBox,可能的VMWare,绝对不是半虚拟化)有多少开销?

  • 完全受CPU约束的用户模式64位代码

  • 完全受CPU约束的用户模式32位代码

  • 将文件I / O传输到硬盘驱动器(我最关心的是吞吐量,而不是延迟)

  • 网络I / O

  • 线程同步原语(互斥量,信号量,条件变量)

  • 线程上下文切换

  • 原子操作(使用lock前缀,例如比较和交换)

我主要对硬件辅助的x64情况(Intel和AMD)感兴趣,但也不会介意无辅助的二进制翻译和x86(即32位主机和来宾)情况。我对半虚拟化不感兴趣。


(1)“ x86”表示32位。您将无法运行64位代码。AMD64(也称为x64)虚拟化具有不同的局限性,因为它需要硬件扩展。(2)您是指通过二进制转换(仅x86)的x86虚拟化还是硬件辅助虚拟化(VT)?
天鹰

@Miles:我已经澄清了这个问题。
dsimcha

Answers:


26

我发现对于像您这样的问题没有简单而绝对的答案。每个虚拟化解决方案在特定的性能测试上的行为都不同。另外,可以将磁盘I / O吞吐量之类的测试划分为许多不同的测试(读取,写入,重写,...),结果因解决方案而异,因方案而异。这就是为什么不难指出一种解决方案是磁盘I / O最快的原因,这就是为什么对于诸如磁盘I / O开销之类的标签没有绝对答案的原因。

当试图找到不同基准测试之间的关系时,它变得更加复杂。我测试过的解决方案在微操作测试中都没有良好的性能。例如:在VM内,一次“ gettimeofday()”调用完成的时钟周期平均要比硬件上多11.5倍。系统管理程序针对现实世界的应用程序进行了优化,并且在微操作上表现不佳。对于您的应用程序来说,这可能不是问题,因为它可能更适合实际应用程序。我的意思是通过微操作来完成所有花费少于1,000个时钟周期的应用程序(对于2.6 GHz CPU,在385纳秒或3.85e-7秒内花费1,000个时钟周期)。

我对用于x86体系结构的数据中心整合的四个主要解决方案进行了广泛的基准测试。我做了近3000项测试,比较了虚拟机内部的性能和硬件性能。我称“开销”为VM内部测得的最大性能与硬件上测得的最大性能之差。

解决方案:

  • VMWare ESXi 5
  • Microsoft Hyper-V Windows 2008 R2 SP1
  • Citrix XenServer 6
  • 红帽企业虚拟化2.2

来宾操作系统:

  • Microsoft Windows 2008 R2 64位
  • 红帽企业版Linux 6.1 64位

测试信息:

  • 服务器:2X Sun Fire X4150,每个具有8GB RAM,2X Intel Xeon E5440 CPU和四个千兆以太网端口
  • 磁盘:千兆以太网上的iSCSI上有6X 136GB SAS磁盘

基准软件:

  • CPU和内存:32位和64位的Linpack基准测试。这会占用大量CPU和内存。

  • 磁盘I / O和延迟:Bonnie ++

  • 网络I / O:Netperf:TCP_STREAM,TCP_RR,TCP_CRR,UDP_RR和UDP_STREAM

  • 微操作:rdtscbench:系统调用,进程间管道通信

使用以下参数计算平均值:

  • CPU和内存:AVERAGE(HPL32,HPL64)

  • 磁盘I / O:AVERAGE(put_block,重写,get_block)

  • 网络I / O:AVERAGE(tcp_crr,tcp_rr,tcp_stream,udp_rr,udp_stream)

  • 微操作AVERAGE(getpid(),sysconf(),gettimeofday(),malloc [1M],malloc [1G],2pipes [],simplemath [])

对于我的测试场景,使用我的指标,四个虚拟化解决方案的结果平均值为:

VM层开销,Linux guest虚拟机:

  • CPU和内存:14.36%

  • 网络I / O:24.46%

  • 磁盘I / O:8.84%

  • 读取磁盘延迟:慢2.41倍

  • 微操作执行时间:慢10.84倍

VM层开销,Windows guest虚拟机:

  • 32位和64位的CPU和内存平均值:13.06%

  • 网络I / O:35.27%

  • 磁盘I / O:15.20%

请注意,这些值是通用的,并不反映特定情况。

请查看全文:http : //petersenna.com/en/projects/81-performance-overhead-and-comparative-performance-of-4-virtualization-solutions


2
本文已过时
dyasny 2012年

1
For a 2.6 GHz CPU, 1,000 clock cycles are spent in 23 milliseconds,难道不是将1,000除以2,600,000即可得到1,000个时钟周期所需的秒数吗?(不是23毫秒)
dvdvorle

2
@先生。快乐,你是对的。我得到了385纳秒:1000/2600000000 = 0.000000385 = 385纳秒 你同意吗?感谢您指出了这一点。
彼得·塞纳2013年

@dyasny,我正在寻找可重复使用更新版本进行测试的硬件。知道在哪里可以找到它吗?
彼得·塞纳2013年

可以在商店中轻松找到硬件
dyasny

4

您的问题中的变量太多,但是我可以尝试缩小范围。假设您使用VMware ESX,则可以正确地做所有事情-支持虚拟化的最新CPU,具有半虚拟化存储和网络驱动程序的VMware工具,大量内存。现在,假设您在此设置上运行一个虚拟机。根据我的经验,您应该拥有约90%的CPU速度来处理受CPU约束的工作负载。关于网络速度,我不能告诉您太多,因为我们正在使用1Gbps链接,并且可以毫无问题地使它饱和,但是对于10Gbps链接,它可能会有所不同,但是我们没有这些。存储吞吐量取决于存储类型,我可以使用本地存储获得大约80%的存储吞吐量,但是对于1Gbps NFS,由于网络是瓶颈,因此接近100%。无法告知其他指标,

这些数字非常近似,在很大程度上取决于您的负载类型,硬件和网络。当您在服务器上运行多个工作负载时,它变得更加模糊。但是我在这里要说的是,在理想条件下,您应该能够获得接近本机性能的90%。

根据我的经验,对于高性能应用程序,更大的问题是延迟,对于客户端服务器应用程序尤其如此。我们有一个计算引擎,可以接收来自30多个客户端的请求,执行简短的计算并返回结果。在裸机上,通常会将CPU占用率提高到100%,但是VMware上的同一台服务器只能将CPU负载增加到60-80%,这主要是因为处理请求/回复的延迟。


我可以从经验中得出结论,用单个VM饱和10GbE链接非常困难。我们已经使用了VMWare FT,它可以通过10Gbe自行使1Gbps链路饱和,而饱和度几乎没有。
Mark Henderson

0

我还没有深入研究诸如上下文切换和原子操作之类的基本基元的性能,但这是我最近在不同的虚拟机管理程序上进行的暴力测试的结果。如果您主要受CPU和RAM带宽的限制,那么它应该表明您会期望什么。

http://www.altechnative.net/2012/08/04/virtual-performance-part-1-vmware/


2
知道您有Xen和KVM的信息真是太好了...但是最流行的两个Hypervisor呢?他们完全不见了。而且您已经包括了多个2型管理程序,没有理智的SysAdmin可以将其用于生产。
克里斯·S

下投。链接已死。
蒂姆·邓克利
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.