Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
单docker容器在cpu性能方面略优于其主机:为什么?_Docker - Fatal编程技术网

单docker容器在cpu性能方面略优于其主机:为什么?

单docker容器在cpu性能方面略优于其主机:为什么?,docker,Docker,我运行了一个实验来比较docker容器的CPU性能和它运行的主机的CPU性能 案例 A:在主机上运行的基准程序(英特尔i5,2.6 GHz,2个处理器,2个内核) B:在同一主机上运行的Docker容器上运行基准程序。 (未对B中的容器进行资源限制。即,容器本身拥有所有1024个cpu共享。没有其他容器正在运行) 基准计划:数值积分 数值积分:是大规模并行程序的标准示例。在C++中使用OpenMP LIB编写标准的数值积分(已经被测试过了)。通过改变程序中1-11之间的可用线程数,程序运行11次

我运行了一个实验来比较docker容器的CPU性能和它运行的主机的CPU性能

案例

A:在主机上运行的基准程序(英特尔i5,2.6 GHz,2个处理器,2个内核)
B:在同一主机上运行的Docker容器上运行基准程序。 (未对B中的容器进行资源限制。即,容器本身拥有所有1024个cpu共享。没有其他容器正在运行)

基准计划:数值积分

数值积分:是大规模并行程序的标准示例。在C++中使用OpenMP LIB编写标准的数值积分(已经被测试过了)。通过改变程序中1-11之间的可用线程数,程序运行11次。这11次运行针对每种情况A和B。因此,总共22次运行针对主机11次,针对容器11次

X轴:程序中可用的线程数

Y轴:表示时间倒数的性能(通过将运行程序的时间倒数乘以常数计算)

结果

观察

主机上运行的docker容器的性能略优于主机。该实验在2个不同的主机上重复4-5次,并且一次容器性能曲线略高于主机性能曲线

问题

当docker容器在主机上运行时,容器性能如何高于主机

可能的原因:docker cgroup进程的优先级更高


我假设,与程序直接在主机上运行相比,容器的cgroup中的进程可能会获得更高的进程优先级,从而导致容器中运行的程序具有更高的性能。这听起来像是一个可能的解释吗

感谢@miraclixx和@Zboson的评论,这帮助我理解了容器并没有真正超越主机。奇怪的结果(有问题的绘图)是因为在执行实验时主机和容器上使用了不同的编译器版本。在容器和主机中更新到相同版本的编译器后再次运行案例A&B时,结果如下:

无优化标志

带有优化标志
-O3

观察

可以观察到,容器的性能与主机相同或稍差;这在直觉上是有道理的。(如果不进行优化,则存在两个差异)


p.S为这个误导性的问题标题道歉。在发布评论之前,我不知道性能差异可能是由于不同的编译器版本造成的。

您如何确定时间?这是什么。什么编译器。什么是编译器选项。我有点惊讶,您在两个线程后看到如此多的改进,因为您只有两个物理内核,而HT通常不那么有效。查看代码,您似乎正在使用
omp\u get\u wtime()
。“那很好。@Zboson:我的不好,我在混乱中输入了2个核心和HT-2。它是2个处理器和2个内核。现在更新了这个问题。操作系统也是:Ubuntu 14.04。编译器是带有-fopenmp选项配置的g++,而不是我所期望的。我唯一的想法可能是docker容器“更干净”,不做访问时病毒检查或类似的烦人事情……主机v.s.上的编译器或OpenMP版本/配置与docker映像中的版本/配置有区别吗?看到每次运行都使用驱动程序编译程序,这可能是优化差异的来源。我认为这里的重要一课是只讨论启用优化的性能。请注意,单线程优化代码的运行速度几乎与具有四个线程的未优化代码的运行速度一样快!四个优化线程的速度几乎是四个未优化线程的三倍!我怀疑,如果您使用了针对原始绘图的优化,那么您没有看到意外的差异,因为主机使用了比容器更新的GCC版本。最后,我会用科学记数法绘制你的图,因为数到所有的零都很烦人。