在回收之前写一个缓存页面

时间:2013-09-25 06:41:39

标签: linux caching memory-management kernel

大家。我坚持以下问题。

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

这不是一个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,只是随机读写   固态硬盘擅长。它适用于台式机,服务器,   高端存储阵列,甚至可能是嵌入式存储阵列。

答案 2 :(得分:0)

您要实现的目标如下:

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