BerkeleyDB并发

时间:2020-03-05 18:37:19  来源:igfitidea点击:

BerkeleyDB的C ++实现可以合理支持的最佳并发级别是多少?在由于资源争用而导致吞吐量开始下降之前,我可以在数据库上锤击多少个线程? Oracle Berkeley DB:性能指标和基准性能指标和基准:Berkeley DB

我已经阅读了该手册,并且知道如何设置锁的数量,储物柜,数据库页面大小等。但是,我只想从具有BDB并发实际经验的人那里获得一些建议。

我的应用程序非常简单,我将获取大约1KB的记录。没有游标,没有删除。

解决方案:

这不取决于硬件以及线程和填充物的数量吗?

我将做一个简单的测试,然后在不断增加的线程锤击中运行它,然后看一下似乎是最好的。

这取决于我们要构建哪种类型的应用程序。创建一个具有代表性的测试方案,然后开始进行测试。然后,我们将知道确定的答案。

除了用例,它还取决于CPU,内存,前端总线,操作系统,缓存设置等。

认真地,只是测试我们自己的方案。

如果我们需要一些数字(实际上在情况下可能没有任何意义):

{分块}

在处理性能未知的数据库时,我所做的就是测量查询的周转时间。我一直在增加线程数,直到减少周转时间,然后再降低线程数,直到周转时间得到改善(嗯,这是我环境中的进程,但无论如何)。

涉及移动平均线和各种指标,但收获的教训是:仅适应当前的工作方式。我们永远不会知道什么时候DBA会提高性能或者升级硬件,或者在运行时可能会出现另一个过程来加载系统负载。所以要适应。

哦,还有另一件事:如果可以批量处理,请避免进行过程切换。

哦,我应该说清楚:这一切都是在运行时发生的,而不是在开发期间发生的。

以我的理解方式,Samba创建了tdb以允许任何特定数据库文件使用"多个并发写入器"。因此,如果工作负载有多个编写器,性能可能会很差(例如,Samba项目选择编写自己的系统,显然是因为在这种情况下,它对Berkeley DB的性能不满意)。

另一方面,如果工作负载有很多读者,那么问题是操作系统如何处理多个读者。

我完全同意Daan的观点:创建一个测试程序,并确保它访问数据的方式尽可能接近我们期望应用程序所具有的模式。这对于BDB极为重要,因为不同的访问模式会产生非常不同的吞吐量。

除此之外,这些是我发现对吞吐量有重大影响的一般因素:

访问方法(在情况下,我猜是BTREE)。

配置DBD的持久性级别(例如,在我的情况下," DB_TXN_WRITE_NOSYNC"环境标志将写入性能提高了一个数量级,但它损害了持久性)

工作集是否适合缓存?

读取次数与写。

访问的分散程度(请记住BTREE具有页面级锁定,因此使用不同的线程访问不同的页面是一个很大的优势)。

访问模式意味着线程互相锁定的可能性有多大,甚至发生死锁,死锁解决策略是什么(这可能是一个杀手)。

硬件(用于缓存的磁盘和内存)。

这相当于以下几点:
扩展基于DBD的## 解决方案以提供更大的并发性有两种主要的实现方式:或者最小化设计中的锁数量,或者添加更多硬件。