【问题标题】:Berkeley DB Java Edition - tuning for large amount of dataBerkeley DB Java 版 - 调整大量数据
【发布时间】:2014-09-17 15:16:06
【问题描述】:
我需要将超过 10 亿个密钥加载到 Berkley DB 中,因此我想提前对其进行调整以获得更好的性能。使用标准配置,我现在需要大约 15 分钟来加载 1'000'000 个键,这太慢了。
是否有适当的方法来调整例如 Berkley DB 的 B+Tree(节点大小等...)?
(作为对比,调优tokyo cabinet后,25分钟加载10亿个key)。
附:
我正在寻找将调优技巧作为代码而不是为正在运行的系统设置的参数(如 jvm 大小等...)
【问题讨论】:
标签:
performance
berkeley-db-je
【解决方案1】:
我很好奇,当 TokyoCabinet 在 25 分钟内加载 1B 键时,存储的键/值的大小是多少?您使用的 I/O 系统和存储系统是什么?您是否使用术语“负载”来表示对永久稳定存储的 1B 事务提交?那将是每秒约 666,666 次插入,考虑到我所知道的任何 I/O 系统,这在物理上是不可能的。将这个数字乘以键和值的大小,现在你已经无可救药地超出了物理极限。
请查看Gustavo Duarte 的博客,阅读一些有关 I/O 系统以及硬件如何工作的信息,然后查看您的声明。我非常有兴趣找出 TokyoCabinet 到底在做什么和没有做什么。如果我不得不猜测,我会说它要么提交到操作系统中的文件系统缓存,但没有将这些缓冲区刷新(fdsync()-ing)到磁盘。
完全披露:我是 Oracle Berkeley DB(TokyoCabinet 的直接竞争对手)的 Oracle 产品经理,我已经使用这些数据库和最好的硬件大约十年了,所以我两者都是有偏见和怀疑。
Berkeley DB 具有您可以在事务句柄上设置的标志,这些标志模仿了这一点和其他 similar methods 以牺牲耐久性(ACID 中的“D”)换取速度。
至于如何让 Berkeley DB Java 版 (BDB-JE) 更快,您可以尝试以下方法:
- 延迟写入:这会延迟写入
只要到事务日志
可能的(当缓冲区已满时,它
刷新数据)
- 提前对密钥进行排序:大多数
B-Trees(包括我们的)做很多事情
更好的按顺序插入
快速加载时间-
- 增加日志的大小
文件从默认的 10MiB 到
更大的东西,比如 100MiB,这个
降低 I/O 成本-
明确关于数据库性能的声明非常重要。它们看起来很简单,但要正确处理它们非常棘手,这样它们就不会损坏数据或丢失已提交的事务。
希望对你有所帮助。
【解决方案2】:
如果将 BDB-JE 上的批量插入分组到单个事务中,它们的速度会快一个数量级。原因是每次提交都会导致(默认情况下)同步写入磁盘,而事务在提交时同步。在我的应用程序中,将 100,000 个小键写入单个提交需要一分钟多的时间,而在事务中只需要几秒钟。