小编Ale*_*dan的帖子

BerkeleyDB写出性能问题

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

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

java performance berkeley-db key-value

8
推荐指数
1
解决办法
3146
查看次数

当您进行网站优化工具实验时,Google如何为我们的网站编制索引?

我即将使用Google的网站优化工具在我网站的主页上进行a/b测试.我的问题是:google的蜘蛛索引中有哪些替代页面?他们都是?我在谷歌或GWO页面上找不到任何关于此的信息.

google-website-optimizer ab-testing

4
推荐指数
1
解决办法
279
查看次数