gpt4 book ai didi

java - BerkeleyDB 写入性能问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:52:18 30 4
gpt4 key购买 nike

我需要一个基于磁盘的键值存储,以维持大型数据集的高写入和读取性能。我知道,这是一项艰巨的任务。

我正在尝试使用 Java 中的 C BerkeleyDB (5.1.25) 库,但发现了严重的性能问题。

我在短时间内获得稳定的 14K 文档/秒,但是一旦我达到几十万个文档,性能就会像岩石一样下降,然后恢复一段时间,然后再次下降,等等。这种情况发生得越来越多更频繁地,在大多数情况下,在 1000 万个文档之后,我无法获得超过 60 个文档/秒的速度和 12K 文档/秒的几个孤立峰值。我选择的数据库类型是 HASH,但我也尝试了 BTREE,结果是一样的。

我尝试使用 10 db 的池并在其中散列文档以消除性能下降;这将写入吞吐量增加到 50K 文档/秒,但对性能下降没有帮助:所有 10 个数据库同时减慢到爬行。

我假设文件正在重组,我试图找到一个影响重组发生时间的配置参数,因此每个合并的数据库都会在不同的时间重组,但我找不到任何有用的东西.我尝试了不同的缓存大小,使用 setHashNumElements 配置选项保留空间,这样它就不会花时间增加文件,但每一次调整都使情况变得更糟。

我打算放弃 berkeleydb 并尝试更复杂的解决方案,例如 cassandra,但我想确保在注销之前我在 berkeleydb 中没有做错什么。

这里有人有使用 berkeleydb 实现持续写入性能的经验吗?

编辑 1:

我已经尝试了几件事:

  1. 将写入速度降至 500 次/秒(低于我在 15 小时内写入 3000 万份文档后获得的平均值,这表明硬件能够写入 550 份文档/秒)。无效:一旦编写了一定数量的文档,性能就会下降。
  2. 将传入的项目写入队列。这有两个问题:A)它破坏了释放 ram 的目的。 B) 队列最终会阻塞,因为 BerkeleyDB 卡住的时间变得更长更频繁。

换句话说,即使我限制传入数据以保持在硬件能力以下并使用 ram 来保存项目,而 BerkeleyDB 需要一些时间来适应增长,随着这个时间越来越长,性能接近 0。

这让我感到惊讶,因为我看到声称它可以处理数 TB 的数据,但我的测试表明并非如此。我仍然希望我做错了什么......

编辑 2:

经过更多思考和 Peter 的输入,我现在了解到随着文件变大,一批写入将分散得更远,并且它们落入同一个磁盘柱面的可能性下降,直到它最终到达磁盘的寻道/秒限制。

但 BerkeleyDB 的周期性文件重组比这更早地破坏了性能,而且以更糟糕的方式:它只是在越来越长的时间内停止响应,同时它会四处移动。使用更快的磁盘或将数据库文件分散到不同的磁盘上都无济于事。我需要找到解决这些吞吐量漏洞的方法。

最佳答案

我所看到的高磁盘写入率是系统缓存会被填满(在那个点上提供闪电性能)但是一旦它填满了应用程序,即使整个系统也会显着变慢,甚至停止。

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

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

如果更新是突发的,另一种选择是使用 SSD 驱动器(它们每秒可以进行 10K+ 的写入,因为它们没有移动部件)带有缓存,这应该可以提供比您需要的更多的东西,但 SSD 的写入次数有限.

关于java - BerkeleyDB 写入性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5423343/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com