Frage 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(5945MB) Speicher aus 7GB wird beim 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?


21
2018-06-08 20:03


Ursprung


Ich kenne die Antwort nicht, aber 2 Dinge sind von Interesse: Wie spülen Sie die Caches? Warum ist das interessant? Ich will hier nichts andeuten - nur Interesse am Anwendungsfall - serverhorror
Dies spült sowohl die buffers und cached: sysctl -w vm.drop_caches=3. Vielleicht möchten Sie mehr darüber lesen, bevor Sie es verwenden. Manchmal ist es nur nötig. Es ist verfügbar - das sollte ein anderer Grund sein :) - ssapkota
Viele Leute sind Danach fragen. Es sollte einen Grund geben. - ssapkota
Das Ablegen von Caches ist praktisch, wenn Sie einige E / A-bezogene Leistungsmessungen durchführen möchten und nicht durch O / S-Caching "verdorben" werden möchten - the-wabbit


Antworten:


Gut dort ist eine einfache Möglichkeit, sich den Seitencache des Kernels anzuschauen, wenn Sie gerade dabei sind ftools - "fincore" gibt Ihnen einige zusammenfassende Informationen darüber, welche Dateiseiten der Inhalt des Cache sind.

Sie müssen eine Liste mit Dateinamen angeben, um zu prü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 gegebenen Datei durch Inode-Daten auflösen und nach entsprechenden Einträgen in den Seiten-Cache-Tabellen suchen.

Es gibt keinen effizienten Suchmechanismus, um das Umgekehrte auszuführen - das Abrufen eines Dateinamens, der zu einem Datenblock gehört, würde das Lesen aller Inodes und indirekten Blöcke auf dem Dateisystem erfordern. Wenn Sie über die Blöcke jeder einzelnen Datei im Seitencache wissen müssen, müssen Sie eine Liste aller Dateien in Ihrem Dateisystem angeben fincore. Aber das wiederum wird wahrscheinlich die Messung verderben, da eine große Menge an Daten durch die Verzeichnisse gelesen werden würde und alle Inodes und indirekten Blöcke erhalten würden - sie in den Seitencache setzen und genau die Seitencachedaten löschen, die Sie untersuchen wollten.


18
2018-06-09 08:24



Dies ist eine wirklich tolle Soße. Vielen Dank! - Cobra_Fast
fincore informiert, wenn eine Datei im Cache vorhanden ist oder nicht. Gibt es jedoch ein Tool, das alle Dateien auflistet, die zwischengespeichert sind (Fincore nimmt den Dateinamen als Eingabe und sucht. Ich möchte in alle Einträge suchen, die derzeit zwischengespeichert werden) - Joe
@Joe Ich nehme an, dass die Informationen, die nur in den Seiten-Cache-Tabellen des Kernels gespeichert sind, Datenblockreferenzen und keine Dateinamen enthalten. fincore würde die Datenblöcke einer gegebenen Datei durch Inode-Daten auflösen und nach entsprechenden Einträgen in den Seiten-Cache-Tabellen suchen. Es gibt keinen effizienten Suchmechanismus, der das Umgekehrte durchführt - das Abrufen eines Dateinamens, der zu einem Datenblock gehört, würde das Lesen aller Inodes und indirekten Blöcke auf dem Dateisystem erfordern. Daher sollten Sie algorithmisch eine Liste aller Dateien in Ihrem Dateisystem bereitstellen fincore wenn Sie dieses Informationsniveau wirklich brauchen. - the-wabbit
@ the-wabbit Danke. Außer Dateien gibt es noch andere Dinge, die Teil des Cache sind, wie Deskriptoren, Shared Memory usw. - Joe
@Joe Leider bin ich nicht so tief in Kernel Internals, um eine autoritative Antwort zu diesem Thema zu geben. Der Seitencache scheint generisch genug zu sein, um andere Arten von Daten als nur Dateisystemdatenblöcke zwischenzuspeichern, aber mir sind keine Beispiele bekannt. - the-wabbit


Du kannst den ... benutzen vmtouch-Dienstprogramm um zu sehen, ob sich eine benannte Datei oder ein Verzeichnis im Cache befindet. Sie können das Tool auch verwenden, um Objekte in den Cache zu zwingen oder sie im 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 "berühren".

[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

Jetzt zu sehen, wie viel im Cache 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

12
2017-11-12 13:13





Ich schreibe ein sehr einfaches Shell-Skript, um die zwischengespeicherten Dateien unter Verwendung von linux-fincore anzuzeigen. Da Cache ist ein Teil des Speichers, ist mein Code die Top 10 RSZ Nutzung des Prozesses zu finden, und die Verwendung lsof, um die Dateien, die geöffnet zu finden, herauszufinden, 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
2018-06-08 07:52



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, sie waren lange inaktiv oder der Cache wurde kürzlich bereinigt). Hinweis: lsof Protokolliert auch Dateien, die dem Prozessadressraum zugeordnet sind (und nicht notwendigerweise zwischengespeichert werden). Es ist auch wahrscheinlich, dass ein großer Teil der Dateien nur teilweise / spärlich zwischengespeichert wird ... - Vlad


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

Hoffe es hilft jemandem.


1
2018-01-06 14:16





Ich habe folgendes Skript geschrieben, das alle Dateien und ihren Cache-Status mit dem Befehl pcstat ausgibt. Es ist ein eigenständiges Skript für x86_64 Linux-Systeme. Es lädt pcstat bei Bedarf herunter.

Das erste Argument ist der zu analysierende Dateisystemstandort und das zweite Argument ist die Nummer des Ergebnisses (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}

1
2018-02-16 13:40