Jenkins docker 容器以 exitcode 137 退出,并且 oom kill 为 false

Jenkins docker 容器以 exitcode 137 退出,并且 oom kill 为 false

我们正在为 jenkins master 运行一个 docker 容器,它每 3 天就会以“退出代码 137”退出。我们必须重新启动 EC2 并启动映像才能使其再次运行。仅重新启动容器不起作用。

在退出的容器上执行 docker inspect 可以得到以下信息:“State”: {“Status”:“exited”,“Running”:false,“Paused”:false,“Restarting”:false,“OOMKilled”:false,“Dead”:false,“Pid”:0,“ExitCode”:137,“Error”:“”,“StartedAt”:“2019-09-05T11:00:29.683406065Z”,“FinishedAt”:“2019-09-05T13:24:26.336749715Z”

EC2 是一个具有 8GB 内存的 m5a.large 实例,正在运行的容器上的 docker 统计信息给我提供了以下信息:容器 ID 名称 CPU % 内存使用率/限制内存% NET I/O 块 I/O PIDS 88530703bf01 xenodochial_chandrasekhar 0.58% 1.092GiB / 7.546GiB 14.47% 3.12MB / 6.67MB 368MB / 11.3MB 0

内存使用量显示 1.092GiB / 7.546GiB,这意味着内存上限是 8GB 的​​主机内存,并且 oomkilled 为假。

docker logs 命令没有显示太多信息。

还有人遇到过这个问题吗?我们如何知道容器退出的原因?

答案1

退出代码 137 表示该进程已被信号 9 ( SIGKILL) 终止:

Python 3.6.8 (default, Jan 14 2019, 11:02:34) 
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from os import *
>>> x = 137
>>> WIFEXITED(x)
False
>>> WIFSIGNALED(x)
True
>>> WTERMSIG(x)
9
>>> 

这意味着其他某个进程(或者可能是内核本身)SIGKILL向容器中运行的主进程发送了信号。这就是它退出的原因。

如果是内核,内核日志中将会有一条消息 ( dmesg, /var/log/kern.log)。查找“已终止进程”消息。

这也可能是由docker kill命令引起的。

docker stop如果(或等) 正在运行,但进程未在 10 秒内退出,也会出现这种情况restart。因此,如果某些东西正在停止或重新启动容器,但您的 Jenkins 进程需要很长时间才能退出(例如,如果它等待作业完成),则可能会导致此行为。

希望这可以帮助。

答案2

添加到马特的回答,如果 docker 负责终止进程,Docker 只会报告 OOMKilled。这要求您在容器上配置内存限制,并且该限制低于主机上可用的资源。如果您仍然看到容器被终止,那么很可能是 Linux 内核本身在耗尽整个主机上可用的内存后终止了进程。您可以使用查看内核操作dmesg或查看日志/var/logs

相关内容