【问题标题】:Linux Page Cache - Deleting a page from the page cache in kernelLinux Page Cache - 从内核中的页面缓存中删除一个页面
【发布时间】:2019-09-14 04:05:51
【问题描述】:

我的问题是这个How to manipulate page cache in Linux?的延伸

我正在尝试做一个旨在限制每个文件使用的页面缓存大小的小项目。我使用的方法如下-

  1. 在页面指针被添加到页面缓存时维护一个 kfifo 队列。
  2. add_to_page_cache_lru() 中添加一个钩子,查看文件的基数树(地址空间)的大小是否大于预先确定的大小,然后从 fifo 队列中选择一个牺牲品并从页面缓存中删除页面。
  3. 我使用函数 delete_from_page_cache()try_to_unmap() 将页面从页面缓存中逐出,然后使用 put_page() 来释放页面。

我希望这段代码可以释放页面并释放内存,但这似乎没有发生。例如,如果我读取一个大小为 25MB 的文件,并且我已将此文件的页面缓存大小限制为 512 页 (2MB),那么我希望看到可用内存中只有 2MB 的变化(free -m )。 相反,我看到的是完整的 25MB 被吃掉并显示在 free 命令中。

我还应该做些什么来确保满足我的要求?我还没有考虑过脏页,因为我什至无法让它用于读取(cat 文件)。任何指针都会有所帮助。

附: - 我在这个项目中使用的是 linux 4.0。

【问题讨论】:

  • 在相关说明中,请检查内核中drop_caches 的实现,即它如何完成类似的事情。 stackoverflow.com/a/32288932/319204
  • @TheCodeArtist 谢谢!我一定会试试这个。
  • 我怀疑操作系统可能会在文件打开时做出假设,并且无论您要求什么,它都会自行使用内存,只是为了提高访问性能。在不要求任何缓存的情况下查看它的作用(只需打开文件)并检查可用内存。然后尝试一个绝对庞大的文件,看看在这种情况下操作系统为缓存预留了多少。这可能是您最适合使用的尺码。否则,您可能必须创建自己的私有内存缓存空间,并复制您想要缓存的一小部分,然后关闭文件连接。

标签: linux linux-kernel page-caching


【解决方案1】:

您可能需要做的不仅仅是 delete_from_page_cache() + try_to_unmap() + put_page()...

查看 shrink_page_list() 的行为方式,包括对 page_check_references() 的检查:

更多: How to unmap struct page from all PTEs mapping it

【讨论】:

    【解决方案2】:

    我认为您正在与文件系统作斗争。

    1. 如果你正在添加可加载模块 linux 缓存子系统并且 fs 缓存系统不知道这一点。

      使用 ftrace 和函数图来跟踪内核空间中的函数。会给更多 洞察哪些函数被调用。

    2. cgroup 是更好的扩展模块或 linux 缓存。无论你想要达到什么目的。

    我不确定确切的原因,但以上信息可以帮助您找出原因。

    【讨论】:

      猜你喜欢
      • 2016-10-19
      • 2015-11-02
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多