【问题标题】:How to manipulate page cache in Linux?如何在 Linux 中操作页面缓存?
【发布时间】:2011-02-08 13:27:28
【问题描述】:

我想知道页面缓存中缓存了哪些文件,并且想务实地释放特定文件的缓存空间。如果需要,我可以编写内核模块甚至修改内核代码。谁能给我一些线索?

【问题讨论】:

    标签: linux caching memory


    【解决方案1】:

    首先,内核不维护页面缓存中所有文件的主列表,因为它不需要这些信息。相反,给定一个 inode,您可以查找关联的页面缓存页面,反之亦然。

    对于每个页面缓存struct pagepage_mapping() 将返回它所属的struct address_spacestruct address_spacehost 成员标识拥有struct inode,从那里您可以获取inode 号和设备。

    【讨论】:

    • 感谢您的建议!那么,有没有简单的方法来获取struct inode 的文件名?如果有多个文件名指向同一个inode,任何一个都可以。
    • @Stephenjy:不,这就是您确定的原因 - 一个 inode 可能有零个、一个或多个指向它的文件名。唯一的方法是扫描文件系统中的所有文件名以寻找匹配项。不过,您可以轻松地采用另一种方式 - 查找文件名并确定它拥有多少页面缓存页面。
    • 也许我可以拦截所有open() 系统调用,并记录所有打开的文件,然后扫描所有这些文件,看看是否有缓存。这样,我就可以摆脱扫描整个文件系统的麻烦了。会吗?
    【解决方案2】:

    mincore() 返回一个向量,指示调用进程的虚拟内存的页面是否驻留在核心 (RAM) 中,因此如果被引用,则不会导致磁盘访问(页面错误)。内核返回关于从地址 addr 开始并持续到 length 个字节的页面的驻留信息。

    要测试当前映射到您的进程的文件是否在缓存中,请使用其映射地址调用mincore
    要测试任意文件是否在缓存中,打开并映射它,然后按照上面的操作。

    有一个建议的 fincore() 系统调用不需要首先映射文件,但(此时)它尚未普遍可用。

    (然后madvise(MADV_DONTNEED)/fadvise(FADV_DONTNEED) 可以从缓存中删除部分映射/文件。)

    【讨论】:

    • 感谢fincore(),这帮助我解决了另一个问题。顺便说一句,fincore()不是系统调用,而是linux-ftools提供的工具,它使用mmap()mincore()来判断文件的哪些页面在pagecache中,并使用posix_fadvise()和@987654336 @ 从缓存中删除映射/文件的一部分。
    • @stephenjy:如前所述,有一个提议的fincore 系统调用,即使它的结果可以通过使用多个现有系统调用在用户空间中获得。看起来linux-ftools 就是这样做的。
    【解决方案3】:

    在 Linux 下,你可以使用

    从页面缓存中释放文件的内容
    posix_fadvise(fd, POSIX_FADV_DONTNEED
    

    从 Linux 2.6 开始,这将立即删除缓存给定文件或部分文件的页面缓存部分;调用会阻塞,直到操作完成,但 posix 不保证该行为。

    请注意,如果页面已被修改,它不会有任何影响,在这种情况下,您需要先执行 fdatasync 或类似操作。

    编辑:抱歉,我没有完全阅读您的问题。我不知道如何判断页面缓存中当前有哪些文件。对不起。

    【讨论】:

    • 还是非常感谢,posix_fadvise() 解决了我的另一个问题 :)
    猜你喜欢
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 2015-11-02
    • 1970-01-01
    相关资源
    最近更新 更多