【发布时间】: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