我需要一个基于磁盘的键值存储,它可以维持大数据集的高写入和读取性能.我知道,订单很高.
我正在尝试使用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:
我已经尝试了几件事:
换句话说,即使我限制输入数据保持低于硬件功能并使用ram来保存项目,而BerkeleyDB需要一些时间来适应增长,因为这个时间越来越长,性能接近0.
这让我感到惊讶,因为我已经看到声称可以处理数TB的数据,但我的测试显示不然.我仍然希望我做错了什么......
编辑2:
在给出了一些更多的想法和Peter的输入之后,我现在明白随着文件变大,一批写入将分散得更远,并且它们落入同一磁盘柱的可能性下降,直到它最终达到搜索/磁盘的第二个限制.
但是BerkeleyDB的定期文件重组比这更早地杀死了性能,并且以更糟糕的方式:它只是停止响应更长和更长的时间,同时它会改变周围的东西.使用速度更快的磁盘或在不同磁盘之间传播数据库文件无济于事.我需要找到解决这些吞吐量漏洞的方法.
我即将使用Google的网站优化工具在我网站的主页上进行a/b测试.我的问题是:google的蜘蛛索引中有哪些替代页面?他们都是?我在谷歌或GWO页面上找不到任何关于此的信息.