【问题标题】:c linux msync(MS_ASYNC) flush orderc linux msync(MS_ASYNC) 刷新顺序
【发布时间】:2013-10-18 15:21:33
【问题描述】:

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

如果取决于具体情况,我是否有办法(完全服务器访问权限)确保它们的顺序相同?

背景

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

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

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

【问题讨论】:

    标签: c linux mmap


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      来自man 2 msync

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

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

      【讨论】:

        猜你喜欢
        • 2014-11-23
        • 2014-12-29
        • 2023-01-13
        • 2018-02-05
        • 2017-07-09
        • 2021-02-05
        • 2011-11-14
        • 1970-01-01
        • 2012-07-01
        相关资源
        最近更新 更多