KVM:哪些 CPU 特性使 VM 运行得更好?

Pyt*_*ner 22 virtualization central-processing-unit qemu kvm-virtualization

我们使用带有以下参数的 Ubuntu 12.04:

  • 戴尔R910
  • 内核 3.2.0-25-generic #40-Ubuntu SMP x86_64 x86_64 x86_64 GNU/Linux
  • kvm 1:84+dfsg-0ubuntu16+1.0+noroms+0ubuntu13
  • qemu-kvm 1.0+noroms-0ubuntu13
  • qemu-common 1.0+noroms-0ubuntu13
  • qemu-kvm 1.0+noroms-0ubuntu13
  • 4 x Intel(R) Xeon(R) CPU E7-4870 @ 2.40GHz(每个都有 10 个物理内核,支持 HT 和 Intel VT)
  • Windows 来宾目前没有 VirtIO,但很快就会改变

我们在这台机器上运行了几个 Windows 来宾,其中一个是 Windows 2003 32 位,另一个是 Windows 2008(64 位)。我们目前正在努力解决性能问题并尝试使用 CPU 模型。

我们通常将“qemu-system-x86_64 用于我们的 Windows 32 位客户机,例如:

/usr/bin/qemu-system-x86_64 -S -M pc-1.0 -cpu qemu32 -enable-kvm -m 4096 -smp 4,sockets=4,cores=1,threads=1 [...] 
Run Code Online (Sandbox Code Playgroud)

这位客人的表现竟然有点低。我们还没有运行任何基准测试,但是假设当我们将 CPU 模型从“-cpu qemu32”切换到“-cpu Nehalem”时,将 VM 内的大量数据(文件)从一个目录复制到另一个目录的速度要快得多”。大约需要 2:40 小时复制的文件现在可以在 40 分钟内复制。当然,这不是一个高质量的测试,还有很大的空间可以进行更专业的尝试。但这是一个明确的指标,表明选择正确的 CPU 型号可能会严重影响来宾的性能。

现在我很好奇并跑了:

qemu-x86_64 -cpu ?
x86           [n270]
x86         [athlon]
x86       [pentium3]
x86       [pentium2]
x86        [pentium]
x86            [486]
x86        [coreduo]
x86          [kvm32]
x86         [qemu32]
x86          [kvm64]
x86       [core2duo]
x86         [phenom]
x86         [qemu64]
Run Code Online (Sandbox Code Playgroud)

和:

kvm -cpu ?model
 x86       Opteron_G3  AMD Opteron 23xx (Gen 3 Class Opteron)
 x86       Opteron_G2  AMD Opteron 22xx (Gen 2 Class Opteron)
 x86       Opteron_G1  AMD Opteron 240 (Gen 1 Class Opteron)
 x86          Nehalem  Intel Core i7 9xx (Nehalem Class Core i7)
 x86           Penryn  Intel Core 2 Duo P9xxx (Penryn Class Core 2)
 x86           Conroe  Intel Celeron_4x0 (Conroe/Merom Class Core 2)
 x86           [n270]  Intel(R) Atom(TM) CPU N270   @ 1.60GHz
 x86         [athlon]  QEMU Virtual CPU version 1.0
 x86       [pentium3]
 x86       [pentium2]
 x86        [pentium]
 x86            [486]
 x86        [coreduo]  Genuine Intel(R) CPU           T2600  @ 2.16GHz
 x86          [kvm32]  Common 32-bit KVM processor
 x86         [qemu32]  QEMU Virtual CPU version 1.0
 x86          [kvm64]  Common KVM processor
 x86       [core2duo]  Intel(R) Core(TM)2 Duo CPU     T7700  @ 2.40GHz
 x86         [phenom]  AMD Phenom(tm) 9550 Quad-Core Processor
 x86         [qemu64]  QEMU Virtual CPU version 1.0
Run Code Online (Sandbox Code Playgroud)

对于所有这些不同的版本,有点难以猜测。“Nehalem”似乎是该列表中性能最高的一个。现在我想知道,如何判断哪种 CPU 型号最适合我的客人?浏览互联网,我发现以下资源:

当我正确阅读这些站点时,他们声称“-cpu 主机”可能会带来最佳性能。我还没有对迁移有任何担心,因为两个 KVM 主机都配备相同(完全相同的硬件)。

那么,有经验的 KVM 管理员会推荐什么?是否有黄金法则甚至矩阵,比如“这个模型最适合那个来宾操作系统”?

如果我能自己找到这些信息,我深表歉意——我运行了各种谷歌搜索并浏览了许多网站。我找不到可以回答我的问题的东西。

dya*_*sny 15

这真的很简单。对于同类集群和单主机设置,请使用该host选项。对于混合集群,请使用可用的最低 CPU 版本,因此如果一台主机是 Penryn,另一台是 Nehalem,则在两者上都使用 Penryn。

如果您使用 RHEV 或 oVirt,这已经是内置的。VMWare 将其称为“EVC”并将其定位为一个巨大的功能。

回到性能,您肯定需要 virtio 无处不在。如果您仍然遇到性能瓶颈,通常可以根据具体情况解决这些问题,具体取决于它们发生的位置。

[offtop]关于你选择的发行版我已经在另一个帖子中评论过[/offtop]


Gre*_*SAT 11

Windows 来宾目前没有 VirtIO

不要在调整任何东西上浪费更多时间。
安装 virtIO 驱动程序并返回。差异如此巨大,以至于您现在可以找到的任何增强功能对 virtIO 都没有意义。


仅举我们其中一台服务器的示例:- 没有 virtIO,W2k3 可以处理大约 10 个终端服务器用户
- 使用 virtIO,具有相同操作系统的同一台机器目前可以处理 120 到 125 个用户,几乎没有减速。我们添加了另一个虚拟机来在同一台物理计算机上运行 SQL Server


Jef*_*and 10

Qemu 的工作方式与许多其他管理程序不同。对于初学者来说,它可以提供完整的模拟。例如,这意味着您可以在 ARM 处理器上运行 x86 代码。在 KVM 模式下,当您使用它时,它实际上并没有这样做……无论如何,处理器都是公开的,但是报告给操作系统的内容将被-cpu标志更改。

如果您想要更快的速度,那么尝试将虚拟处理器的功能与您的真实处理器尽可能地匹配是一个起点。这将减少调用次优操作码来运行任务的情况,并且还将减少在您的硬件上不可能首先转换为其他内容的操作码。由于您的至强处理器型号于 2011 年初发布,因此它可能主要支持 Core i7 系列。为此,我想说 Nehalem 架构是您最好的模拟。

引用您的链接之一(Tuning KVM):

要将所有可用的主机处理器功能传递给来宾,请使用命令行开关

 qemu -cpu host
Run Code Online (Sandbox Code Playgroud)

如果您希望保留兼容性,您可以向您的访客公开选定的功能。如果您的所有主机都具有这些功能,则保留兼容性:

 qemu -cpu qemu64,+ssse3,+sse4.1,+sse4.2,+x2apic
Run Code Online (Sandbox Code Playgroud)

因此,如果你觉得你最终可能会移动足够多的东西来产生问题,你可以找到你认为你现在拥有或将来可能拥有的任何处理器支持的所有支持的指令集,并将它们列出来。

但是,大多数情况下,您想坚持使用-cpu host. 指定具有较少可用标志的 CPU 意味着应用程序将避免使用可能使它们更快的功能。

  • 他正在使用 KVM,它需要那些虚拟化扩展并且不运行仿真;即使它基于 qemu (4认同)