c linux msync(MS_ASYNC)刷新顺序

Linux上msync(MS_ASYNC)的页面刷新顺序是否与写入页面的顺序保持一致?

如果取决于具体情况,有没有办法让我(完整的服务器访问)来确保它们是在同一个订单?

背景

我目前正在使用OpenLDAP的Symas MDB作为一个持久性的键/值存储和没有MDB_MAPASYNC – 这导致使用msync(MS_ASYNC) (我看通过源代码) – 写入是如此缓慢,即使在处理数据单个核心有时候在<1MB / s的时候永远在IO上等待。 经过分析,这个问题似乎是许多小IO OPS。 使用MDB_MAPASYNC我可以很容易地达到我的磁盘的最大速率,但MDB的文档指出,在这种情况下,数据库可能会损坏。 不幸的是,代码对于我来说太复杂了。我目前没有时间一步一步地查看整个代码库,找出原因,同时也不需要MDB提供的许多function(事务,游标,符合ACID),所以我正在考虑使用msync(MS_ASYNC)编写我自己的由mmap支持的KV Store,并确保以不刷新页面的方式写入最后一次触摸的数据损坏数据库或丢失任何其他数据。

但为此,我需要一个我的问题的答案,我完全无法通过search或通过Linux邮件列表find不幸的(我发现了一些关于msync补丁的邮件,但没有别的)

在一个说明中,我已经浏览了几十个其他可用的持久性KV商店,并且无法find更适合我(快速写入,易于使用,embedded(所以没有HTTP服务或类似的),确定性的速度(所以没有垃圾收集或随机运行压缩像leveldb),理智的空间要求(所以没有附加数据库),可变密钥长度,二进制密钥和数据),但如果你知道一个可以帮助我在这里, d也非常感谢。

msync(MS_ASYNC)不能保证存储的顺序,因为在后台操作的IO升降机算法试图通过合并和排序写入来最大化效率,以最大化对设备的吞吐量。

man 2 msync

从Linux 2.6.19开始, MS_ASYNC实际上是不可操作的,因为内核正确地跟踪脏页面,并根据需要将其刷新到存储空间。

不幸的是,同步一个映射和后备存储的唯一机制是阻塞的MS_SYNC ,它也没有任何顺序保证(如果你同步1 MiB区域,256 4 KiB页面可以以任何顺序传播到驱动器 -所有你知道的是,如果msync返回, 所有的1 MiB已经同步)。