Lösung 1:
Nun, es gibt eine einfache Möglichkeit, einen Blick in den Seiten-Cache des Kernels zu werfen, wenn Sie zufällig ftools haben - "fincore" gibt Ihnen einige zusammenfassende Informationen darüber, welche Seiten der Dateien der Inhalt des Caches sind.
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 Page-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, um das Gegenteil zu tun - um einen Dateinamen zu erhalten, der zu einem Datenblock gehört, müssten alle Inodes und indirekten Blöcke im Dateisystem gelesen werden. Wenn Sie über die im Seitencache gespeicherten Blöcke jeder einzelnen Datei Bescheid wissen müssen, müssten Sie fincore
eine Liste aller Dateien in Ihrem Dateisystem/Ihren Dateisystemen bereitstellen . Aber das wird die Messung wahrscheinlich wieder verderben, da eine große Datenmenge gelesen werden würde, die die Verzeichnisse durchquert und alle Inodes und indirekten Blöcke erhält – sie in den Seiten-Cache legt und genau die Seiten-Cache-Daten entfernt, die Sie zu untersuchen versuchten.
Lösung 2:
Sie können das Dienstprogramm vmtouch verwenden, um zu sehen, ob sich eine benannte Datei oder ein 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
Sehen Sie jetzt, 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
Lösung 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, findet mein Code die 10 wichtigsten RSZ-Verwendungen des Prozesses und die Verwendung von lsof, um die Dateien herauszufinden, die verarbeitet werden geöffnet, 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}
Lösung 4:
Sie können auch pcstat (Page Cache Stat)https://github.com/tobert/pcstat
verwendenHoffe es hilft jemandem.
Lösung 5:
Ich habe das folgende Skript geschrieben, das alle Dateien und ihren Cache-Status mit dem Befehl pcstat druckt. Es ist ein eigenständiges Skript für x86_64-Linux-Systeme. Es lädt bei Bedarf pcstat herunter .
Das erste Argument ist der Speicherort des Dateisystems, das analysiert werden soll, 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}