6

我正在使用在具有 48 个 CPU 和 250GB RAM 的主机上运行的 VirtualBox 5.1,我正在导入的虚拟机(来宾)最初具有 2 个 CPU 和 4GB 的 RAM。

在这台机器内部,我正在使用 Java 运行一个进程,该进程启动动态数量的线程来执行某些任务。

我使用以下配置运行它:

我的笔记本电脑的整个过程(2 个 CPU/4GB RAM)~ 11 秒

服务器中的虚拟机中的相同程序(15 个 CPU 和 32GB 的 RAM)~ 45 秒

服务器中的虚拟机中的相同程序(20 个 CPU 和 32GB 的 RAM)~ 100+ 秒

服务器中的虚拟机中的相同程序(10 个 CPU 和 32GB 的 RAM)~ 5+ 秒

首先,我认为我从 Java 管理线程的方式存在问题,但经过多次测试,我发现虚拟机拥有的 CPU 数量与其性能之间存在关系,最大值为 10,之后机器的整体性能变慢(CPU饥饿?)

虚拟机运行 Oracle Enterprise Linux 6.7,主机运行 Oracle Enterprise Linux 6.9

我在虚拟机文档中找不到关于 CPU 数量的任何硬性限制。

是否需要设置一个设置来启用/利用 VirtualBox 实例中的 10 多个 CPU?

4

2 回答 2

8

自从我发布这个问题以来,时间已经过去了,只是为了存档,我将分享我的发现,希望它们可以帮助为他人节省时间。

事实证明,性能问题是由于 VirtualBox 的工作方式造成的。尤其是操作系统和管理程序之间的关系。

最后的虚拟机(来宾操作系统)是主机的单个进程,当您在虚拟机设置中修改 CPU 的数量时,他们将做的是更改进程必须模拟另一个进程的线程数CPU 的。(至少在 VirtualBox 中)

话虽如此,当我为 VM 分配 10+ 个 CPU 时,我最终得到:

  • 具有 10 多个线程的单个进程
  • 运行数百个进程的模拟操作系统
  • 我的 Java 代码正在创建另一组线程

所有这些共同导致设置使主机虚拟机进程饱和,我认为这是由于主机操作系统处理进程上下文切换的方式

在我的服务器上,硬限制是 7 个虚拟 CPU,如果我添加的数量超过该数量,则会降低 Java 软件的性能

在 VM 之外运行 Java 软件没有显示任何性能问题,它开箱即用,有 60 多个独立线程。

于 2017-11-28T21:26:25.370 回答
0

我们的设置与您的设置几乎相同(Virtualbox 在 2 个 NUMA 节点的 48 核机器上运行)。

我最初将核心数设置为 Virtualbox 支持的最大值(例如 32),但很快意识到两个 NUMA 节点中的一个始终处于空闲状态,而另一个保持中等负载,此时 VM 处于负载状态。

长话短说,一个进程只能分配给一个 NUMA 节点,而 Virtualbox 运行一个具有多个线程的用户进程......这意味着我们仅限于使用 24 个内核(考虑到这是 12 个内核,在实践中甚至更少) - 具有超线程的核心 CPU)。

于 2018-08-15T13:51:52.547 回答