我编写了一个测试 Node 应用程序,它会消耗内存(以 100MB 为单位)。我试图通过使用在其运行的 Ubuntu (Ubuntu 20.04.4 LTS) 盒子上配置的交换空间 (16GB) 来继续分配超出 8GB 物理内存限制的内存。
在 Node 中运行时工作正常,如下所示(无容器):
node --max-old-space-size=16384 ./memtest/memtest.js
当我在 Docker 容器内运行它时,它会在物理内存 (8GB) 限制时被终止。事实上,它似乎在此之前就被杀死了,大约是3gb。即使有 5GB 空闲,它也会在 3GB 时被杀死。
我尝试了一些 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 容器内运行时。
注意我没有使用 Docker Desktop,这个问题与 Docker Desktop 无关。
更新:
这是我用来测试的JS代码:
const bufs = [];
function testMemory() {
setInterval(() => {
console.log(`${(process.memoryUsage().heapUsed / (1024 * 1024)).toFixed(2)} MB`);//
bufs.push(new Array(1e7));
}, 100);
}
testMemory();
您需要检查您的所有假设。您能确定该进程是在物理内存限制下被终止的吗?该进程是否可能因其他原因而终止?该进程在 Docker 内运行的方式与仅使用按预期运行的 Node 的示例之间是否存在任何差异。
使用主机的所有资源是 Docker 的默认行为,因此问题的原因似乎在其他地方。