首页 > 解决方案 > 如何限制 docker 容器内的 ArangoDB RAM 使用?

问题描述

我们使用 ArangoDB 3.3.14(社区版)和 MMFiles 存储引擎来存储相对较大的数据集(备份时略超过 30 GB)。我们使用 ECS 在 docker 容器内运行它。我们的主机 VM 有 64 GB 的 RAM,我们专门为 ArangoDB 容器专门设置了 55 GB(我们将该容器的硬限制设置为 55 GB)。

当 ArangoDB 刚刚启动并将所有集合加载到 RAM 中时,大约需要 45 GB,因此我们有大约 10 GB 的空闲 RAM 可用于查询等。

问题是一段时间后(取决于使用情况)ArangoDB 会吃掉所有 55 GB 的 RAM 并且不会停在那里。它继续消耗超过设置的硬限制的 RAM,并且在某些时候,docker 以退出代码 137 和状态原因杀死容器 OutOfMemoryError: Container 由于内存使用而被杀死。

重新启动给我们带来了很多问题,因为我们需要等到所有集合和图表再次加载回 RAM 中。我们的数据集大约需要 1-1.5 小时,并且在“重新启动”时您不能使用 ArangoDB。

我的问题是如何限制 ArangoDB RAM 的使用,比如说 54 GB,所以它永远不会达到为 docker 容器设置的硬内存限制?

标签: dockerramarangodbstability

解决方案


在 3.3.20 中,ArangoDB 引入了限制写入缓冲区的参数 {{total-write-buffer-size}}。您可以尝试将其添加到您的配置文件中:

[rocksdb]
block-cache-size = <value in bytes>  # 30% RAM
total-write-buffer-size = <value in bytes>  # 30% RAM
enforce-block-cache-size-limit = true

[cache]
size = <value in bytes>  # 20% RAM

或者您可以将参数传递给命令行:

arangod --cache.size <value in bytes>  # 20% RAM \
    --rocksdb.block-cache-size <value in bytes>  # 30% RAM \
    --rocksdb.total-write-buffer-size <value in bytes>  # 30% RAM \
    --rocksdb.enforce-block-cache-size-limit true 

您还可以根据您的使用情况调整每个组件分配多少内存。但是你必须至少升级到 3.3.20。


推荐阅读