docker - 如何限制 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 容器设置的硬内存限制?
解决方案
在 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。
推荐阅读
- azure-data-explorer - Kusto 摄取错误“BadRequest_EmptyArchive:空 zip 存档”
- python - Azure 函数应用程序:[Errno 30] 只读文件系统
- c# - Azure EventGrid(已创建 Blob)函数输出流
- node.js - 当 db 是自定义类属性时,如何 spy/stub/mock firestore db.collection().add(),即如何存根 this.db.collection().add()?
- java - Spring:如何在 @RestController 中返回 base64 图像
- haskell - 如何在 ARM64 上安装堆栈?
- typescript - 苗条 3 打字稿:意外的标记(解析错误)
- sql - '{"queue":[],"recieved":[],"accepted":[]}' 不是有效的查询
- python - 根据列值及其前 2 行选择一行
- c++ - std::stoul 但带有 string_view