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

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

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

求解为啥 docker 总是 out of memory

  •  
  •   zjyg1993 · 5 天前 · 2335 次点击
    机器内存是 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  
       5 天前
    插嘴问一句,iptv 是哪个服务?🤔
    zjyg1993
        2
    zjyg1993  
    OP
       5 天前
    @rockxsj hub-docker 上有一个叫做 allinone 的项目,可以生成 m3u 的文件,导入到电视机,或者播放器,就可以看高清电视
    Emiya1208
        3
    Emiya1208  
       5 天前   ❤️ 2
    你提供的信息非常有限,且服务器不在我手上无法 debug ,仅凭借现有信息做如下推断:

    这应该不是 docker 的问题。

    sysctl -a | grep overcommit_memory

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

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

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

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