【发布时间】:2011-02-08 13:27:28
【问题描述】:
我想知道页面缓存中缓存了哪些文件,并且想务实地释放特定文件的缓存空间。如果需要,我可以编写内核模块甚至修改内核代码。谁能给我一些线索?
【问题讨论】:
我想知道页面缓存中缓存了哪些文件,并且想务实地释放特定文件的缓存空间。如果需要,我可以编写内核模块甚至修改内核代码。谁能给我一些线索?
【问题讨论】:
首先,内核不维护页面缓存中所有文件的主列表,因为它不需要这些信息。相反,给定一个 inode,您可以查找关联的页面缓存页面,反之亦然。
对于每个页面缓存struct page,page_mapping() 将返回它所属的struct address_space。 struct address_space 的host 成员标识拥有struct inode,从那里您可以获取inode 号和设备。
【讨论】:
struct inode 的文件名?如果有多个文件名指向同一个inode,任何一个都可以。
open() 系统调用,并记录所有打开的文件,然后扫描所有这些文件,看看是否有缓存。这样,我就可以摆脱扫描整个文件系统的麻烦了。会吗?
mincore()返回一个向量,指示调用进程的虚拟内存的页面是否驻留在核心 (RAM) 中,因此如果被引用,则不会导致磁盘访问(页面错误)。内核返回关于从地址 addr 开始并持续到 length 个字节的页面的驻留信息。
要测试当前映射到您的进程的文件是否在缓存中,请使用其映射地址调用mincore。
要测试任意文件是否在缓存中,打开并映射它,然后按照上面的操作。
有一个建议的 fincore() 系统调用不需要首先映射文件,但(此时)它尚未普遍可用。
(然后madvise(MADV_DONTNEED)/fadvise(FADV_DONTNEED) 可以从缓存中删除部分映射/文件。)
【讨论】:
fincore(),这帮助我解决了另一个问题。顺便说一句,fincore()不是系统调用,而是linux-ftools提供的工具,它使用mmap()和mincore()来判断文件的哪些页面在pagecache中,并使用posix_fadvise()和@987654336 @ 从缓存中删除映射/文件的一部分。
fincore 系统调用,即使它的结果可以通过使用多个现有系统调用在用户空间中获得。看起来linux-ftools 就是这样做的。
在 Linux 下,你可以使用
从页面缓存中释放文件的内容posix_fadvise(fd, POSIX_FADV_DONTNEED
从 Linux 2.6 开始,这将立即删除缓存给定文件或部分文件的页面缓存部分;调用会阻塞,直到操作完成,但 posix 不保证该行为。
请注意,如果页面已被修改,它不会有任何影响,在这种情况下,您需要先执行 fdatasync 或类似操作。
编辑:抱歉,我没有完全阅读您的问题。我不知道如何判断页面缓存中当前有哪些文件。对不起。
【讨论】:
posix_fadvise() 解决了我的另一个问题 :)