我编写了一个测试 Node 应用,它会占用内存(以 100MB 为单位)。我尝试让它继续分配超出 8GB 物理内存限制的内存,方法是使用在其上运行的 Ubuntu 机器上配置的交换空间(16GB)。
在 Node 中正常运行时,它工作正常,如下所示:
node --max-old-space-size=16384 ./memtest/memtest.js
当我在 Docker 容器内运行它时,它会因物理内存的限制而终止。
我尝试了一些 Docker 选项来尝试让它使用交换空间,但它仍然在同一点被杀死。
docker run -m 8g --memory-swap -1 --memory-swappiness 100 ...
Amount allocated before container is killed: 3037.08 MB
# swapon --show
NAME TYPE SIZE USED PRIO
/swapfile file 16G 187M -2
# free
total used free shared buff/cache available
Mem: 8148324 1022788 5538364 124 1587172 6813484
Swap: 16777212 191228 16585984
从下面的文档看来,默认行为应该是允许无限制地使用内存 + 交换 - 正如我试图实现的那样。但是,我没有看到这一点。
https://docs.docker.com/config/containers/resource_constraints/
我想了解 Docker 内部行为不同的原因,以及如何允许充分利用所有可用的交换空间 当进程在 Docker 容器内运行时。