我在 Docker 容器上看到我的进程占用了 RAM,但它似乎产生了泄漏。
我做了以下步骤:
- 创建 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
- 然后我启动了一个等待队列输入的进程(但我不会发送任何输入来检查其在侦听过程中的占用情况)。该进程分配资源是因为它加载了一些模型:
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
- 然后我停止该过程并以相同的方式重新启动它:
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 中一样。
- 再次杀死该进程后,无需重新启动它:
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
有些资源是在没有任何进程运行的情况下分配的。我看到了不同的 RAM使用htop
情况:800MiB,这对于什么都不做来说太多了,并且与docker stats
.
我试图重复这一点,似乎在 2 次启动后,RAM 块在 8GiB 上(在其他尝试中也没有超过),但这种行为是否正常?如何清理 Docker 上的 RAM?
编辑
经过一些实验,我尝试将最大 Docker 内存限制为 7GB,以便killed
在“第一次增加 RAM”之后看到容器。但是有了这个新配置,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
。我不知道这是否正确