我希望使用 Berkeley DB 创建一个简单的键值存储系统。密钥将是 SHA-1 哈希,因此它们位于 160 位地址空间中。我有一个简单的服务器工作,这很容易,这要归功于 Berkeley DB 网站上写得很好的文档。但是,我对如何最好地建立这样一个系统,以获得良好的性能和灵活性有一些疑问。希望有人对 Berkeley DB 有更多经验并且可以帮助我。
最简单的设置是一个进程,一个线程,处理一个数据库;使用事务在这个数据库上执行插入和获取。
方案一:单进程、多线程、单DB;进程中的所有线程都在此数据库上执行插入和获取。
- 使用多线程是否提供了很大的性能改进?有一个单独的数据库,因此它在一个磁盘上,因此我猜我不会得到太多的提升。但是,如果 Berkeley DB 在内存中缓存了很多东西,那么也许一个线程能够运行并从缓存中响应,而另一个线程阻塞等待磁盘?我正在使用 GNU Pth,用户级协作线程。我不熟悉 Pth 的细节,所以我也不确定使用 Pth 是否可以在另一个用户级线程被阻塞时运行一个用户级线程。
备选方案 2:单个进程、一个或多个线程、多个 DB,其中每个 DB 覆盖键的 160 位地址空间的一小部分。
- 我看到拥有多个数据库的一些优点:我们可以将它们放在不同的磁盘上,减少争用,如果我们想这样做的话,更容易将数据库移动/分区到不同的物理主机上。有没有人有这种设置的经验并看到显着的好处?
备选方案 3:多个进程,每个进程都有一个线程,每个进程处理一个数据库,该数据库覆盖了 160 位密钥地址空间的一小部分。
- 这具有使用多个 DB 的优点,但我们使用的是多个进程。这比第二种选择更好吗?我怀疑使用进程而不是用户级线程来获得并行性会让你获得更好的 SMP 缓存行为(更少的无效等),但是我会被所有进程开销和上下文切换杀死吗?
我很想知道是否有人尝试了这些选项,并看到了积极或消极的结果。
谢谢。