V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
cheneydog
V2EX  ›  问与答

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

  •  
  •   cheneydog · 2018-12-27 10:13:15 +08:00 · 2385 次点击
    这是一个创建于 2159 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题描述

    我在使用 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
    
    5 条回复    2018-12-27 17:51:54 +08:00
    cheneydog
        1
    cheneydog  
    OP
       2018-12-27 10:14:54 +08:00
    基于容器的云应该很多的吧,不会因为客户的 jvm 参数不对就卡死吧。
    Vogan
        2
    Vogan  
       2018-12-27 10:46:11 +08:00   ❤️ 1
    1.内核版本太低
    2.限制单个容器的内存和 CPU
    denghongcai
        3
    denghongcai  
       2018-12-27 12:09:42 +08:00
    oom killer 杀了除 Dockerd 之外的其他进程后,Docker 无法正常工作了?这个感觉比较奇怪

    建议 GitHub 上提个 issue
    ooeyunarika
        4
    ooeyunarika  
       2018-12-27 13:02:36 +08:00
    docker ps 能用但不能 docker run 有点奇怪,dockerd 没有抛出相关日志么?或者看一下 docker golang 的堆栈,github 提 issue 也会要求附上 golang 内存堆栈的

    之前我遇到过 docker ps 都不行的死锁情况,是因为 container 在被 kill 的时候会加锁,禁止所有对 container 的 crud 操作,多个锁一起就很容易引起死锁.lz 遇到的问题很可能也是 container 上的死锁导致的

    另外也可以试着提高 dockerd 的优先级,系统的 OOM Kill 会优先杀优先级比较低的进程
    cheneydog
        5
    cheneydog  
    OP
       2018-12-27 17:51:54 +08:00
    @ooeyunarika 卡住之后 dockerd 的日志是完全停止的。docker golang 的堆栈没看过,我去找下看。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2966 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 13:38 · PVG 21:38 · LAX 05:38 · JFK 08:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.