【问题标题】:Write a cached page before it is reclaimed在回收之前写入缓存页面
【发布时间】:2013-09-25 06:41:38
【问题描述】:

每个人。我被以下问题困住了。

我正在开发一个混合存储系统,它使用 ssd 作为硬盘的缓存层。为此,应将从硬盘读取的数据写入ssd,以促进后续对该数据的读取。由于 Linux 将从磁盘读取的数据缓存在页面缓存中,因此可以延迟向 ssd 写入数据;但是,缓存数据的页面可能会被释放,不建议访问已释放的页面。这是问题:我有“struct page”指针指向要写入ssd的页面。有没有办法确定指针所代表的页面是否有效(通过有效我的意思是缓存的页面可以安全地写入ssd?如果通过指针访问释放的页面会发生什么?数据是释放的页面和释放前一样吗?

【问题讨论】:

    标签: linux caching memory-management kernel


    【解决方案1】:

    你在使用 cleancache 模块吗?您应该只从中获取有效页面,并且在您的回调函数完成之前它应该保持有效。

    【讨论】:

      【解决方案2】:

      这不是对 cleancache/frontswap 的重新实现吗? (https://www.kernel.org/doc/Documentation/vm/cleancache.txt)。

      现有 cleancache 代码的好处是它仅在释放页面之前调用您的代码,因此在页面驻留在 RAM 之前,并且当 RAM 中没有空间留给它时,内核调用您的代码来支持它在 tmem(瞬态内存)中。

      搜索我还发现了一个似乎正是这样做的现有项目:http://bcache.evilpiepirate.org/:

      Bcache 是 Linux 内核块层缓存。它允许一个或多个快速 磁盘驱动器,例如基于闪存的固态驱动器 (SSD),用作 缓存一个或多个较慢的硬盘驱动器。

      Linux 内核的 Bcache 补丁允许使用 SSD 进行缓存 其他块设备。它类似于 ZFS 的 L2Arc,但 Bcache 也 做回写缓存(除了通过缓存写),它是 文件系统不可知。它的设计是用最少的 努力,并且无需在任何设置上进行配置即可正常工作。经过 默认不缓存顺序 IO,只缓存随机读写 SSD擅长的。它适用于台式机、服务器、 高端存储阵列,甚至可能是嵌入式的。

      【讨论】:

      • 非常感谢您的回复。事实上,我的实现是基于 flashcache 的,它的目的与 Bcache 相似。以下是我的问题的更具体表达:
      • 对于每个干净页面的写入,都有对应的BIO结构。但是,我想通过在队列中挂起来延迟 BIO 的提交。我的问题是: 1)当 BIO 在队列中时,页面可以被修改并因此变脏吗? 2)写回是只将页面的修改部分写入磁盘,还是整个页面? 3)如果页面在队列中是干净的,那么页面是否可以被释放? @lsk
      【解决方案3】:

      您要达到的目标如下所示:

      • 在从页面缓存中逐出页面之前,您需要对其进行缓存。这在概念上称为受害者缓存。你可以寻找这方面的论文。
      • 您需要一种在 IO 期间“固定”目标页面的方法。发布 IO,可以释放 pagecache 页面。
      • 但是,这会延迟驱逐,在内存压力期间可能需要驱逐以创建更多未缓存的页面。
      • 因此,一种可能的解决方案是在页面缓存逐出开始之前启动缓存算法。
      • 第二种可能的解决方案是留出一堆空闲页面,并将从页面缓存中逐出的页面与空闲池中的页面交换,并在后台缓存被逐出的页面。但是,您现在需要与文件块删除等同步

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-12
        • 2011-12-09
        • 2016-05-03
        • 2015-02-13
        • 1970-01-01
        • 1970-01-01
        • 2019-12-16
        相关资源
        最近更新 更多