【问题标题】:Docker has RAM allocated after killed a processDocker 在杀死进程后分配了 RAM
【发布时间】:2021-09-06 20:18:41
【问题描述】:

我在 Docker 容器上看到我的进程的 RAM 占用,但它似乎会产生 泄漏

我做了以下步骤:

  1. 在不运行任何东西的情况下创建 docker 并执行 docker stats [CONTAINER_ID] 并得到正确的结果:
CONTAINER ID   NAME               CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O   PIDS
0ac5cdb9d61b   unruffled_margulis   0.00%     852KiB / 12.69GiB   0.01%     736B / 0B   0B / 0B     1
  1. 然后我启动了一个等待队列输入的进程(但我不会发送任何输入来检查其在侦听期间的占用情况)。该进程分配资源,因为它加载了一些模型
root@d6d1d82fe4c7:/app# listen.py

还有这些统计数据:

CONTAINER ID   NAME                 CPU %     MEM USAGE / LIMIT     MEM %     NET I/O          BLOCK I/O   PIDS
0ac5cdb9d61b   unruffled_margulis   0.00%     4.628GiB / 12.69GiB   36.49%    8.2kB / 2.61kB   0B / 0B     11
  1. 然后我停止该进程并以相同的方式重新启动它:
root@d6d1d82fe4c7:/app# ^C
root@d6d1d82fe4c7:/app# listen.py
CONTAINER ID   NAME                 CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O   PIDS
0ac5cdb9d61b   unruffled_margulis   0.00%     8.451GiB / 12.69GiB   66.62%    15.8kB / 5.54kB   0B / 0B     11

令人难以置信的 RAM 占用是 以前的两倍!!!进程被杀掉了,但是就像之前进程的模型还在Docker中加载一样。

  1. 再次杀死该进程后,无需重新启动它:
root@d6d1d82fe4c7:/app# ^C
CONTAINER ID   NAME                 CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O   PIDS
0ac5cdb9d61b   unruffled_margulis   0.00%     3.825GiB / 12.69GiB   30.15%    16.3kB / 5.86kB   0B / 0B     1

在没有任何进程运行的情况下分配了一些资源。对于 htop,我看到了不同的 RAM 使用情况:800MiB,这对于什么都不做来说太多了,并且与 docker stats 不同。

我尝试重复此操作,似乎在 2 次启动后,RAM 阻塞 8GiB(在其他尝试中也没有超过),但这种行为是否正常?如何清理 Docker 上的 RAM?

编辑

经过一些实验,我尝试将最大 Docker 内存限制为 7GB,以便在“第一次增加 RAM”之后看到容器 killed。但是有了这个新配置,RAM 稳定在 4.628GiB

再次将限制设置为 13GB,RAM 在第二次运行时恢复为 8.451GiB。奇怪的是,在这个增量之后,在接下来的步骤中似乎不再增加了。而如果我加载更少的模型,为了分配更少的内存,每次启动脚本时似乎都会增加内存。

所以我的直觉是Docker缓存了一些资源,但是如果达到内存的限制,它就会释放缓存并分配新的资源。 用我一开始看到的free -m命令:

root@29d5547ba8ec:/app# free -m
       total    used    free   shared buff/cache  available
Mem:     12989     412    11638     400     938    11876
Swap:     1023      0    1023

首次发布后:

root@29d5547ba8ec:/app# free -m
       total    used    free   shared buff/cache  available
Mem:     12989     454    7477     400    5057    11841
Swap:     1023      0    1023

查看字段buff/cache。不知道这样对不对???

【问题讨论】:

  • 你能提供一个minimal reproducible example吗?
  • 我试着用some_str = ' ' * 4000000000分配内存给你一个例子,但效果不一样。我的脚本很复杂并且会加载大量内存。也许有些图书馆对记忆有奇怪的影响。我用我对@BMitch 的解释编辑了这个问题

标签: docker memory memory-leaks ram htop


【解决方案1】:

要释放容器上的内存,您可以:

  1. 重启 docker 容器
  2. 清除主机服务器内存

这是因为 Docker 容器被表示为主机系统上的进程。因此,您需要释放与容器进程关联的内存。这可能很困难,尤其是因为进程可能依赖于共享内存结构。

如果你想释放内存,你可以使用以下命令尝试清除主机服务器的内存,如果你使用的是Linux:

刷新磁盘内存缓冲区中的数据:$ sync

仅清除 PageCache。

同步;回声 1 > /proc/sys/vm/drop_caches

清除dentries和inode。

同步;回声 2 > /proc/sys/vm/drop_caches

清除 PageCache、dentries 和 inode。

同步;回声 3 > /proc/sys/vm/drop_caches

【讨论】:

  • 我在 MacOS 上使用 Linux 容器。我试过sync && sudo purge,但没有任何改变
  • 我在我的问题上添加了一些注释并更新@shaqil-ismail
  • 如果您将内存更改为 7GB 的限制,我认为容器可能使用了虚拟内存。目前我不确定 Docker 中如何使用虚拟内存。
猜你喜欢
  • 2018-11-29
  • 1970-01-01
  • 1970-01-01
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 2017-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多