我参加虚拟化派对相对较晚,所以如果这看起来像一个显而易见的问题,你得原谅我。
如果我有一台有 12 个可用核心的服务器,那么每个 KVM 客户机都可以访问所有 12 个核心吗?我知道 KVM 使用了 Linux 调度程序,但我对“接下来会发生什么”的理解就到此为止了。
我询问的原因是,我们打算在 KVM 客户机中运行 10 个左右不同的任务(出于隔离以便于升级的目的)不会 100% 的时间使用单个核心,因此基于此,为每个客户机分配 1 个虚拟 CPU 似乎很浪费 - 我们从一开始就会用完核心,并显示“满的”空闲服务器。
换句话说,假设我上面的描述,1 个虚拟 CPU 在处理能力方面是否真的等同于 12 个物理核心?或者事实并非如此?
非常感谢
史蒂夫
答案1
虚拟 CPU 相当于 1 个物理核心,但当您的虚拟机尝试处理某些任务时,它可能会在任何当时可用的核心上运行。调度程序会处理此问题,而虚拟机对此并不知情。您可以为虚拟机分配多个 vCPU,使其能够在多个核心上同时运行。
所有虚拟机会根据需要共享核心,因此您可以拥有一个 4 核系统,并在其上运行 10 个虚拟机,每个虚拟机分配 2 个 vCPU。虚拟机会根据调度程序的决定,非常高效地共享系统中的所有核心。这是虚拟化的主要优势之一 - 充分利用未得到充分订阅的资源来支持多个操作系统实例。
如果您的虚拟机非常繁忙,以至于它们必须争夺 CPU 时间,那么结果就是虚拟机可能必须等待 CPU 时间。同样,这对虚拟机来说是透明的,并由调度程序处理。
我不熟悉 KVM,但以上所有内容都是大多数虚拟化系统的通用行为。
答案2
虚拟 CPU 是 qemu-kvm 进程中的一个线程。qemu-kvm 当然是多线程的。
除非您将进程固定到特定的 CPU,否则系统调度程序将从可用内核中为线程分配 CPU 时间,这意味着任何 vCPU 最终都可以从任何物理内核获取 CPU 周期,除非专门固定到特定内核
答案3
我建议检查将哪个 vCPU 分配给您的 VM 可以为您提供最佳性能。同时确认您的工作负载,即 CPU 密集型或 I/O 密集型,然后有很多免费的基准测试工具可用于检查您的性能,例如 Apache 基准测试(用于 IO 密集型操作)和 John the Ripper(用于 CPU 密集型操作)。一旦您确认您的 VM 可以最佳性能的 vCPU 分配,您就可以分配或配置其他 VM。因为我们没有照顾 vCPU 会对性能产生负面影响。
比如说,如果你有一个 4 核的主机,你想运行一个 VM 并为其分配一个 vCPU,那么它的性能会最低,因为它们只会使用 4 个核心中的一个,其余 3 个核心不会同时使用。因为虚拟机监视器 (VMM) 或虚拟机管理程序不知道 VM 的内部负载。如果你分配 4 个 vcpu,则会获得最大吞吐量,在这种情况下,如果你的工作负载是多线程的,主机的所有核心都会同时使用。同样,如果你增加一个核心,即 vCPU 分配超过 4 个可用,那么性能就会下降。只有当你有更多虚拟 VM 时才有好处,你不必担心其中一个 VM 会迁移到其他服务器或关闭,那么所有核心仍将得到利用,否则如果不配置过度分配,就会浪费。