向virtualbox添加更多内核会使应用程序从16个内核开始变慢

时间:2015-04-09 15:55:54

标签: python performance virtualbox cpu overhead

目前我正在测试具有64个内核的服务器上的应用程序。此服务器安装了虚拟机,最多可以使用32个核心但不能更多(此限制由virtualbox提供)。由于我使用mininet测试我的应用程序,我需要root权限才能执行它。我没有服务器上的root权限,但是在VM中。所以我的设置是:

  • 主机有64个核心并安装了ubuntu

  • 使用ubuntu的virtualbox VM具有1 - 32个核心

  • 我的应用程序在16个mininet主机上运行,​​每个主机都运行一个程序,该程序使用多播和单播相互通信,但现在没有太多请求。每个主机启动后大约有5个请求。开始时延迟3秒以避免开始时的瓶颈

  • 我的应用程序使用多个线程,但主机上的每个应用程序实例都独立于其他应用程序

  • 我的应用程序使用python的APScheduler并完全用python编写

我认为用32核运行它是最好的。但是,当我这样做时,一切都开始挂起。我在APScheduler中得到超时,系统负载非常高。

所以我尝试了1到32之间的每个核心数。以下是一些例子:

1核心 1 Core

4核心 4 Cores

8个核心 8 Cores

12个核心 12 Cores

16个核心 16 Cores

20个核心 20 Cores

23个核心 23 Cores

27个核心 27 Cores

32核心 32 Cores

x轴是半秒,y acis是由top -b -n 1以百分比形式报告的CPU负载。我用每个核心计数运行应用程序大约10分钟。蓝线是我的应用程序的平均CPU负载。红线是我的应用程序,绿线是整个系统的负载。

如您所见,负载降低到大约16个核心。当使用超过16个内核时,它会变得更慢,从大约23个内核开始,它变得非常慢。即使那个记录CPU负载的进程甚至不再调用的速度很慢。这就是为什么上图中的图表更短......

有人知道可能是什么问题吗?这是虚拟机的已知错误吗?这是一个mininet问题吗?还是一个linux问题?我如何知道哪些部件会导致极端负荷?

如果您需要更多信息,请撰写评论,我将编辑问题。

来宾系统的负载从未高于50%,所以我认为这不是问题。

VMWare可能会更快吗?

修改 我查看了这些图,发现描述我的应用程序的平均CPU负载的蓝线(所有mininet主机上的所有实例的平均值)在从1变为2到3到16核时甚至变得更高。但是从1到16个核心,我的应用程序的CPU负载增加非常非常慢。虽然这会增加整体系统负载下降(这在我看来是有道理的,因为ubuntu可以在不同的核心上完成任务,只要没有共享资源就会更快)。

那为什么平均值会增加?为什么它从16核心开始呈指数级增长?

1 个答案:

答案 0 :(得分:2)

一旦程序开始在处理器套接字边界上运行,这是常见的行为。通常,一旦应用程序开始在驻留在不同物理处理器上的核上执行,您将开始看到不可预测的计时行为。

假设您的64核心机器有四个处理器插槽,每个处理器有16个核心,并且假设您的调度程序是一个理智的调度程序,试图将应用程序的线程分组在同一个套接字上,那么您的应用程序应该看到1到16个内核之间的良好并行加速,但是一旦使用超过16个内核,它将开始运行不佳,因为其中一些必须驻留在单独的套接字上。

对于常规计算机和虚拟机都是如此,但如果虚拟机的调度程序不了解这些套接字边界,则可能会增加另一层不可预测性。