キャッシュされているファイルをリストすることは可能ですか?


29

ここでの出力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が使用されています。キャッシュをフラッシュする方法を知っています。私の質問は次のとおりです。どのファイル(またはiノード)がキャッシュされているかを確認できますか?


私は答えを知りませんが、2つのことが重要です:どのようにキャッシュをフラッシュしますか?なぜそれが興味深いのか、ここでは何も示唆していません-ユースケースに興味があるだけ
です-serverhorror

2
これにより、buffersとの両方がフラッシュされcachedますsysctl -w vm.drop_caches=3。使用する前に、詳細をお読みください。時には必要なだけです。その利用可能-これは別の理由である必要があります:)
ssapkota

多くの人がそれ求めています。何らかの理由があるはずです。
ssapkota

あなたには、いくつかのI / O関連のパフォーマンス測定をしたいし、それらは、O / Sのキャッシングにより「台無し」したくない場合はキャッシュをドロップすると便利来る
-wabbit

回答:


25

まあ、そこにあるあなたが持って起こる場合は、カーネルのページキャッシュを見てみましょう簡単な方法ftoolsは - 「fincoreは、」あなたのファイルページがキャッシュの内容が何であるかにいくつかのサマリー情報を提供します。

ページキャッシュに存在するかどうかを確認するには、ファイル名のリストを提供する必要があります。これは、カーネルのページキャッシュテーブルに保存されている情報にはデータブロック参照のみが含まれ、ファイル名は含まれないためです。fincoreiノードデータを使用して特定のファイルのデータブロックを解決し、ページキャッシュテーブル内の各エントリを検索します。

逆を行うための効率的な検索メカニズムはありません。データブロックに属するファイル名を取得するには、ファイルシステム上のすべてのiノードと間接ブロックを読み取る必要があります。ページキャッシュに保存されているすべてのファイルのブロックについて知る必要がある場合は、ファイルシステム上のすべてのファイルのリストをに提供する必要がありますfincore。しかし、大量のデータがディレクトリを横断して読み取られ、すべてのiノードと間接ブロックを取得するため、測定が台無しになる可能性があります-それらをページキャッシュに入れ、調査しようとしているページキャッシュデータを削除します。


fincoreは、ファイルがキャッシュに存在するかどうかを通知します。ただし、キャッシュされているすべてのファイルが一覧表示されます任意のツールがあります(fincoreを入力して検索すると、ファイル名を受け取り、私は現在、キャッシュされているすべてのエントリに見てみたい。)
ジョー

@Joeカーネルのページキャッシュテーブルに格納されている情報には、データブロック参照のみが含まれ、ファイル名は含まれないと思われます。fincoreiノードデータを使用して特定のファイルのデータブロックを解決し、ページキャッシュテーブル内の各エントリを検索します。逆を行う効率的な検索メカニズムはありません。データブロックに属するファイル名を取得するには、ファイルシステム上のすべてのiノードと間接ブロックを読み取る必要があります。したがって、fincoreこのレベルの情報が本当に必要な場合は、アルゴリズム的に、ファイルシステム上のすべてのファイルのリストを提供する方が適切です。
the-wabbit 14年

@ the-wabbitありがとう。ファイル以外に、そこなど記述子、共有メモリとしてキャッシュの一部である他のもの、です
ジョー・

@Joe残念ながら、このトピックに関する信頼できる答えを出すために、カーネルの内部には深く入っていません。ページキャッシュは、ファイルシステムのデータブロックだけでなく、他の種類のデータをキャッシュするのに十分な汎用性を備えているように見えますが、例は知りません。
ワビット14年

1
時代遅れの回答どう処理するかに関するStackExchangeのスタンスは、やや曖昧です。受け入れられた回答を削除したり、大幅に変更したりすることは嫌われます。この回答を変更してvmtouchを推奨すると、@ ewwhiteの既存の回答が複製され、これには同数の賛成票があります。だから、ewwhiteの答えをさらに支持するだけでうまくいくはずですよね?
the-wabbit

19

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

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}

1
通常、キャッシュ内のファイルのセットは、現在開いているファイルの小さなサブセットよりもかなり大きくなります(キャッシュスペースが小さい場合を除く)。現在開いているファイルは、キャッシュ内に存在する可能性が高いです(ただし、これらのファイルが長いアイドル状態であったか、キャッシュが最近消去された場合を除きます)。注:lsofまた、process-address-spaceにマップされた(必ずしもキャッシュされない)ファイルも報告します。また、可能性の高いファイルの大部分は部分的にしか/まばらにキャッシュされるように起こっていることを...
ヴラド


2

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}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.