Docker没有得到100%的CPU

我们只写了一个CPU密集型应用程序来testingDocker镜像。 这是一个Java应用程序,接近Pi的小数。

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

Docker镜像像在主机上运行一样运行.jar。 为什么Docker镜像不如在本地运行.jar那么快? 我们预计在本地运行它并在Docker上运行它有一些区别,但是这个过程需要两倍的时间。

有什么办法可以请求Docker使用所有的CPU?

顺便说一下,这个项目在GitHub上发布: Fewlaps / SuperPI

Docker for MacOS和Docker for Windows是您的问题出现的地方。 Docker不能在这两个平台上运行,所以安装程序会启动一个运行boot2docker的虚拟机。 这些虚拟机由VirtualBox控制,并且对分配给虚拟机的CPU数量有限制。 这些限制可以调整,所以我会从那里开始(检查您的Docker实例的VirtualBoxconfiguration,更改这可能需要重新启动虚拟机)。

为了正确比较容器的开销,你需要在运行你的Docker主机的虚拟机内运行你的“容器外”testing。 或者,在物理机器上运行Linux的机器上安装Docker,而不是在VM内部安装Docker。

朋友,我十分惭愧:自己的MacOS Docker桌面客户端有一个设置来启用更多或更less的内核。 不知道是否在最新版本中添加了某些内容,但是我没有注意到它。 默认情况下,它得到两个核心,而不是四个,这似乎是精明的。

屏幕显示如下:

在这里输入图像说明

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

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

Docker有很多与CPU集合和CPU共享有关的命令行标志。 确保那些没有被设置,或默认指定。 一旦你的容器运行,你可以用docker psfind它,并用docker inspect gloomy_archimedes等东西来查看设置,并查看HostConfig部分的内容,例如CpuSharesCpusetCpus等。

您的Docker守护进程本身也可能被其init脚本或systemd单元定义所限制。 你可以通过查找你的Docker守护进程的PID和cat /proc/1199/status 。 查找Cpus_allowed:应该设置为ff

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