ssa*_*ota 33 linux memory-usage
这里的输出free -m:
total used free shared buffers cached
Mem: 7188 6894 294 0 249 5945
-/+ buffers/cache: 698 6489
Swap: 0 0 0
Run Code Online (Sandbox Code Playgroud)
我可以看到几乎6GB(5945MB)内存7GB用于缓存文件。我知道如何刷新缓存。我的问题是:是否可以查看正在缓存哪些文件(或 inode)?
the*_*bit 33
嗯,是一个简单的方法,如果你碰巧要看看内核的页面缓存ftools - “fincore”为您提供了哪些文件页面的缓存内容的一些概要信息。
您将需要提供文件名列表以检查它们是否存在于页面缓存中。这是因为存储在内核页面缓存表中的信息仅包含数据块引用而不包含文件名。fincore将通过 inode 数据解析给定文件的数据块并在页面缓存表中搜索相应的条目。
没有执行反向操作的有效搜索机制 - 获取属于数据块的文件名将需要读取文件系统上的所有 inode 和间接块。如果您需要了解存储在页面缓存中的每个文件的块,则需要将文件系统上所有文件的列表提供给fincore. 但这又可能会破坏测量,因为将读取大量数据,遍历目录并获取所有 inode 和间接块 - 将它们放入页面缓存并逐出您试图检查的页面缓存数据。
eww*_*ite 24
您可以使用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
Run Code Online (Sandbox Code Playgroud)
现在我可以将它“触摸”到缓存中。
[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
Run Code Online (Sandbox Code Playgroud)
现在看看缓存了多少......
[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
Run Code Online (Sandbox Code Playgroud)
小智 5
我编写了以下脚本,它使用 pcstat 命令打印所有文件及其缓存状态。它是适用于 x86_64 Linux 系统的独立脚本。如果需要,它会下载 pcstat。
第一个参数是要分析的文件系统位置,第二个参数是结果数(按缓存中页数排列的前 N 个)。
#!/bin/bash
#Exit if a variable is not set
set -o nounset
#Exit on first error
set -o errexit
if [ $# -eq 0 ]; then
echo "Usage: $0 <root-dir> [number-of-results]"
echo
echo "Example $0 /var 10"
echo "will show top 10 files in /var which are loaded in cache"
exit
fi
ROOT=$1
#Number of results to show
HOW_MANY=50
[ -n ${2-} ] && HOW_MANY=$2
SCRIPT_DIR="$( cd -P "$( dirname "$0" )" && pwd )"
if [ ! -x $SCRIPT_DIR/pcstat ]; then
(
cd $SCRIPT_DIR
rm -f pcstat
curl -L -o pcstat https://github.com/tobert/pcstat/raw/2014-05-02-01/pcstat.x86_64
chmod +x pcstat
)
fi
FIND="find ${ROOT} -not ( -path /proc -prune ) -not ( -path /sys -prune ) -type f -size +0c -print0"
$FIND | xargs -0 ${SCRIPT_DIR}/pcstat -terse -nohdr | sort --field-separator=, -r -n -k 6 | head -n ${HOW_MANY}
Run Code Online (Sandbox Code Playgroud)