如何限制 docker 容器内的 ArangoDB RAM 使用?

How to limit ArangoDB RAM usage inside of a docker container?

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

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

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

重启给我们带来了很多问题,因为我们需要等到所有的集合和图表再次加载回内存。我们的数据集大约需要 1-1.5 小时,并且在 "restarting".

期间您不能使用 ArangoDB

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

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

[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.

是的,对,那些特定的参数是针对 RocksDB 的(除了 --cache.size)。可能在你的情况下最好转移到 ROcksDB,它有几个优点:

  • 文档级锁
  • 支持大型数据集
  • 持久索引

您还可以限制内存消耗(从 3.3.20 开始 Linux)。使用 MMFILES,集合和索引都必须适合内存。