ここにfree -m
の出力:
total used free shared buffers cached
Mem: 7188 6894 294 0 249 5945
-/+ buffers/cache: 698 6489
Swap: 0 0 0
ファイルのキャッシュに6GB
のうち、ほぼ7GB
(5945MB)のメモリが使用されていることがわかります。キャッシュをフラッシュする方法を知っています。私の質問は:キャッシュされているファイル(またはiノード)を確認することは可能ですか?
まあ、そこにisftools -"fincore "は、どのファイルのページがキャッシュのコンテンツであるかについての概要情報を提供します。
ページキャッシュに存在するかどうかを確認するには、ファイル名のリストを指定する必要があります。これは、カーネルのページキャッシュテーブルに格納される情報には、データブロック参照のみが含まれ、ファイル名は含まれないためです。 fincore
は、inodeデータを介して特定のファイルのデータブロックを解決し、ページキャッシュテーブル内のそれぞれのエントリを検索します。
逆を行うための効率的な検索メカニズムはありません。データブロックに属するファイル名を取得するには、ファイルシステム上のすべてのiノードと間接ブロックを読み取る必要があります。ページキャッシュに保存されているすべてのファイルのブロックについて知る必要がある場合は、ファイルシステム上のすべてのファイルのリストをfincore
に提供する必要があります。しかし、ディレクトリを横断して大量のデータが読み取られ、すべてのiノードと間接ブロックが取得され、ページキャッシュに入れられ、調査しようとしたページキャッシュデータそのものが削除されるため、測定が台無しになる可能性があります。
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
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}
Pcstatコマンドを使用してすべてのファイルとそのキャッシュステータスを出力する次のスクリプトを作成しました。これは、x86_64 linuxシステム用の自己完結型スクリプトです。必要に応じてpcstatをダウンロードします。
最初の引数は分析するファイルシステムの場所であり、2番目の引数は結果の数です(キャッシュ内のページ数による上位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}
Pcstat(ページキャッシュ統計) https://github.com/tobert/pcstat を使用することもできます
それが誰かを助けることを願っています。