伯克利DB Java版 - 大数据量的调整

3
我需要将10亿个键加载到Berkley DB中,因此我想提前调整以获得更好的性能。使用标准配置,现在需要大约15分钟才能加载100万个键,这太慢了。 是否有适当的方法来调整Berkley DB的B+树(节点大小等)? (作为比较,经过调整的东京柜子在25分钟内加载了10亿个键。) 附言: 我正在寻找代码调优提示,而不是运行系统时设置的参数(如jvm大小等)。
2个回答

7
我很好奇,当TokyoCabinet在25分钟内加载10亿个键时,存储的键/值大小是多少?你使用的I/O系统和存储系统是什么?你使用"加载"这个术语来表示1B事务提交到永久稳定存储吗?这将是每秒约666,666个插入,根据我所知道的任何I/O系统,这在物理上都是不可能的。将该数字乘以键和值的大小,现在您已经远远超出了物理限制。
请查看Gustavo Duarte的博客,阅读有关I/O系统以及硬件工作原理的一些内容,然后重新审视您的陈述。我非常想知道TokyoCabinet究竟在做什么以及它没有做什么。如果我必须猜测,我会说它要么是提交到操作系统中的文件系统缓存,但没有刷新(fdsync()-ing)这些缓冲区到磁盘。
完整披露:我是Oracle的产品经理,负责Oracle Berkeley DB(TokyoCabinet的直接竞争对手),我已经玩这些数据库和最好的硬件约十年了,所以我既有偏见又持怀疑态度。

Berkeley DB有一些标记可以在事务句柄上设置,模拟此类以及其他类似的方法来平衡耐久性(ACID中的“D”)和速度。

至于如何使Berkeley DB Java Edition(BDB-JE)更快,您可以尝试以下操作:

  • 延迟写入:这会尽可能地延迟写入到事务日志中(当缓冲区满时,它会刷新数据)
  • 提前对键进行排序:大多数B-Tree(包括我们自己的)对于快速加载时间需要按顺序插入
  • 将日志文件的大小从默认的10MiB增加到较大的值,例如100MiB,这可以降低I/O成本

对于数据库性能的声明非常重要明确。它们看起来很简单,但事实证明,正确处理它们以使其不会损坏数据或丢失提交的事务非常棘手。

希望这能对您有所帮助。


1
在BDB-JE上进行批量插入,如果将它们分组到单个事务中,速度将快上一个数量级。原因是每个单独的提交默认会导致同步写入磁盘,而在提交时事务会被同步。在我的应用程序中,将100,000个小键作为单个提交写入需要超过一分钟的时间,而在事务中只需要几秒钟。

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