Docker容器消失并且工作太慢

时间:2019-02-20 13:26:48

标签: java docker amazon-ec2

我有一个多线程数据处理作业,该作业在EC2实例上大约需要5个小时(相同代码)完成。但是,当它在docker容器上运行时(我在创建该容器之前将其配置为具有7 GB的RAM),该作业在docker容器中缓慢运行了大约12个小时以上,然后docker容器消失了。我们该如何解决呢?为什么在Docker容器中工作会非常缓慢?泊坞窗中的CPU处理非常缓慢,而不仅仅是网络I / O。网络I / O缓慢即可。但是我想知道与EC2实例相比CPU处理速度很慢的原因可能是什么。另外,在哪里可以找到主机操作系统中导致docker容器死亡的详细跟踪。

**docker logs <container_id>**
19-Feb-2019 22:49:42.098 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
19-Feb-2019 22:49:42.105 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"]
19-Feb-2019 22:49:42.106 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 27468 ms
19-Feb-2019 22:55:12.122 INFO [localhost-startStop-2] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/tomcat/webapps/logging]
19-Feb-2019 22:55:12.154 INFO [localhost-startStop-2] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/tomcat/webapps/logging] has finished in [32] ms
searchResourcePath=[null], isSearchResourceAvailable=[false]
knowledgeCommonResourcePath=[null], isKnowledgeCommonResourceAvailable=[false]
Load language resource fail...
blah blah blah some application log
bash: line 1:    10 Killed                  /usr/local/tomcat/bin/catalina.sh run
Error in Tomcat run: 137 ... failed!

执行dmesg -T | grep docker,这就是我所看到的。什么是500 dockerd? -500 docker-proxy?如何解释这里的含义?

[Tue Feb 19 14:49:04 2019] docker0: port 1(vethc30f313) entered blocking state
[Tue Feb 19 14:49:04 2019] docker0: port 1(vethc30f313) entered forwarding state
[Tue Feb 19 14:49:04 2019] docker0: port 1(vethc30f313) entered disabled state
[Tue Feb 19 14:49:07 2019] docker0: port 1(vethc30f313) entered blocking state
[Tue Feb 19 14:49:07 2019] docker0: port 1(vethc30f313) entered forwarding state
**[Wed Feb 20 04:09:23 2019] [10510]     0 10510   197835    12301     111        0          -500 dockerd
[Wed Feb 20 04:09:23 2019] [11241]     0 11241    84733     5434      53        0             0 docker
[Wed Feb 20 04:09:23 2019] [11297]     0 11297    29279      292      18        0          -500 docker-proxy**
[Wed Feb 20 04:09:30 2019] docker0: port 1(vethc30f313) entered disabled state
[Wed Feb 20 04:09:30 2019] docker0: port 1(vethc30f313) entered disabled state
[Wed Feb 20 04:09:30 2019] docker0: port 1(vethc30f313) entered disabled state

在04:09:23,从上方显示500个dockerd等,从下方显示04:09:24 Kill 11369 Java进程得分等。这是什么意思?它不会杀死docker进程吗?它杀死了在Docker容器中运行的Java进程吗?

demsg -T | grep Java 2019年2月20日星期三04:09:23] [3281] 503 3281 654479 38824 145 0 0 java [2019年2月20日星期三04:09:23] [11369] 0 11369 3253416 1757772 4385 0 0 java [2019年2月20日星期三04:09:24]内存不足:杀死进程11369(java)得分914或牺牲孩子 [2019年2月20日星期三04:09:24]杀死进程11369(java)total-vm:13013664kB,anon-rss:7031088kB,file-rss:0kB,shmem-rss:0kB

1 个答案:

答案 0 :(得分:1)

TL; DR,您需要增加VM /主机上的内存,或减少应用程序的内存使用。

由于主机内存不足,操作系统正在杀死正在容器内运行的Java。当容器内部的进程终止时,容器本身将进入退出状态。您可以通过docker ps -a查看这些未运行的容器。

默认情况下,docker不会限制容器的CPU或内存。您可以在容器上添加这些限制,并且如果您的容器超出了容器内存限制,则docker将杀死该容器。当您检查停止的容器时,该结果将显示为OOM状态。

在docker进程上看到以太-500行设置的原因是为了防止主机内存不足时操作系统杀死docker本身。取而代之的是,容器中的进程被杀死,您可以在docker中配置重启策略以重启该容器。

您可以在https://docs.docker.com/engine/reference/run/

上了解有关内存限制以及为容器进程配置OOM分数的更多信息。