【问题标题】:Docker container disappeared and job too slowDocker 容器消失了,工作太慢了
【发布时间】:2019-07-14 05:00:08
【问题描述】:

我有一个多线程数据处理作业,在 EC2 实例上大约需要 5 小时(相同的代码)完成。但是当它在 docker 容器上运行时(我在创建容器之前将其配置为具有 7 GB 的 RAM),该作业在 docker 容器中缓慢运行大约 12 多个小时,然后 docker 容器消失了。我们如何解决这个问题?为什么 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 码头代理?如何解释下面的内容?

[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 process score 等。这是什么意思?它没有杀死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 [Wed Feb 20 04:09:24 2019] 内存不足:杀死进程 11369 (java) 得分 914 或牺牲孩子 [2019 年 2 月 20 日星期三 04:09:24] 杀死进程 11369 (java) total-vm:13013664kB, anon-rss:7031088kB, file-rss:0kB, shmem-rss:0kB

【问题讨论】:

  • Killed 可能意味着您遇到内存不足错误并且内核(在 docker 之外)杀死了该进程。
  • 容器“消失”的原因是容器运行您在命令中告诉它的任何内容,然后根据定义杀死自己。请解释您在此处显示的错误是什么(在您询问为什么它缓慢且未提及错误的问题中)
  • @BMitch 感谢您的回复。从主机端,我在哪里可以看到到底发生了什么的详细痕迹。
  • @Vineel 你可以试试 /var/log 中的内核/操作系统日志。
  • "默认情况下,容器没有资源限制,并且可以使用主机内核调度程序允许的尽可能多的给定资源。[...] 默认情况下,每个容器对主机 CPU 的访问周期是无限的”正如 BMitch 和 NotSoShabby 所说,您应该调查该错误。访问日志,看看你能找到什么。

标签: java docker amazon-ec2


【解决方案1】:

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

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

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

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

您可以阅读更多关于内存限制和为容器进程配置 OOM 分数的信息:https://docs.docker.com/engine/reference/run/

【讨论】:

  • 您确定默认情况下 docker 不会限制容器可以使用的内存吗?在我的 docker MAC GUI 上,我可以看到默认情况下它的最大设置为 2 GB。
  • @Vineel 这是 docker 在里面运行的 VM 的大小,类似于在 AWS 中选择 VM 的大小。 docker 引擎在该 VM 内部运行,并且可以使用分配给它的所有资源。在新版本的 Docker for Mac 上,使用 xhyve + linuxkit 来运行 docker。
  • 当我们开启docker restart的时候,如果我们有一些正在写的文件,会不会被保留?
  • @Vineel 如果容器本身配置为重新启动,那么卷中或容器文件系统本身中的任何文件都将在那里。 tmpfs 中的任何内容都会丢失。如果您使用 Swarm Mode 之类的协调器重新启动,则只会保留存储在卷中的数据。
猜你喜欢
  • 1970-01-01
  • 2018-08-20
  • 1970-01-01
  • 2021-11-18
  • 2020-05-22
  • 1970-01-01
  • 2013-03-10
  • 2014-06-07
  • 2016-05-31
相关资源
最近更新 更多