BerkeleyDB写出性能问题

Ale*_*dan 8 java performance berkeley-db key-value

我需要一个基于磁盘的键值存储,它可以维持大数据集的高写入和读取性能.我知道,订单很高.

我正在尝试使用Java的C BerkeleyDB(5.1.25)库,我看到了严重的性能问题.

我在短时间内得到了稳定的14K docs/s,但是当我达到几十万个文档时,性能会像摇滚一样下降,然后它会恢复一段时间,然后再次下降,等等.这种情况越来越频繁,直到大多数时间我无法获得超过60个docs/s,在1000万个docs之后有一些12K docs/s的孤立峰值.我的db类型选择是HASH,但我也试过BTREE,它是一样的.

我尝试使用10 db的池并在其中散列文档以消除性能下降; 这使写入吞吐量增加到50K docs/s,但对性能下降没有帮助:所有10 db都同时减慢了爬行速度.

我假设文件正在重新组织,我试图找到一个配置参数来影响何时进行这种重组,因此每个池化的db会在不同的时间重新组织,但我找不到任何有用的东西.我尝试了不同的缓存大小,使用setHashNumElements配置选项保留空间,因此不会花时间增长文件,但每次调整都会使情况变得更糟.

我准备给berkeleydb并尝试更复杂的解决方案,比如cassandra,但是我想确保在写完之前我没有在berkeleydb做错事.

这里有没有经验可以通过berkeleydb实现持续写入性能的人?

编辑1:

我已经尝试了几件事:

  1. 将写入速率降低到500/s(低于我在15个小时写入3000万个文档后得到的平均值,这表明硬件能够写入550个文档/秒).没有用:一旦编写了一定数量的文档,性能就会下降.
  2. 将传入的项目写入队列.这有两个问题:A)它破坏了释放r​​am的目的.B)队列最终会阻塞,因为BerkeleyDB冻结的时间越长越频繁.

换句话说,即使我限制输入数据保持低于硬件功能并使用ram来保存项目,而BerkeleyDB需要一些时间来适应增长,因为这个时间越来越长,性能接近0.

这让我感到惊讶,因为我已经看到声称可以处理数TB的数据,但我的测试显示不然.我仍然希望我做错了什么......

编辑2:

在给出了一些更多的想法和Peter的输入之后,我现在明白随着文件变大,一批写入将分散得更远,并且它们落入同一磁盘柱的可能性下降,直到它最终达到搜索/磁盘的第二个限制.

但是BerkeleyDB的定期文件重组比这更早地杀死了性能,并且以更糟糕的方式:它只是停止响应更长和更长的时间,同时它会改变周围的东西.使用速度更快的磁盘或在不同磁盘之间传播数据库文件无济于事.我需要找到解决这些吞吐量漏洞的方法.

Pet*_*rey 2

我所看到的高磁盘写入率是系统缓存将被填满(到那时为止提供闪电性能),但是一旦它填满应用程序,甚至整个系统也会急剧减慢,甚至停止。

您的底层物理磁盘应至少维持每秒 100 次写入。除此之外,更多的是由更清晰的缓存支持的幻想。;) 但是,当缓存系统耗尽时,您会看到非常糟糕的行为。

我建议您考虑磁盘控制器缓存。其电池备份内存需要与您的数据大小相当。

另一种选择是,如果更新是突发性的,则使用 SSD 驱动器(它们每秒可以执行 10K+ 写入,因为它们没有移动部件)并带有缓存,这应该会为您提供超出您需要的容量,但 SSD 的写入次数有限。