V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要把任何和邀请码有关的内容发到 NAS 节点。

邀请码相关的内容请使用 /go/in 节点。

如果没有发送到 /go/in,那么会被移动到 /go/pointless 同时账号会被降权。如果持续触发这样的移动,会导致账号被禁用。
zjyg1993
V2EX  ›  NAS

求解为啥 docker 总是 out of memory

  •  
  •   zjyg1993 · 37 天前 · 2783 次点击
    这是一个创建于 37 天前的主题,其中的信息可能已经有所发展或是发生改变。
    机器内存是 4G ,目前开了 5 个容器,分别是 alist 、navidrome 、homeassistant 、lucky 、iptv ,

    目前内存使用情况:已用 882M ,缓存 1.4G ,可用 1.9G ,docker 版本:20.10.25

    但是经常会发现某些容器自己会停掉,但是 cpu 和内存也没怎么占用,再开一些空间 200M 左右的应用(比如 music_tag_web ),就会无法启动,或者已经运行的容器就会停止,然后跑 docker 就提示 fatal error: out of memory allocating heap arena map 。

    但是 HA 都能跑起来,占用也不高,怎么就经常杀进程呢?百思不得其解

    求懂的老哥解答一二。
    15 条回复    2024-12-16 19:39:46 +08:00
    rockxsj
        1
    rockxsj  
       37 天前
    插嘴问一句,iptv 是哪个服务?🤔
    zjyg1993
        2
    zjyg1993  
    OP
       37 天前
    @rockxsj hub-docker 上有一个叫做 allinone 的项目,可以生成 m3u 的文件,导入到电视机,或者播放器,就可以看高清电视
    Emiya1208
        3
    Emiya1208  
       37 天前   ❤️ 2
    你提供的信息非常有限,且服务器不在我手上无法 debug ,仅凭借现有信息做如下推断:

    这应该不是 docker 的问题。

    sysctl -a | grep overcommit_memory

    检查这个,我猜应该是 0 ,当设置为 0 时,系统会基于一个启发式算法来决定是否允许分配。这个算法考虑的因素包括当前可用内存、swap 空间等。或许你的程序运行起来只需要 1MB 内存(极端假设),但是它申请了 2G (它为自己未来可能用到的内存进行申请,尽管这并不会直接使用 2G ),那么会直接 oom 。

    考虑临时设置为 overcommit_memory = 1 看看,我猜大概率是可以运行起来的。但是保持,永远的设置为 1 需要一定的 linux 专业知识,简称,你真的知道你在干嘛。
    Hieroglyph
        4
    Hieroglyph  
       37 天前
    3 楼正解,可以关注一下内核的一些内存限制参数
    ala2008
        5
    ala2008  
       37 天前
    有没有配置限制内存之类的
    sasaba
        6
    sasaba  
       37 天前
    docker 计算内存用量的时候似乎会算上 buff cache ,如果写了太多文件可能是这个原因
    aru
        7
    aru  
       36 天前
    先加上 4G 的 swap ,再观察下
    有些进程会申请很大的内存
    aogg
        8
    aogg  
       36 天前
    docker stats 查看内存变化
    31415926535x
        9
    31415926535x  
       36 天前
    可能是因为其他服务申请的内存较多且存在超卖逻辑而崩掉了,看看宿主机是不是也有啥服务呢,
    如果不是那么重要的应用,加自动重启吧
    DefoliationM
        10
    DefoliationM  
       36 天前 via Android
    zswap 开一开,swap 加一加
    mingtdlb
        11
    mingtdlb  
       36 天前
    是不是你容器的问题,docker 一般不会有问题。你 run 容器的时候限制一下 内存 试试
    blessingcr
        12
    blessingcr  
       35 天前
    之前试过各种中间件 oom ,大概都是 docker 容器内的某些服务,他没限制 xmx,MetaspaceSize ,MetaspaceSize 之类的最大内存; 然后有的服务他不到最大内存不 rc ; 服务内存+容器内系统内存> 容器内存就 oom 了;
    试试加点内存或者限制下内存
    blessingcr
        13
    blessingcr  
       35 天前
    docker 本身真的没问题 嘎嘎好用
    RobberPhex
        14
    RobberPhex  
       34 天前
    看了上面的回答,我觉得解决问题是 ok 的,但是我们还是要有一些方法论的。

    比如见到 oom ,我们应该看一下 dmesg 等 oom 日志,看下为什么 oom-kill ,是 cgroup 限制了,还是 kernel 限制了,是否需要 overcommit 等。

    开 overcommit_memory 、加 swap 等,只能说是缓解问题,但不能算是解决了问题。
    y1y1
        15
    y1y1  
       32 天前
    alist 不是用的 xiaoya 吧?之前有过爆内存的情况
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2641 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 04:50 · PVG 12:50 · LAX 20:50 · JFK 23:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.