Docker无法获得100%的CPU

时间:2016-08-22 22:47:40

标签: performance docker benchmarking

我们刚刚编写了一个CPU密集型应用程序来对Docker镜像进行基准测试它是一个Java应用程序,它近似于Pi的小数。

  • 如果我们运行java -jar superpi.jar它会强调所有内核并且需要 30秒
  • 如果我们运行docker run fewlaps/superpi,它只会强调四个核心中的两个并且 70秒

Docker镜像正在运行.jar,就像在主机上运行它一样。为什么Docker镜像没有在本地运行.jar那么快?我们期望在本地运行它并在Docker上运行它之间有一些区别,但是这个过程需要花费一倍的时间。

有没有办法要求Docker使用所有CPU?

BTW,该项目在GitHub上发布:Fewlaps/SuperPI

3 个答案:

答案 0 :(得分:9)

朋友们,我充满了耻辱:自己的MacOS Docker桌面客户端有一个设置可以启用更多或更少的内核。不知道在上一版本中是否添加了某些内容,但我没有注意到。默认情况下,它有两个内核而不是四个内核,这看起来很精明。

以下是屏幕显示方式:

enter image description here

顺便说一下,只有同一台机器上的信息:

  • 运行.jar需要64,973毫秒
  • 运行运行.jar的Docker镜像需要83,449毫秒

答案 1 :(得分:5)

适用于MacOS的Docker和适用于Windows的Docker是您的问题出现的地方。 Docker不会在这些平台上进行原生运行(但是),因此他们的安装程序会启动运行boot2docker的VM。这些VM由VirtualBox控制,并且对分配给VM的CPU数量有限制。这些限制可以调整,所以我从那里开始(查看您的Docker实例的VirtualBox配置,更改这可能需要重新启动VM)。

要正确比较容器的开销,您需要在容器外运行""在运行Docker主机的VM内部进行测试。那,或者在一台在物理机器上运行Linux的机器上安装Docker,而不是在VM内部。

答案 2 :(得分:2)

有许多与CPU集和CPU份额相关的Docker命令行标志。确保没有设置或默认指定。在您的容器运行后,您可以使用docker ps找到它并使用docker inspect gloomy_archimedes之类的设置查看设置,并在HostConfig部分下方查看CpuShares,{{1}等内容等等。

您的Docker守护程序本身也可能受其init脚本或systemd单元定义的限制。您可以通过查找Docker守护程序的PID和CpusetCpus来检查。查找cat /proc/1199/status应设置为Cpus_allowed:

或者如果您在Windows或Apple OS X上运行Docker,那么Doc​​ker将需要使用虚拟机。据我所知,所有Docker镜像都期待Linux操作系统环境(尽管我认为有人可能正在构建需要VM在Linux上运行的Windows映像)。该虚拟机将具有配置数量的CPU核心。你需要找到一种方法来调整它,并确保它是你想要的。