我正在用Java编写一个计算密集的多线程程序,该程序将在虚拟化环境中运行,并且我会徘徊" CPU的数量"客户操作系统上的设置将影响我的程序的性能。
基本上问题是客户操作系统CPU如何映射到主机CPU内核?假设我在客户操作系统上将CPU数量设置为1,即使我在四核机器上运行,它究竟意味着什么?我可以推测出现两种情况中的至少一种:
我的单个虚拟核心绑定到特定的物理核心,因此guest虚拟机基本上运行在单个核心上。
虚拟CPU没有硬件绑定/分配给物理核心。因此,只要客户操作系统上的任何进程需要启动一个新线程,就可以将其分派给任何物理内核执行:四个中的任何一个,如我的例子所示。
后一种情况意味着客户操作系统在多核环境中运行,即使它"认为"它有一个核心。 (通过"思考"我的意思是像cat / proc / cpuinfo这样的命令只报告一个核心)
我一般都在问问题,但如果VirtualBox和VMWare之间存在特殊差异,并且您碰巧知道它们,我将非常感谢您的分享。
答案 0 :(得分:0)
我可能错了,但我认为虚拟CPU对应于虚拟机在任何给定时间在主机上运行的最大线程数。
答案 1 :(得分:0)
实际上,只要您使用的是基于硬件的system-level virtualization而不是User-mode Linux之类的东西,大多数情况下都会发生在中间的某个地方。
就主机操作系统而言,VM每个虚拟核心只有一个CPU线程。 I / O等可能还有其他线程,但这些线程独立于虚拟核心数,是仿真器的一部分,对于来宾操作系统完全不可见。
最终结果是,在单核VM上,所有客户机线程都会在每个特定时刻在同一个CPU上运行 - 客户机线程在容器线程中“批处理”,并且不会对主机操作系统单独可见。< / p>
也就是说,除非您将仿真器线程的CPU affinity设置为一个或多个特定的物理CPU核心,否则主机OS调度程序可能会每隔几秒定期将线程迁移到不同的核心,就像任何其他进程一样