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

Sim*_*n H 6 python cpu performance virtualbox 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核心

4核心 4个核心

8个核心 8个核心

12核心 12个核心

16核 16个核心

20个核心 20个核心

23核心 23个核心

27核心 27个核心

32核心 32个核心

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核心开始呈指数级增长?

Dav*_*vid 2

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

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

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