24

我的问题是如何在 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 文件)。任何指针都会有所帮助。

PS - 我在这个项目中使用 linux 4.0。

4

2 回答 2

1

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

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

更多信息: 如何从映射它的所有 PTE 中取消映射结构页面

于 2019-01-24T08:24:13.443 回答
0

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

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

    使用 ftrace 和函数图来跟踪内核空间中的函数。将更深入地了解哪些函数被调用。

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

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

于 2019-08-19T10:06:01.337 回答