GNU/Linux >> Linux の 問題 >  >> Linux

キャッシュされているファイルを一覧表示することはできますか?

解決策 1:

あります たまたま ftools を持っている場合にカーネルのページ キャッシュを調べる簡単な方法 - 「fincore」は、どのファイルのページがキャッシュのコンテンツであるかに関する概要情報を提供します。

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

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

解決策 2:

vmtouch ユーティリティを使用して、指定したファイルまたはディレクトリがキャッシュにあるかどうかを確認できます。このツールを使用して、アイテムをキャッシュに強制したり、キャッシュにロックしたりすることもできます。

[[email protected] ~]# 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

これでキャッシュに「タッチ」できます。

[[email protected] ~]# 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

キャッシュされている量を確認するには...

[[email protected] ~]# 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 を使用して、キャッシュされたファイルを表示するための非常に単純なシェル スクリプトを作成します。キャッシュはメモリの一部であるため、私のコードはプロセスの 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}

解決策 4:

pcstat (Page Cache Stat) も使用できますhttps://github.com/tobert/pcstat

誰かの役に立てば幸いです。

解決策 5:

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}

Linux
  1. Linux – Linuxシステムでバッファとキャッシュを空にする方法は?

  2. 別のファイルにない1つのファイルの行を取得するためのツール?

  3. プログラムによってアクセスされるファイルを一覧表示しますか?

  1. コマンドラインで括弧はどのように解釈されますか?

  2. ファイル/フォルダのリストを時間でソートするために使用されるコマンドはどれですか?

  3. ファイルのリストから入力を取得する tar アーカイブ

  1. 起動した現在のディスクを dd することはできますか?

  2. /tmp の内容を手動で削除する必要がありますか?

  3. カーネル デバイス ツリーを一覧表示する方法