为什么内核 kill OOM导致 Dockerd 死掉

问题描述

我在使用 k8s 私有云的过程中,由于 jvm 和 docker 内存限定问题,总是触发内核的 OOM。但是触发了内核的 OOM 之后,dockerd 就有可能死掉,完全无反应。

图片描述

  • docker images 可以用
  • docker ps 可以用
  • docker run -it nginx sh 卡死无响应
  • service docker restart 卡死无响应
  • reboot 卡死无响应

问题出现的环境背景及自己尝试过哪些方法

  • 操作系统

CentOS Linux release 7.4.1708 (Core)
Linux x 3.10.0-693.2.2.el7.x86_64 #1 SMP Tue Sep 12 22:26:13 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

  • Docker
Client:
 Version:           18.06.1-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        e68fc7a
 Built:             Tue Aug 21 17:23:03 2018
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.1-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       e68fc7a
  Built:            Tue Aug 21 17:25:29 2018
  OS/Arch:          linux/amd64
  Experimental:     false

我曾尝试关掉内核的 OOM kill 机制,但是没有生效。

sysctl -p
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
vm.swappiness = 0
net.ipv4.neigh.default.gc_stale_time = 120
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
kernel.sysrq = 1
vm.overcommit_memory = 2
阅读 3.1k
1 个回答

OOM 发生时, 容器进程被强制结束, 也许部分资源没来得及释放而导致 docker 服务异常.

我认为关闭 OOM 不太好, 不如找出内存泄漏的原因, 或者限制容器的内存大小, 或给容器分配 swap 分区.
请参考 https://docs.docker.com/confi...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题