- 在C++实现的BerkeleyDB中,最优并发级别是多少?
- 在资源争用的情况下,我可以有多少个线程同时访问数据库而不影响吞吐量?
我已经阅读了手册,并知道如何设置锁、锁定器、数据库页面大小等,但我想听听有实际BDB并发经验的人的建议。
我的应用程序非常简单,我将对每个约1KB的记录进行获取和放置。没有游标,也没有删除操作。
我已经阅读了手册,并知道如何设置锁、锁定器、数据库页面大小等,但我想听听有实际BDB并发经验的人的建议。
我的应用程序非常简单,我将对每个约1KB的记录进行获取和放置。没有游标,也没有删除操作。
这取决于您正在构建的应用程序类型。创建一个具有代表性的测试场景,并开始进行测试。然后你就会得到确切的答案。
除了您的用例外,它还取决于CPU、内存、前端总线、操作系统、缓存设置等因素。
说真的,只需测试您自己的场景即可。
如果您需要一些数字(实际上在您的场景中可能毫无意义):
访问方法(在你的情况下,我猜想是BTREE)。
你配置DBD时的持久性水平(例如,在我的情况下,“DB_TXN_WRITE_NOSYNC”环境标志将写入性能提高了一个数量级,但它会损害持久性)
工作集是否适合缓存?
读取次数与写入次数的数量。
你的访问有多分散(请记住,BTREE具有页面级锁定-因此使用不同线程访问不同页面是很大的优势)。
访问模式-意味着线程彼此锁定的可能性有多大,甚至会死锁,以及你的死锁解决策略是什么(这可能是致命的)。
硬件(磁盘和用于缓存的内存)。
这不仅取决于硬件,还取决于线程数量等因素吗?
我建议进行简单的测试,并逐步增加线程数进行压力测试,以确定最佳方案。
据我理解,Samba创建了tdb,允许任何特定数据库文件有“多个并发写入者”。因此,如果您的工作负载有多个写入者,则您的性能可能很差(也就是说,Samba项目选择编写自己的系统,显然是因为它对Berkeley DB在这种情况下的性能不满意)。
另一方面,如果您的工作负载有大量读取器,则问题在于您的操作系统如何处理多个读取器。