c++ -BerkeleyDB并发

Translate
  • BerkeleyDB的C ++实现可以合理支持的最佳并发级别是多少?
  • 在由于资源争用而导致吞吐量开始下降之前,我可以在数据库上投入多少线程?

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

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

This question and all comments follow the "Attribution Required."

所有的回答

Translate

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

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

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

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

来源
Translate

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

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

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

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

  3. 工作集是否适合缓存?

  4. 读取次数与写。

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

  6. 访问模式-表示线程相互锁定的可能性有多大,甚至发生死锁,您的死锁解决策略是什么(此策略可能是致命的)。

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

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

来源
Translate

这不取决于硬件以及线程和对象的数量吗?

我将做一个简单的测试,然后通过不断增加的线程锤击次数来运行它,然后看看哪种方法最好。

来源
Translate

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

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

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


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

来源
Translate

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

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

来源
上一个问题:
c -消息框的GTK实现