【发布时间】:2019-09-14 04:05:51
【问题描述】:
我的问题是这个How to manipulate page cache in Linux?的延伸
我正在尝试做一个旨在限制每个文件使用的页面缓存大小的小项目。我使用的方法如下-
- 在页面指针被添加到页面缓存时维护一个 kfifo 队列。
- 在 add_to_page_cache_lru() 中添加一个钩子,查看文件的基数树(地址空间)的大小是否大于预先确定的大小,然后从 fifo 队列中选择一个牺牲品并从页面缓存中删除页面。
- 我使用函数 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