0

每个人。我被困在以下问题上。

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

4

3 回答 3

0

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

于 2013-09-25T11:07:18.680 回答
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,只会缓存 SSD 擅长的随机读写。它适用于台式机、服务器、高端存储阵列,甚至可能是嵌入式的。

于 2013-09-25T11:28:30.223 回答
0

您要实现的目标如下所示:

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