是否可以列出缓存的文件?

是否可以列出缓存的文件?

这里的输出是free -m

             total       used       free     shared    buffers     cached
Mem:          7188       6894        294          0        249       5945
-/+ buffers/cache:        698       6489
Swap:            0          0          0

我可以看到几乎6GB(5945MB) 的内存都7GB用于缓存文件。我知道如何刷新缓存。我的问题是:是否可以看到哪些文件(或 inode)正在被缓存?

答案1

嗯,如果你碰巧有工具- “fincore” 为您提供了有关哪些文件页面是缓存内容的一些摘要信息。

您需要提供一个文件名列表来检查它们是否存在于页面缓存中。这是因为存储在内核页面缓存表中的信息仅包含数据块引用,而不包含文件名。fincore将通过 inode 数据解析给定文件的数据块,并在页面缓存表中搜索相应的条目。

没有有效的搜索机制来执行反向操作 - 获取属于数据块的文件名需要读取文件系统上的所有 inode 和间接块。如果您需要了解存储在页面缓存中的每个文件块,则需要向 提供文件系统上所有文件的列表fincore。但这又可能会破坏测量,因为需要读取大量数据,遍历目录并获取所有 inode 和间接块 - 将它们放入页面缓存并逐出您尝试检查的页面缓存数据。

答案2

您可以使用vmtouch 实用程序查看指定文件或目录是否在缓存中。您还可以使用该工具强制将项目放入缓存或将其锁定在缓存中。

[root@xt ~]# vmtouch -v /usr/local/var/orca/procallator.cfg
/usr/local/var/orca/procallator.cfg
[     ] 0/5

           Files: 1
     Directories: 0
  Resident Pages: 0/5  0/20K  0%
         Elapsed: 0.000215 seconds

现在我可以将其“触及”缓存中。

[root@xt ~]# vmtouch -vt /usr/local/var/orca/procallator.cfg
/usr/local/var/orca/procallator.cfg
[OOOOO] 5/5

           Files: 1
     Directories: 0
   Touched Pages: 5 (20K)
         Elapsed: 0.005313 seconds

现在查看缓存了多少...

[root@xt ~]# vmtouch -v /usr/local/var/orca/procallator.cfg
/usr/local/var/orca/procallator.cfg
[OOOOO] 5/5

           Files: 1
     Directories: 0
  Resident Pages: 5/5  20K/20K  100%
         Elapsed: 0.000241 seconds

答案3

您还可以使用 pcstat (Page Cache Stat) https://github.com/tobert/pcstat

希望它能对某人有所帮助。

答案4

我写了一个非常简单的 shell 脚本来使用 linux-fincore 显示缓存文件。由于缓存是内存的一部分,我的代码是找出进程的前 10 个 RSZ 使用率,然后使用 lsof 找出进程打开的文件,最后使用 linux-fincore 找出这些文件是否被缓存。

如果我的想法错误,请纠正我。

#!/bin/bash
#Author: Shanker
#Time: 2016/06/08

#set -e
#set -u
#you have to install linux-fincore
if [ ! -f /usr/local/bin/linux-fincore ]
then
    echo "You haven't installed linux-fincore yet"
    exit
fi

#find the top 10 processs' cache file
ps -e -o pid,rss|sort -nk2 -r|head -10 |awk '{print $1}'>/tmp/cache.pids
#find all the processs' cache file
#ps -e -o pid>/tmp/cache.pids

if [ -f /tmp/cache.files ]
then
    echo "the cache.files is exist, removing now "
    rm -f /tmp/cache.files
fi

while read line
do
    lsof -p $line 2>/dev/null|awk '{print $9}' >>/tmp/cache.files 
done</tmp/cache.pids


if [ -f /tmp/cache.fincore ]
then
    echo "the cache.fincore is exist, removing now"

    rm -f /tmp/cache.fincore
fi

for i in `cat /tmp/cache.files`
do

    if [ -f $i ]
    then

        echo $i >>/tmp/cache.fincore
    fi
done

linux-fincore -s  `cat /tmp/cache.fincore`

rm -f /tmp/cache.{pids,files,fincore}

相关内容