我们刚刚编写了一个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
答案 0 :(得分:9)
朋友们,我充满了耻辱:自己的MacOS Docker桌面客户端有一个设置可以启用更多或更少的内核。不知道在上一版本中是否添加了某些内容,但我没有注意到。默认情况下,它有两个内核而不是四个内核,这看起来很精明。
以下是屏幕显示方式:
顺便说一下,只有同一台机器上的信息:
答案 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,那么Docker将需要使用虚拟机。据我所知,所有Docker镜像都期待Linux操作系统环境(尽管我认为有人可能正在构建需要VM在Linux上运行的Windows映像)。该虚拟机将具有配置数量的CPU核心。你需要找到一种方法来调整它,并确保它是你想要的。