it-swarm.com.de

Ist es möglich, die zwischengespeicherten Dateien aufzulisten?

Hier die Ausgabe von free -m:

             total       used       free     shared    buffers     cached
Mem:          7188       6894        294          0        249       5945
-/+ buffers/cache:        698       6489
Swap:            0          0          0

Ich kann fast sehen 6GB (5945 MB) Speicher aus 7GB wird zum Zwischenspeichern der Dateien verwendet. Ich weiß, wie man die Caches spült. Meine Frage ist: Ist es möglich zu sehen, welche Dateien (oder Inodes) zwischengespeichert werden?

29
ssapkota

Nun, es gibt eine einfache Möglichkeit, einen Blick auf den Seiten-Cache des Kernels zu werfen, wenn Sie zufällig ftools - "fincore haben "gibt Ihnen einige zusammenfassende Informationen darüber, welche Dateiseiten den Inhalt des Caches enthalten.

Sie müssen eine Liste mit Dateinamen angeben, um zu überprüfen, ob sie im Seitencache vorhanden sind. Dies liegt daran, dass die in den Seiten-Cache-Tabellen des Kernels gespeicherten Informationen nur Datenblockreferenzen und keine Dateinamen enthalten. fincore würde die Datenblöcke einer bestimmten Datei durch Inode-Daten auflösen und nach entsprechenden Einträgen in den Seiten-Cache-Tabellen suchen.

Es gibt keinen effizienten Suchmechanismus für das Umgekehrte. Um einen Dateinamen zu erhalten, der zu einem Datenblock gehört, müssen alle Inodes und indirekten Blöcke im Dateisystem gelesen werden. Wenn Sie wissen möchten, welche Blöcke jeder einzelnen Datei im Seitencache gespeichert sind, müssen Sie fincore eine Liste aller Dateien auf Ihren Dateisystemen bereitstellen. Aber das wiederum wird wahrscheinlich die Messung beeinträchtigen, da eine große Datenmenge gelesen wird, die die Verzeichnisse durchläuft und alle Inodes und indirekten Blöcke abruft - sie in den Seiten-Cache legt und genau die Seiten-Cache-Daten entfernt, die Sie untersuchen wollten.

26
the-wabbit

Mit dem Dienstprogramm vmtouch können Sie feststellen, ob sich eine benannte Datei oder ein benanntes Verzeichnis im Cache befindet. Sie können das Tool auch verwenden, um Elemente in den Cache zu zwingen oder sie im Cache zu sperren.

[[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

Jetzt kann ich es in den Cache "berühren".

[[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

Nun, um zu sehen, wie viel zwischengespeichert wird ...

[[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
21
ewwhite

Ich schreibe ein sehr einfaches Shell-Skript, um die zwischengespeicherten Dateien unter Verwendung von Linux-Fincore anzuzeigen. Da der Cache ein Teil des Speichers ist, besteht mein Code darin, die 10 häufigsten RSZ-Verwendungszwecke des Prozesses zu ermitteln und mithilfe von lsof herauszufinden, welche Dateien der Prozess geöffnet hat. Verwenden Sie schließlich linux-fincore, um herauszufinden, ob diese Dateien zwischengespeichert sind oder nicht.

Bitte korrigieren Sie mich, wenn ich falsch denke.

#!/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}
3
Shanker lee

Ich habe folgendes Skript geschrieben, das alle Dateien und ihren Cache-Status mit dem Befehl pcstat druckt. Es ist ein in sich geschlossenes Skript für x86_64-Linux-Systeme. Bei Bedarf wird pcstat heruntergeladen.

Das erste Argument ist der zu analysierende Speicherort des Dateisystems und das zweite Argument ist die Anzahl der Ergebnisse (Top N nach Anzahl der Seiten im Cache).

#!/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}
2
Nadddy

Sie können auch pcstat (Page Cache Stat) https://github.com/tobert/pcstat verwenden

Hoffe es hilft jemandem.

2
blavoie