Docker在杀死进程后分配了RAM



我在 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 上的内存?

编辑

经过一些实验,我试图将最大 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。我不知道这是否正确

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

  1. 重启码头工人容器
  2. 清除主机服务器内存

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

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

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

仅清除页面缓存。

sync; echo 1>/proc/sys/vm/drop_caches

清除条目和索引节点。

sync; echo 2>/proc/sys/vm/drop_caches

清除页面缓存、条目和索引节点。

sync; echo 3>/proc/sys/vm/drop_caches

相关内容

  • 没有找到相关文章

最新更新