以下は、free -m
の出力です。
total used free shared buffers cached
Mem: 7188 6894 294 0 249 5945
-/+ buffers/cache: 698 6489
Swap: 0 0 0
7GBのうち6GB(5945MB)がキャッシュに使われていることがわかります。キャッシュをフラッシュする方法は知っています。質問です。**どのファイル(またはinode)がキャッシュされているか見ることは可能ですか?
もし、あなたが ftools を持っているならば、カーネルのページキャッシュを見る簡単な方法があります。
ページキャッシュの存在を確認するために、ファイル名のリストを提供する必要があります。 これは、カーネルのページキャッシュのテーブルに格納されている情報が、ファイル名ではなく、データブロックの参照のみを含んでいるからです。fincore` は与えられたファイルのデータブロックをinodeデータで解決し、ページキャッシュのテーブルからそれぞれのエントリーを探します。
データブロックに属するファイル名を得るには、ファイルシステム上のすべてのinodeと間接ブロックを読み込む必要があります。もし、ページキャッシュに保存されているすべてのファイルのブロックについて知る必要があるならば、ファイルシステム上のすべてのファイルのリストを fincore
に提供する必要があります。しかし、ディレクトリを走査してすべての inode と間接ブロックを取得し、それらをページキャッシュに入れ、まさに調べようとしているページキャッシュのデータを退避させるために、大量のデータを読み込むことになり、これもまた計測を台無しにする可能性があります。
vmtouch ユーティリティ]1を使用すると、指定したファイルまたはディレクトリがキャッシュ内にあるかどうかを確認できます。また、このツールを使用して、アイテムを強制的にキャッシュに入れたり、キャッシュにロックしたりすることもできます。
[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
これで、キャッシュに "touch" できるようになりました。
[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
linux-fincoreを使って、キャッシュされたファイルを表示する簡単なシェルスクリプトを書いています。 キャッシュはメモリの一部なので、私のコードは、プロセスのRSZ使用量のトップ10を見つけ、プロセスが開いたファイルを見つけるために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}