【问题标题】:How virtual CPUs are mapped to physical cores?虚拟 CPU 如何映射到物理内核?
【发布时间】:2014-05-28 18:47:01
【问题描述】:

我正在用 Java 编写一个计算密集型的多线程程序,该程序将在虚拟化环境中运行,我想知道客户操作系统上的“CPU 数量”设置将如何影响我的程序的性能。

本质上,问题是客户操作系统 CPU 是如何映射到主机 CPU 内核的?假设我将客户操作系统上的 CPU 计数设置为 1,即使我在四核机器上运行,这究竟意味着什么?我可以推测至少会发生以下两种情况之一:

  1. 我的单个虚拟内核绑定到一个特定的物理内核,因此来宾实际上是在单个内核上运行。

  2. 没有将虚拟 CPU 硬绑定/分配到物理内核。因此,任何时候客户操作系统上的任何进程都需要启动一个新线程,它可以被分派到任何物理内核执行:四个中的任何一个,如我的示例所示。

后一种情况意味着客户操作系统在多核环境中运行,即使它“认为”它只有一个核心。 (“思考”是指 cat /proc/cpuinfo 之类的命令只报告一个核心)

我问的是一般性问题,但如果在该领域,例如 VirtualBox 和 VMWare 之间存在特殊差异,并且您碰巧知道它们,我会感谢您分享。

【问题讨论】:

    标签: linux multithreading virtualbox vmware virtualization


    【解决方案1】:

    实际上,在大多数情况下会发生的情况介于两者之间,只要您使用基于硬件的system-level virtualization 而不是User-mode Linux 之类的东西。

    就主机操作系统而言,VM 每个虚拟内核只有一个 CPU 线程。可能还有其他用于 I/O 等的线程,但这些线程与虚拟内核数无关,是模拟器的一部分,对来宾操作系统完全不可见。

    最终结果是,在单核 VM 上,所有来宾线程将在每个特定时刻在同一个 CPU 上运行 - 来宾线程在容器线程中“批处理”在一起,并且对主机操作系统不可见。

    也就是说,除非您将模拟器线程的 CPU affinity 设置为一个或多个特定的物理 CPU 内核,否则主机操作系统调度程序可能每隔几秒定期将线程迁移到不同的内核,就像任何其他进程一样。

    【讨论】:

      【解决方案2】:

      我可能是错的,但我认为虚拟 CPU 对应于虚拟机在任何给定时间可以在主机上运行的最大线程数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-24
        • 2020-02-29
        • 2019-01-08
        • 1970-01-01
        • 1970-01-01
        • 2012-02-18
        • 1970-01-01
        相关资源
        最近更新 更多