VirtualBox是如何计算可用的虚拟CPU数量的?

4
我已经尝试在VB IRC频道、stackexchange、stackoverflow、superuser和其他地方寻找答案。虽然有些答案接近,但并不是我想知道的。
这只是一个好奇的问题,与任何错误、增强请求或安全问题无关。如果您认为这个论坛不是得到答案的地方,请将我引荐到正确的场所。谢谢。(虽然很难想象VBox自己的论坛可能是错误的地方,但我没有看到我的具体问题的答案或发布到适当类别的地方)。无论发生什么事,请不要关闭我的问题,至少指向更好的资源(我讨厌这种情况!)。再次感谢。
现在,问题是:Virtualbox的主机驱动程序如何计算提供的虚拟CPU总数?
请注意,我不会回答那些没有真正阅读问题或至少先询问更多澄清的人的答案。我认为这是一个非常直截了当的问题。
让我分解这个问题,以便尽可能准确和简洁地说明我真正想问的内容。我好奇的是 VirtualBox HOST 软件(无论是哪一部分)如何确定出现在配置界面上的虚拟 CPU 的数量,在该界面上,用户选择他们想要应用于特定 VM 的 VCPU 数量。
我不在询问以下内容:我不在一般地询问虚拟化硬件的奇迹等。我理解多核和多线程、VTx等。我不在询问为特定 VM 或应用程序使用多少个 VCPU。我不在寻求帮助配置我问题中的任何特定 VM。我不要求任何人问我为什么需要知道——我已经告诉你了;我只是好奇而已。如果我的具体问题不引起您的兴趣,那没关系。再次强调,这只是一个简单、直接的问题:VirtualBox 是如何得出这个数字的?
我已经知道的是:至少一般来说,答案是物理 CPU 的两倍;好吧,如果是这样,为什么是两倍而不是三倍或其他乘数?(我知道分数数量对于奇数核心或线程是行不通的;我只是尽可能地概括)。例如,在我的 Phenom II X6 上,VirtualBox 提供了多达 12 个 VCPU。如果答案是线程,那就不可能,因为我的特定 Thuban 没有线程(有些 Thubans 有,有些没有)。然而,我的 Thuban 有超级传输,但没有超线程。同样,我的旧 Phenom II X2 将允许在 Virtualbox 中使用 4 个 VCPU。
我已经阅读了上述网站上的众多回复,警告用户不要为每个虚拟机使用超过一个VCPU,因为这会增加开销(首先,您必须运行IOAPIC,这会引入性能问题)。我也阅读了类似我的问题的帖子,但它们最终没有给出答案。
答案是一种希格玛总和或对数公式吗?它是否足够复杂,超出了此论坛的格式化能力?难以想象为什么如此难以得到这个答案,我想这个问题已经被问答许多次了。我真的想知道为什么通常看起来是2倍;为什么那是“魔术”数字。如果我阅读源代码(假设可用),注释会解释原因吗?
我将非常欣赏和敬佩阅读和回答这个问题的灵魂,而不是回答其他不相关的问题。我还希望您不要将我重定向到IRC的黑暗和敌对渠道; IRC上有一些非常反社会的实体,他们的言论让我想起《犯罪心理》中的某些未解决事件。请注意,我说“一些”——那里也有乐于助人的人。并不是要激怒;我只是不再喜欢去IRC了。如果您知道一个特定的有用的IRC昵称,我也会感激。
顺便说一句,我一直在谷歌上寻找答案,阅读SO、SE和SU委员会的文章,我看到有些人回答与完全无关的答案。这就是为什么我可能听起来语气严厉的原因。这是我的第一篇帖子,我希望回应会比我在IRC上的一些经历更为积极。

我不确定为什么你的问题在superuser.com上不受欢迎,那似乎是最合适的地方。 - Barmar
我只在Superuser上搜索了。虽然我没有在那里发布我的问题,但我认为它在那里和这里一样受欢迎;我并不完全确定所有这些类似网站之间的区别(但我也一直在研究)。 - Phelonius
需要记住的是,本网站是为了帮助你自己编写的程序或专门用于编程的工具(例如编译器、IDE、版本控制软件)而设立的。关于使用通用应用程序(如VirtualBox)的问题更适合在superuser.com上提问。关于VB为什么设计成这样的问题实际上没有一个特定的地方可以提问,除非直接向程序员提出问题。 - Barmar
这些网站中是否有内置机制可以重新定位类似这样位置不佳的问题?还是我必须自己“移动”它…实际上,如果我要移动它,我会重新措辞。无论如何,这并不完全是我想问的。我真正想了解的是关于“2”与其他乘数之间的实现决策。我想知道这是否是由于当今物理CPU的某些物理限制造成的。 - Phelonius
版主会在他们认为适当的时候移动问题。但是就像我说的,我不认为这个问题适合任何一个网站。 - Barmar
1个回答

4

看起来你在询问“VirtualBox GUI如何计算系统设置下处理器滑块的可用范围?”

因为VirtualBox是开源的(且非常干净、编写良好的源代码),所以挖掘代码并找到答案并不太难。深入/src/VBox/Frontends/VirtualBox/src/settings/machine文件夹,你可以看到所有组成设置UI元素的UI*文件。将会有你答案的具体文件是UIMachineSettingsSystem.cpp。从大约第45行开始(截至修订版43459),你可以看到以下代码:

/* Setup constants */
CSystemProperties properties = vboxGlobal().virtualBox().GetSystemProperties();
uint hostCPUs = vboxGlobal().host().GetProcessorCount();
mMinGuestCPU = properties.GetMinGuestCPUCount();
mMaxGuestCPU = RT_MIN (2 * hostCPUs, properties.GetMaxGuestCPUCount());

"

mMinGuestCPU变量和相关的GetMinGuestCPUCount()方法(以及mMaxGuestCPU/GetMaxGuestCPUCount())应该相对简单-通常为1,最大值将是主机上可用的物理/逻辑核心数。

因此,回答您的问题-滑块的比例通常为1到两倍可用核心数。我强烈建议您下载源代码并深入挖掘计算这些数字的方法,了解它们是如何计算以及涉及的细微差别。特别是vboxGlobal().host().GetProcessorCount()方法。

"

谢谢Goyuix。我有点想到源代码会是最后的手段。唯一的问题是,为什么?我猜我可以筛选源代码来尝试弄清楚原因,但我认为这说明了一些问题——2是一个硬编码数字。我可能应该更简洁地表达我的问题。我应该问这个乘数是否受到硬件物理属性的限制。我承认那将是一个更好的提问方式。不过话说回来,我甚至不确定它是否真的是硬编码或者依赖于其他参数。 - Phelonius
1
我怀疑这只是程序员做出的任意性能决定。在一个物理处理器上尝试仿真超过两个处理器会导致速度变慢太多。 - Barmar
你可能想看看programmers.stackexchange.com——它可能是关于为什么的问题最合适的地方。我并不积极参与那里,所以它也可能不是最合适的地方。你也可以尝试其中一个聊天室,看看是否有人在线对讨论感兴趣。 - Goyuix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接