BerkeleyDB并发

Ted Dziuba 26 c++ berkeley-db

  • BerkeleyDB的C++实现可以合理地支持什么是最佳并发级别?
  • 在吞吐量因资源争用而开始遭受损失之前,我可以在数据库中攻击多少线程?

我已阅读手册并知道如何设置锁,锁柜,数据库页面大小等数量,但我只是喜欢有BDB并发实际经验的人的一些建议.

我的应用程序非常简单,我将进行获取和放置大约1KB的记录.没有游标,没有删除.

Daan.. 12

这取决于您正在构建的应用程序类型.创建一个有代表性的测试场景,并开始锤击.然后你会知道明确的答案.

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

说真的,只测试你自己的场景.

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


yoav.aviram.. 7

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

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

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

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

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

  4. 读数比.写.

  5. 如何扩展您的访问权限(请记住BTREE具有页面级别锁定 - 因此访问具有不同线程的不同页面是一个很大的优势).

  6. 访问模式 - 意味着线程彼此锁定甚至死锁的可能性,以及您的死锁解决策略(这可能是一个杀手).

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

这相当于以下几点:基于DBD扩展解决方案以便提供更高的并发性有两个关键方法; 要么最小化设计中的锁数,要么添加更多硬件.


svrist.. 6

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

我会做一个简单的测试,然后用越来越多的线程锤击它并看看最好的东西.