使用 LMDB 在内存数据库中

In memory databases with LMDB

我有一个项目使用 BerkelyDB 作为键值存储,存储多达数亿条小记录。

它的使用方式是将所有值插入到数据库中,然后使用顺序访问和随机访问对它们进行迭代,全部来自单个线程。

使用 BerkeleyDB,我可以创建 in-memory databases "never intended to be preserved on disk"。如果数据库小到可以放入 BerkeleyDB 缓存,它永远不会被写入磁盘。如果它比缓存大,那么将创建一个临时文件来保存溢出。此选项可以显着加快速度,因为它可以防止我的应用程序在关闭数据库时将数 GB 的无效数据写入磁盘。

我发现 BerkeleyDB 的写入性能太差,即使在 SSD 上也是如此,所以我想切换到 LMDB. However, based on the documentation, 似乎没有创建非持久数据库的选项.

如果我根本不关心持久性或并发访问,我应该使用哪些 configuration/combination 选项来获得 LMDB 的最佳性能?即让它像 "in-memory database" 一样使用临时后备磁盘存储?

只需使用 MDB_NOSYNC,永远不要自己调用 mdb_env_sync()。此外,您还可以使用 MDB_WRITEMAP。 OS 最终仍会将脏页刷新到磁盘;你可以玩 /proc/sys/vm/dirty_ratio 等来控制这种行为。

来自这个post:https://lonesysadmin.net/2013/12/22/better-linux-disk-caching-performance-vm-dirty_ratio/

vm.dirty_ratio 是在必须将所有内容提交到磁盘之前可以用脏页填充的绝对最大系统内存量。当系统到达这一点时,所有新的 I/O 直到脏页被写入磁盘。

如果脏率太小,就会看到频繁的同步磁盘写入。