Soluzione 1:
Beh, c'è un modo semplice per dare un'occhiata alla cache delle pagine del kernel se ti capita di avere ftools - "fincore" ti dà alcune informazioni di riepilogo su quali pagine dei file sono il contenuto della cache.
Sarà necessario fornire un elenco di nomi di file per verificarne la presenza nella cache della pagina. Questo perché le informazioni memorizzate nelle tabelle della cache delle pagine del kernel conterranno solo riferimenti a blocchi di dati e non nomi di file. fincore
risolverà i blocchi di dati di un determinato file tramite i dati inode e cercherà le rispettive voci nelle tabelle della cache della pagina.
Non esiste un meccanismo di ricerca efficiente per fare il contrario:ottenere un nome di file appartenente a un blocco di dati richiederebbe la lettura di tutti gli inode e dei blocchi indiretti sul file system. Se hai bisogno di conoscere i blocchi di ogni singolo file memorizzati nella cache della pagina, dovresti fornire un elenco di tutti i file sul tuo file system a fincore
. Ma anche questo potrebbe rovinare la misurazione poiché una grande quantità di dati verrebbe letta attraversando le directory e ottenendo tutti gli inode e i blocchi indiretti, inserendoli nella cache della pagina e rimuovendo gli stessi dati della cache della pagina che stavi cercando di esaminare.
Soluzione 2:
È possibile utilizzare l'utilità vmtouch per vedere se un file o una directory con nome si trova nella cache. Puoi anche utilizzare lo strumento per forzare gli elementi nella cache o bloccarli nella cache.
[[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
Ora posso "toccarlo" nella cache.
[[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
Ora per vedere quanto è memorizzato nella cache...
[[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
Soluzione 3:
Scrivo uno script di shell molto semplice per mostrare i file memorizzati nella cache utilizzando linux-fincore. Poiché la cache è una parte della memoria, il mio codice è trovare i primi 10 utilizzi RSZ del processo e utilizzare lsof per scoprire i file che elaborano aperto, infine usa linux-fincore per scoprire se questi file sono memorizzati nella cache o meno.
Per favore correggimi se sto pensando male.
#!/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}
Soluzione 4:
Puoi anche usare pcstat (Page Cache Stat)https://github.com/tobert/pcstat
Spero che aiuti qualcuno.
Soluzione 5:
Ho scritto il seguente script che stampa tutti i file e il loro stato della cache usando il comando pcstat. È uno script autonomo per i sistemi Linux x86_64. Scarica pcstat se necessario .
Il primo argomento è la posizione del filesystem da analizzare e il secondo argomento è il numero di risultati (primi N per numero di pagine nella 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}