2

在 Linux 上使用 msync(MS_ASYNC) 刷新页面的顺序是否保证与写入页面的顺序相同?

如果视情况而定,有没有办法让我(完全服务器访问)确保它们的顺序相同?

背景

我目前正在使用OpenLDAP Symas MDB作为持久键/值存储并且没有MDB_MAPASYNC- 这导致使用msync(MS_ASYNC)(我查看了源代码) - 写入速度非常慢,即使在处理数据时,单个核心也永久等待 IO有时 < 1MB/s。经过分析,问题似乎是很多小的IO Ops。使用MDB_MAPASYNC我可以轻松达到磁盘的最大速率,但 MDB 的文档指出,在这种情况下,数据库可能会损坏。不幸的是,代码对我来说太复杂了/我目前没有时间逐步完成整个代码库来找出为什么会这样,而且我不需要 MDB 提供的许多功能(事务,游标,ACID 合规性),所以我正在考虑编写自己的由 mmap 支持的 KV 存储,使用msync(MS_ASYNC)并确保以未刷新的页面只会丢失最后一次触摸的数据而不会损坏数据库或丢失任何其他数据。

但为此,我需要回答我的问题,不幸的是,我完全无法通过谷歌搜索或通过 linux 邮件列表找到该问题(我发现了一些关于 msync 补丁的邮件,但没有别的了)

需要注意的是,我查看了许多其他可用的持久性 KV 存储,但无法找到更适合我的(快速写入、易于使用、嵌入式(因此没有 http 服务等)、确定性速度(所以没有垃圾收集或像 leveldb 那样随机运行压缩)、合理的空间要求(所以没有仅附加的数据库)、可变密钥长度、二进制密钥和数据),但如果你知道一个可以帮助我的方法,我d 也非常感谢。

4

2 回答 2

1

msync(MS_ASYNC)不保证存储的顺序,因为在后台运行的 IO 电梯算法试图通过合并和排序写入来最大限度地提高效率,以最大限度地提高设备的吞吐量。

于 2015-01-17T21:37:59.783 回答
1

来自man 2 msync

从 Linux 2.6.19 开始,MS_ASYNC实际上是无操作的,因为内核正确地跟踪脏页并在必要时将它们刷新到存储中。

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

于 2016-01-16T21:26:26.517 回答