在linux上使用msync(MS_ASYNC)刷新页面的顺序是否保证与写入页面的顺序相同?
如果取决于具体情况,我是否有办法(完全服务器访问)以确保它们的顺序相同?
背景
我目前正在使用OpenLDAP Symas MDB作为持久性键/值存储而没有MDB_MAPASYNC
- 导致使用msync(MS_ASYNC)
(我查看了源代码) - 写入是如此即使在处理数据时,即使在处理数据时,单个核心有时会在IO上永久等待。 1MB /秒。经过分析,问题似乎是许多小IO操作。使用MDB_MAPASYNC
我可以轻松地达到磁盘的最大速率,但MDB的文档声明在这种情况下数据库可能会损坏。不幸的是,代码对我来说过于复杂/我目前没有时间一步一步地完成整个代码库,以找出原因,而且,我不需要MDB提供的许多功能(事务处理) ,游标,ACID合规性),所以我正在考虑使用msync(MS_ASYNC)
编写我自己的由mmap支持的KV商店,并确保以一种非刷新页面只丢失最后一次触摸数据的方式编写,并且不破坏数据库或丢失任何其他数据。
但是为了那个我需要一个我的问题的答案,不幸的是我通过谷歌搜索或通过linux邮件列表找不到(我发现了一些关于msync补丁的邮件,但没有别的)
注意,我已经浏览了许多其他可用的持久性KV商店,并且无法找到更适合我(快速写入,易于使用,嵌入式(因此没有http服务等) ,确定性的速度(所以没有垃圾收集或随机运行压缩像leveldb),理智的空间要求(所以没有附加数据库),可变密钥长度,二进制密钥和数据),但如果你知道一个可以帮助我在这里,我也非常感激。
答案 0 :(得分:1)
msync(MS_ASYNC)
并不保证商店的排序,因为IO电梯在后台运行,试图通过合并和排序写入来最大化效率,以最大化设备的吞吐量。
答案 1 :(得分:1)
来自man 2 msync
:
从Linux 2.6.19开始,
MS_ASYNC
实际上是一个无操作,因为内核正确地跟踪脏页并在必要时将它们刷新到存储。
不幸的是,将映射与其后备存储同步的唯一机制是阻塞MS_SYNC
,它也没有任何排序保证(如果同步1 MiB区域,256 4 KiB页面可以传播到任何顺序的驱动器 - 你知道的是,如果msync
返回,则已经同步了1 MiB的所有。