Ist es möglich, die zwischengespeicherten Dateien aufzulisten?


29

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 sehen, dass fast 6GB(5945MB) Speicherplatz für 7GBdas Zwischenspeichern der Dateien verwendet wird. Ich weiß, wie man die Caches leert. Meine Frage ist: Ist es möglich zu sehen, welche Dateien (oder Inodes) zwischengespeichert werden?


Ich kenne die Antwort nicht, aber zwei Dinge sind von Interesse: Wie spült man die Caches? Warum ist das von Interesse, ich impliziere hier nichts - nur am Anwendungsfall interessiert
Serverhorror

2
Dies spült sowohl das buffersund cached: sysctl -w vm.drop_caches=3. Vielleicht möchten Sie vor der Verwendung mehr darüber lesen. Manchmal ist es nur nötig. Es ist verfügbar - dies sollte ein weiterer Grund sein :)
ssapkota

Viele Leute fragen danach . Es sollte einen Grund geben.
ssapkota

Das Löschen von Caches ist praktisch, wenn Sie einige I / O-bezogene Leistungsmessungen durchführen und diese nicht durch O / S-Caching "verderben" möchten
the-wabbit

Antworten:


25

Nun, es gibt eine einfache Möglichkeit, einen Blick auf den Seiten-Cache des Kernels zu werfen, wenn Sie über ftools verfügen. Mit "fincore" erhalten Sie eine Zusammenfassung der Seiten der Dateien, die den Inhalt des Caches darstellen.

Sie müssen eine Liste von Dateinamen angeben, um zu überprüfen, ob sie im Seiten-Cache vorhanden sind. Dies liegt daran, dass die in den Seitencachetabellen des Kernels gespeicherten Informationen nur Datenblockreferenzen und keine Dateinamen enthalten. fincorewü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 den umgekehrten Vorgang - 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 über die Blöcke jeder einzelnen Datei Bescheid wissen möchten, die im Seiten-Cache gespeichert sind, müssen Sie eine Liste aller Dateien in Ihrem Dateisystem (Ihren Dateisystemen) angeben fincore. Aber dies würde wahrscheinlich die Messung verderben, da eine große Datenmenge durch die Verzeichnisse gelesen und alle Inodes und indirekten Blöcke abgerufen werden würde - sie werden in den Seiten-Cache gestellt und genau die Seiten-Cache-Daten, die Sie untersuchen wollten, werden entfernt.


fincore informiert, ob sich eine Datei im Cache befindet oder nicht. Es gibt jedoch ein Tool, das alle zwischengespeicherten Dateien auflistet (fincore verwendet den Dateinamen als Eingabe und sucht. Ich möchte alle derzeit zwischengespeicherten Einträge untersuchen)
Joe,

@Joe Ich nehme an, dass die in den Seiten-Cache-Tabellen des Kernels gespeicherten Informationen nur Datenblockreferenzen und keine Dateinamen enthalten. fincorewü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, der das Gegenteil bewirkt. Wenn ein Dateiname zu einem Datenblock gehört, müssen alle Inodes und indirekten Blöcke im Dateisystem gelesen werden. Daher ist es algorithmisch besser, eine Liste aller Dateien in Ihrem Dateisystem bereitzustellen, fincorewenn Sie diese Informationsstufe wirklich benötigen.
the-wabbit

@ the-wabbit Danke.
Joe

@ Joe Leider bin ich nicht so tief in Kernel-Interna, um eine maßgebliche Antwort zu diesem Thema zu geben. Der Seiten-Cache scheint generisch genug zu sein, um andere Datentypen als nur Dateisystem-Datenblöcke zwischenzuspeichern, aber mir sind keine Beispiele bekannt.
the-wabbit

1
Die Haltung von StackExchange, was mit veralteten Antworten zu tun ist, ist etwas zweideutig. Das Löschen oder wesentliche Ändern akzeptierter Antworten ist verpönt. Wenn Sie diese Antwort ändern, um vmtouch zu empfehlen, wird die vorhandene Antwort von @ ewwhite mit einer ähnlichen Anzahl von positiven Stimmen dupliziert. Also sollte es den Trick machen, einfach die Antwort von ewwhite weiter nach oben zu stimmen, oder?
The-Wabbit

19

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 in den Cache zu sperren.

[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

Jetzt kann ich es in den Cache "tippen".

[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

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

[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

Ich schreibe ein sehr einfaches Shell-Skript, um die zwischengespeicherten Dateien mithilfe von Linux-Fincore anzuzeigen. Da der Cache ein Teil des Speichers ist, wird in meinem Code die Top-10-RSZ-Verwendung des Prozesses ermittelt, und mithilfe von lsof werden die Dateien ermittelt, die geöffnet wurden. 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}

1
Die Menge der Dateien im Cache wird normalerweise viel größer sein als die kleine Teilmenge der aktuell geöffneten Dateien (es sei denn, der Cache-Speicherplatz ist klein). Die aktuell geöffneten Dateien sind höchstwahrscheinlich im Cache vorhanden (es sei denn, diese waren lange inaktiv oder der Cache wurde kürzlich bereinigt). Hinweis: Es werden lsofauch Dateien gemeldet, die dem Prozessadressraum zugeordnet sind (und nicht unbedingt zwischengespeichert werden müssen). Auch wahrscheinlich, dass ein großer Teil der Dateien nur teilweise / spärlich zwischengespeichert wird ...
Vlad


2

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

Das erste Argument ist der Speicherort des zu analysierenden Dateisystems und das zweite Argument 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}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.