这里的输出是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}