优化 Berkeley DB 中的 Put 性能

Posted

技术标签:

【中文标题】优化 Berkeley DB 中的 Put 性能【英文标题】:Optimizing Put Performance in Berkeley DB 【发布时间】:2010-09-29 19:13:29 【问题描述】:

几天前我刚开始使用 Berkeley DB,所以我想看看在尽可能快地存储数据方面是否有我遗漏的东西。

以下是有关数据的一些信息: - 它有 512 字节的块 - 块按顺序排列 - 块将按 FIFO 顺序删除 - 如果我因为电源故障而丢失了一些数据,只要整个数据库没有损坏就可以了

在阅读了一堆文档之后,似乎 Queue db 正是我想要的。

但是,在尝试了一些测试代码之后,我最快的结果是大约每秒 1MByte,只是循环通过一个 DB->put 并设置了 DB_APPEND。我也尝试过使用交易和大宗看跌期权,但这两种方式都大大减慢了速度,所以我没有很长时间追求它们。我正在插入在飞思卡尔 i.MX35 开发板上的 NANDFlash 芯片上创建的新数据库。

由于我们希望获得至少每秒 2MBytes 的写入速度,我想知道是否有什么东西可以提高我的速度,因为我知道我的硬件可以写得比这更快。

【问题讨论】:

【参考方案1】:

尝试将其放入您的 DB_CONFIG:

set_flags DB_TXN_WRITE_NOSYNC
set_flags DB_TXN_NOSYNC

根据我的经验,这些可以大大提高写入性能。


DB_TXN_NOSYNC 如果设置,Berkeley DB 将不会在事务提交或准备时写入或同步刷新日志。这意味着事务表现出 ACI(原子性、一致性和隔离性)属性,而不是 D(持久性);也就是说,将保持数据库的完整性,但如果应用程序或系统出现故障,则有可能在恢复期间撤消一些最近提交的事务。有风险的事务数取决于日志缓冲区可以容纳多少日志更新、操作系统将脏缓冲区刷新到磁盘的频率以及日志检查点的频率 使用 DB_TXN_NOSYNC 标志调用 DB_EN​​V->set_flags 只会影响指定的 DB_EN​​V 句柄(以及在该句柄范围内打开的任何其他 Berkeley DB 句柄)。为了在整个环境中保持一致的行为,在环境中打开的所有 DB_EN​​V 句柄都必须设置 DB_TXN_NOSYNC 标志,或者应该在 DB_CONFIG 配置文件中指定该标志。

DB_TXN_NOSYNC 标志可用于在应用程序生命周期内的任何时间配置 Berkeley DB。


DB_TXN_WRITE_NOSYNC 如果设置,Berkeley DB 将写入事务提交或准备时的日志,但不会同步刷新。这意味着事务表现出 ACI(原子性、一致性和隔离性)属性,而不是 D(持久性);也就是说,将保持数据库的完整性,但如果系统出现故障,则有可能在恢复期间撤消一些最近提交的事务。有风险的事务数量取决于系统将脏缓冲区刷新到磁盘的频率以及日志检查点的频率。 使用 DB_TXN_WRITE_NOSYNC 标志调用 DB_EN​​V->set_flags 只会影响指定的 DB_EN​​V 句柄(以及在该句柄范围内打开的任何其他 Berkeley DB 句柄)。为了在整个环境中保持一致的行为,在环境中打开的所有 DB_EN​​V 句柄都必须设置 DB_TXN_WRITE_NOSYNC 标志,或者应该在 DB_CONFIG 配置文件中指定该标志。

DB_TXN_WRITE_NOSYNC 标志可用于在应用程序生命周期内的任何时间配置 Berkeley DB。

更多详情请见http://www.mathematik.uni-ulm.de/help/BerkeleyDB/api_c/env_set_flags.html

【讨论】:

感谢您的评论。但是,我发现与不使用环境相比,简单地启用环境会导致性能下降太多。我认为这与 WAL 有关,因此这些标志会对我有所帮助,但即使没有环境,一切都太慢了。 @jjfine:我相信如果你不明确地使用匿名(自动提交)事务隐式使用环境。所以不使用环境将无济于事。 @VladLazarenko,所以如果我设置这两个标志之一,当我关闭 berkeley db 时,缓存会刷新回磁盘吗? @Alcott:是的。也许不是马上,但是是的。【参考方案2】:

我建议您必须使用事务/TDS 数据存储,如果您提到如果数据库损坏无法重新创建数据库(即它不仅仅是本地缓存)。如果您不关心在发生崩溃/断电时丢失一些项目,那么 DB_TXN_WRITE_NOSYNC 将提高 TDS 性能,您的数据库仍然是完整的和可恢复的。 如果您使用 BTREE 和数字索引(如果您没有自然键)存储并注意字节序问题,以便获得良好的键位置和高页面利用率,那么您应该能够每秒获得超过 2000 次插入,尤其是SSD,尤其是在您使用 DbMultileKeyDataBuilder 进行批量插入时。

【讨论】:

以上是关于优化 Berkeley DB 中的 Put 性能的主要内容,如果未能解决你的问题,请参考以下文章

Berkeley DB:如何从 QUEUE 获取特定的 KEY

berkeley db 保存到磁盘

Berkeley DB为啥又叫做db4

部署高性能 Berkeley DB 系统的最佳实践

Java Berkeley DB 读取性能与 100M 文档

清理 Berkeley DB 日志文件