如何允许 Docker 容器内运行的进程充分使用所有可用交换空间

问题描述 投票:0回答:1

我编写了一个测试 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();
node.js docker ubuntu memory
1个回答
0
投票

您需要检查您的所有假设。您能确定该进程是在物理内存限制下被终止的吗?该进程是否可能因其他原因而终止?该进程在 Docker 内运行的方式与仅使用按预期运行的 Node 的示例之间是否存在任何差异。

使用主机的所有资源是 Docker 的默认行为,因此问题的原因似乎在其他地方。

© www.soinside.com 2019 - 2024. All rights reserved.