Zookeeper 或 Marathon docker 容器使用 100% CPU

Zookeeper or Marathon docker container using 100% CPU

我是 运行 一个本地 docker-compose 设置,它有一个 Zookeeper 容器(已获取最新版本)和一个 Marathon 容器 (v1.1.0)。自上个月以来,每当我打开我的容器时,我的 CPU 使用率会在几分钟后达到 100%,即使我保持它闲置并且不执行任何操作也是如此。

我的设置 - Ubuntu 17.10 与 docker-ce 18.03.0 和 docker-compose 1.21.0

运行 top 给我这个 -

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                        
 7055 root      20   0 4527380 446644  45836 S  99.0  6.5   2:10.43 java 

ps 辅助 | grep java 给出这个 -

harry     6928  0.1  0.6 3227008 47656 ?       Ssl  16:00   0:02 /usr/lib/jvm/java-1.8-openjdk/jre/bin/java -Dzookeeper.log.dir=. -Dzookeeper.root.logger=INFO,CONSOLE -cp /zookeeper-3.4.11/bin/../build/classes:/zookeeper-3.4.11/bin/../build/lib/*.jar:/zookeeper-3.4.11/bin/../lib/slf4j-log4j12-1.6.1.jar:/zookeeper-3.4.11/bin/../lib/slf4j-api-1.6.1.jar:/zookeeper-3.4.11/bin/../lib/netty-3.10.5.Final.jar:/zookeeper-3.4.11/bin/../lib/log4j-1.2.16.jar:/zookeeper-3.4.11/bin/../lib/jline-0.9.94.jar:/zookeeper-3.4.11/bin/../lib/audience-annotations-0.5.0.jar:/zookeeper-3.4.11/bin/../zookeeper-3.4.11.jar:/zookeeper-3.4.11/bin/../src/java/lib/*.jar:/conf: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false org.apache.zookeeper.server.quorum.QuorumPeerMain /conf/zoo.cfg
root      7055 11.9  6.6 4527380 459896 ?      Ssl  16:00   3:35 java -jar /marathon/bin/../target/marathon-assembly-1.1.1.jar --master local --zk zk://zookeeper:2181/marathon --event_subscriber http_callback
harry     8551  0.0  0.0  15376  1068 pts/4    S+   16:30   0:00 grep --color=auto java

我已与我的同事确认 运行 OSX 并且相同的设置不会影响他们。所以这必须与 marathon 或 zookeeper 容器在 Ubuntu 上做错了什么有关。

首先你应该检查100%是不是主要是你的容器执行或者宿主机的其他程序导致的。 您的 cpu 负载是由容器进程还是主机进程引起的还不是很清楚,所以,我将列出这两种可能性。

如果高cpu负载主要是由容器造成的

在这种情况下,您应该 运行 docker 容器限制 cpu 主机的负载(配额):

docker run --cpu-quota (int value) ...

当然,在主机的具体 core/cpu 上设置 docker 执行也很有用。例如:

docker run --cpuset-cpus 0,1,5 ...
docker run --cpuset-cpus 0-4 ...

如果要在高负载情况下优先执行 docker: launch docker container 指定多少会有用 cpus 你想为你的 docker 容器保留。 :

NCPUS=`cat /proc/cpuinfo | grep processor | wc -l`
docker run --cpus [float number between 0 and $NCPUS] ...

请注意,所有 cpu 核心的 100% 相当于执行 docker 运行 --cpus $NCPUS,但这显然是不可能的,因为您的系统需要一些 cpu 用法。 此外,如果您对 swarm 副本使用等效选项,例如,只有在 cpu 资源足够时副本才会启动。请参阅文档: docker info