码头工人容器在满足"TCP: out of memory"时会以 137 退出吗?



我正在docker容器中测试我的服务器应用程序,我看到它停止了,代码为137。

root@debian:~# docker ps -a
CONTAINER ID        IMAGE                   COMMAND                 CREATED             STATUS                      PORTS               NAMES
821959f20624        webserver-in-c_server   "./webserver -p 8080"   2 weeks ago         Exited (137) 40 hours ago                       server
root@debian:~# 

这是停滞过程的码头工人检查,OOMKilled设置为false:

root@debian:~# docker inspect server
[
{
"Id": "821959f206244d90297cfa0e31a89f4c8e06e3459cd8067e92b7cbb2e6fca3e0",
"Created": "2020-11-25T15:13:10.989199751Z",
"Path": "./webserver",
"Args": [
"-p",
"8080"
],
"State": {
"Status": "exited",
"Running": false,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 0,
"ExitCode": 137,
"Error": "",
"StartedAt": "2020-11-25T15:13:12.321234415Z",
"FinishedAt": "2020-12-09T17:55:30.649883125Z"
},

所以我的问题是,像下面这样的dmesg中的消息也会导致容器被杀死?

...
[1969112.586796] TCP: out of memory -- consider tuning tcp_mem
[1969122.585736] TCP: out of memory -- consider tuning tcp_mem
[1969132.585344] TCP: out of memory -- consider tuning tcp_mem
[1969142.585455] TCP: out of memory -- consider tuning tcp_mem
[1969152.598334] TCP: out of memory -- consider tuning tcp_mem
[1969162.585242] TCP: out of memory -- consider tuning tcp_mem

提前感谢!

如果您不在容器上设置内存限制,那么docker将永远不会终止进程,OOMKilled将始终为false。

无论docker中是否设置了内存限制,当Linux主机内存不足时,Linux内核本身总是有可能终止进程。(配置docker内存限制的原因是为了避免这种情况,或者至少可以在这种情况发生之前控制哪些容器被杀死。(当内核杀死你的进程时,你会得到一个信号9,也就是SIGKILL,应用程序无法捕获它,它会立即退出。这将被视为退出代码137(128+9(。

您可以深入研究syslog、/var/log下的各种内核日志和dmesg,以找到内核遇到OOM并杀死主机上进程的更多证据。当这种情况发生时,可以选择避免运行内存不足的进程,调整应用程序以使用更少的内存,或者向主机添加更多的内存。

我从未见过"TCP:内存不足";之前所以我会给你一些线索来帮助你首先,关于来自检查命令的选项:

"OOMKilled": false,
"Dead": false,

当您运行一个容器时,它们被设置为默认值(例如"dockerrunxxx"(,我发现一个条目已经响应了。在最后一个答案中,你可以找到更多关于容器为什么会在这些标志设置为false的情况下发生OOM的信息,所以BNT回复说:";默认情况下,如果发生内存不足(OOM(错误,内核会杀死容器中的进程;从docker的官方文件中抓取。

第二个,标志";TCP:内存不足--考虑调整TCP_mem";据我所见,这更可能是内核TCP级别的问题,在这篇SAP技术文章中解释了这一点,在他们的案例中,他们更改了网络内核参数来解决这个问题,但我建议通过以下方式检查您的设置:

sysctl -a | grep rmem

尝试通过/proc更改参数以进行测试,然后如果您需要通过关闭来保持它们,请在/etc/sysctl.conf中进行更改。

此外,如果您将标志设置为不杀死容器或不杀死容器,您将得到";TCP OOM";,直到您通过上面解释的信息调整好您的tcp参数套接字。此外,我在这里分享了一个非常好的分析,其中解释了TCP_mem和函数TCP_check_oom((的流程;所以基本上不会有sigkill,只是一个tcp oom。。这里的一个配额是:

此外,Linux内核正在过渡到内存压力模式当TCP oom发生时,限制分配给发送的内存/TCP套接字的接收缓冲区。因此,对于通过TCP发送和接收性能。

希望这些信息对您有用,并且可以标记为答案或不标记为答案,它将打开以查看/编辑以找到更好的答案。

最新更新