是否在Linux上使用msync(MS_ASYNC)进行页面刷新的顺序是否保证与写入页面的顺序相同?
如果视情况而定,是否有办法让我(完全访问服务器)确保它们的顺序相同?
背景
我目前正在使用OpenLDAP Symas MDB作为持久键/值存储,而没有MDB_MAPASYNC
-这导致使用msync(MS_ASYNC)
(我查看了源代码)-写入速度非常慢,以至于即使在处理数据时,单个内核仍在IO上永久等待有时MDB_MAPASYNC可以轻松达到磁盘的最大速率,但是MDB的文档指出,在这种情况下,数据库可能会损坏。不幸的是,代码对我来说太复杂了,我目前没有时间逐步研究整个代码库来找出原因,而且,我不需要MDB提供的许多功能(事务,游标和ACID规范),因此我考虑使用msync(MS_ASYNC)
编写由mmap支持的我自己的KV商店,并确保以一种不会刷新的页面只会丢失最后触摸的数据并且不会破坏数据库的方式进行写入或丢失任何其他数据。
但是为此,我需要一个问题的答案,不幸的是,通过谷歌搜索或遍历linux邮件列表我完全找不到(我发现了一些有关msync补丁的邮件,但除此之外没有其他)
值得注意的是,我浏览了数十个其他可用的持久性KV商店,但找不到适合我的方法(快速写入,易于使用,嵌入式(因此没有http服务等),确定性速度) (因此没有垃圾收集或像leveldb这样的随机运行压缩),合理的空间要求(因此没有仅附加数据库),可变密钥长度,二进制密钥和数据),但是如果您知道有什么可以在这里帮助我, d也非常感谢。
最佳答案
msync(MS_ASYNC)
不保证存储的排序,因为在后台运行的IO电梯算法试图通过合并和排序写入来最大程度地提高效率,以最大程度地提高设备的吞吐量。