如何在Docker容器中限制ArangoDB内存使用?

3
我们使用ArangoDB 3.3.14(社区版)和MMFiles存储引擎处理相对较大的数据集(备份时略大于30 GB)。我们在ECS中使用docker容器运行它。我们的主机VM有64 GB的RAM,我们专门为ArangoDB容器分配了55 GB的RAM(我们为该容器设置了硬限制为55 GB)。
当ArangoDB刚启动并将所有集合加载到RAM中时,大约需要45 GB,因此我们还有大约10 GB的空闲RAM可用于查询等操作。
问题在于,经过一段时间后(根据使用情况而定),ArangoDB会吃掉所有的55 GB RAM,并且不会停止。它继续消耗超出设置的硬限制的RAM,在某个点上,docker会以退出码137杀死容器,状态原因为OutOfMemoryError:Container killed due to memory usage。
重新启动会给我们带来很多问题,因为我们需要等待所有集合和图形再次加载到RAM中。对于我们的数据集,这需要大约1-1.5小时,而在“重新启动”期间无法使用ArangoDB。
我的问题是如何限制ArangoDB的RAM使用量,比如说限制为54 GB,这样它就永远不会达到docker容器设置的硬内存限制?

你尝试过 --javascript.gc-frequency frequency 吗?这可能会减少费用,如果没有答案提供。或者阅读 https://dev59.com/4GAf5IYBdhLWcg3wsUXT - Gilles-Antoine Nys
是的,我看到了那个话题,但它并没有回答我的问题,即我们如何限制ArangoDB的总RAM使用量,以便它永远不会使用比我们允许的更多的RAM。我还没有尝试过改变gc-frequency,但我猜它也不能解决问题,因为它实际上并没有限制RAM消耗。是的,它可能会帮助ArangoDB存活更长时间,但不会解决真正的问题。无论如何,感谢您的建议,我们会尝试一下。 - Peter Liapin
2个回答

2
在3.3.20版本中,ArangoDB引入了一个名为{{total-write-buffer-size}}的参数,用于限制写缓冲区。你可以尝试将其添加到配置文件中:

Original Answer

翻译成:"最初的回答"
[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版本。"最初的回答"

你好,Luigi,抱歉,我必须澄清一下,我们仍然使用MMFiles文件存储引擎(而不是RocksDB)。你是否有类似的MMFiles引擎设置?我知道RocksDB是一种新的默认方式,并且被推荐使用等等,但我们使用新的RocksDB测试了我们相对较大的数据集,并发现大多数AQL查询(遍历)的性能急剧下降。一些以前使用MMFiles需要约10秒钟的查询现在使用新的RocksDB引擎永远无法完成,我必须在一段时间后终止它们。因此,RocksDB目前对我们来说并不是一个好选择。 - Peter Liapin
你好Peter,是的,那些特定的参数是针对RocksDB的(除了--cache.size)。也许在你的情况下更好的选择是转向ROcksDB,它有几个优点: *文档级别锁 *支持大数据集 *持久化索引 而且你也可以限制内存消耗(从Linux 3.3.20开始)。使用MMFILES时,集合和索引都必须适合内存。 - Luigi Servini
是的,您无法限制,因为所有数据结构都必须适合内存(包括集合+索引)。 - Luigi Servini
两个集合和索引都可以很好地适应RAM。请参见我在您上一个答案中的评论。让我们在那里继续我们的对话。 - Peter Liapin

0

是的,没错,那些特定的参数是针对 RocksDB 的(除了 --cache.size)。也许在你的情况下更好的选择是转向 ROcksDB,它有几个优点:

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

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


抱歉,这并没有回答我的问题。请注意,我们所有的集合都很好地适合于 RAM 中。我们的容器有 55 GB 的 RAM,而所有的集合和图形只占用了约 45 GB。我的问题与集合不适合于 RAM 没有关系,而是与 ArangoDB 为其内部需求(运行 AQL 查询、更新等)所占用的额外 RAM 有关。我的问题是如何限制 ArangoDB 为其他需求(而不是真实数据)所消耗的额外内存? - Peter Liapin
另外,请注意,由于我们的AQL查询性能会因RocksDB而急剧下降,因此RocksDB似乎不是我们的好选择。我将在StackOverflow上添加一个关于这个问题的单独讨论。那么,这是否意味着使用MMFiles引擎时我们没有限制RAM使用的选项? - Peter Liapin
嗨Peter,45GB是转储大小吗?如果是的话,你还需要考虑索引,在启动时会在内存中构建。您还可以尝试限制--cache.size(默认情况下约为RAM的25%)。此高速缓存用于某些点查找操作,例如按其_id值获取边缘时。 - Luigi Servini
嗨,Luigi,45GB是ArangoDB加载所有索引后消耗的RAM量。在我上面的原始问题中,我提到该数据库的备份略大于30GB。我明白数据库的大小并不等同于它实际需要的RAM数量,因为有索引存在。 - Peter Liapin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接