减少 ArangoDB 中的内存消耗的方法

3
我们目前在ArangoDB集群上运行版本3.0.10,用于POC,磁盘上存储了约81GB的数据,主内存消耗分布在5个主数据库服务器上,大约为98GB。有约2亿个顶点和3.5亿条边。有3个边集合和3个文档集合,大部分内存(80%)由于存在边而被消耗。
我正在探索减少主内存消耗的方法。我想知道是否有任何压缩/序列化数据的方法,以便利用更少的主内存。
减少内存的原因是为了降低基础设施成本,对于我的使用情况,我愿意在速度上做出折衷。
请问是否有任何减少ArangoDB主内存消耗的方法?

你为什么要尝试减少内存使用?是为了速度吗?还是资源有限?你拥有什么类型的数据?你需要查询数据的最大部分吗?你正在使用什么样的数据结构? - Nate Gardner
@Nate:感谢您的评论,我已经更新了问题的信息并且更加详细了。 - pjesudhas
你在边缘设备上存储了多少数据?这些数据中有重复的吗? - Nate Gardner
1个回答

1
我们花了一些时间才发现,我们最初的建议是将 vm.overcommit_memory 设置为 2,这在所有情况下都不是好的选择。
看起来,在某些环境中,ArangoDB 中捆绑的 jemalloc 内存分配器存在问题。
vm.overcommit_memory 内核设置值为 2 时,分配器会出现一个问题,即分割现有内存映射,这使得 arangod 进程的内存映射数量随着时间的推移而增加。即使物理内存仍然可用,这可能导致内核拒绝向 arangod 进程提供更多内存。内核每个进程只会授予最多 vm.max_map_count 个内存映射,许多 Linux 环境的默认值为 65530。
回复内容存在敏感词^**$时,我们仍然观察到虚拟内存消耗不断增加,但实际上这不应该引起问题。 因此,将vm.overcommit_memory的值从2调整为01(顺便说一下,0是Linux内核的默认值),这应该会改善情况。
另一种解决问题的方法是编译不包含jemalloc的ArangoDB版本(使用cmake时加上-DUSE_JEMALLOC=Off)。需要从源代码编译。我在这里只是列出这个作为备选方案。使用系统的libc分配器,您应该看到相当稳定的内存使用情况。我们还尝试了另一个分配器,即来自libmusl的分配器,它也在随时间变化时显示出相当稳定的内存使用情况。使交换分配器成为一个非常重要的问题的主要原因是,除此之外,jemalloc具有非常好的性能特征。

(引用Jan Steemann在github上的话)

与此同时,rocksdb存储引擎进行了几项新的增强。我们演示了rocksdb中的内存管理如何工作

许多rocksdb存储引擎选项都通过选项暴露给外部

讨论和用户研究导致了在ArangoDB 3.7中暴露了两个更多的配置选项

  • --rocksdb.cache-index-and-filter-blocks-with-high-priority
  • --rocksdb.pin-l0-filter-and-index-blocks-in-cache
  • --rocksdb.pin-top-level-index-and-filter

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