È possibile elencare i file memorizzati nella cache?


29

Ecco l'output di free -m:

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

Riesco a vedere quasi 6GB(5945 MB) memoria esaurita 7GButilizzata nella memorizzazione nella cache dei file. So come svuotare le cache. La mia domanda è: è possibile vedere quali file (o inode) vengono memorizzati nella cache?


Non conosco la risposta, ma 2 cose sono interessanti: come si fa a svuotare la cache? Perché è quello di interesse, non sto insinuando nulla qui - solo interessato al caso d'uso
serverhorror

2
Questo svuota sia la bufferse cached: sysctl -w vm.drop_caches=3. Potresti voler leggere di più su di esso, prima di utilizzare. A volte è solo necessario. È disponibile - questo dovrebbe essere un altro motivo :)
ssapkota

Molte persone lo chiedono . Dovrebbe esserci qualche motivo.
ssapkota,

rilasciare la cache è utile se si desidera eseguire alcune misurazioni delle prestazioni relative agli I / O e non si desidera che vengano "rovinate" dalla cache di O / S
the-wabbit

Risposte:


25

Beh, non v'è un modo semplice per dare un'occhiata al cache della pagina del kernel, se vi capita di avere FTOOLS - "fincore" fornisce alcune informazioni di sintesi sulle quali pagine Files' sono il contenuto della cache.

Dovrai fornire un elenco di nomi di file per verificarne la presenza nella cache della pagina. Questo perché le informazioni memorizzate nelle tabelle della cache della pagina del kernel conterranno solo riferimenti a blocchi di dati e non nomi di file. fincorerisolverebbe i blocchi di dati di un determinato file tramite i dati di inode e cercherebbe le rispettive voci nelle tabelle della cache delle pagine.

Non esiste un meccanismo di ricerca efficiente per fare il contrario: ottenere un nome file appartenente a un blocco dati richiederebbe la lettura di tutti gli inode e dei blocchi indiretti sul file system. Se è necessario conoscere i singoli blocchi di file memorizzati nella cache della pagina, è necessario fornire un elenco di tutti i file sui file system su fincore. Ma ciò rischia di 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 ed eliminando i dati della cache della pagina che stavi cercando di esaminare.


fincore informa se un file è presente nella cache o meno. Tuttavia, esiste uno strumento che elencherà tutti i file memorizzati nella cache (fincore prende il nome del file come input e cerca. Voglio esaminare tutte le voci che sono attualmente memorizzate nella cache)
Joe,

@Joe Suppongo che le informazioni memorizzate nelle tabelle della cache della pagina del kernel conterranno solo riferimenti a blocchi di dati e non nomi di file. fincorerisolverebbe i blocchi di dati di un determinato file tramite i dati di inode e cercherebbe le rispettive voci nelle tabelle della cache delle pagine. Non esiste un meccanismo di ricerca efficiente che faccia il contrario: ottenere un nome file appartenente a un blocco dati richiederebbe la lettura di tutti gli inode e dei blocchi indiretti sul file system. Quindi, algoritmicamente, sarà meglio fornire un elenco di tutti i file sul proprio file system fincorese si necessita davvero di questo livello di informazioni.
the-wabbit,

@ the-wabbit Grazie. Oltre ai file, ci sono altre cose che fanno parte della cache, come descrittori, memoria condivisa, ecc.
Joe,

@Joe Purtroppo, non sono così profondo negli interni del kernel per dare una risposta autorevole su questo argomento. La cache della pagina sembra abbastanza generica da memorizzare nella cache altri tipi di dati oltre ai blocchi di dati del file system, ma non sono a conoscenza di alcun esempio.
the-wabbit,

1
La posizione di StackExchange su cosa fare delle risposte obsolete è piuttosto ambigua. L'eliminazione o la modifica sostanziale delle risposte accettate è disapprovata. La modifica di questa risposta per raccomandare vmtouch duplicherà la risposta esistente di @ ewwhite, che ha un numero simile di voti. Quindi semplicemente migliorare ulteriormente la risposta di ewwhite dovrebbe fare il trucco, giusto?
the-wabbit,

19

È possibile utilizzare l' utilità vmtouch per vedere se un file o una directory con nome è nella cache. È inoltre possibile utilizzare lo strumento per forzare gli elementi nella cache o bloccarli nella cache.

[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

Ora posso "toccarlo" nella cache.

[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

Ora per vedere quanto viene memorizzato nella cache ...

[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

Scrivo uno script shell molto semplice per mostrare i file memorizzati nella cache usando linux-fincore. Dato che la cache è una parte della memoria, il mio codice è trovare i primi 10 processi RSZ del processo e l'uso lsof per scoprire i file che vengono aperti, infine usa linux-fincore per scoprire se questi file sono memorizzati nella cache o meno.

Per favore, correggimi se sbaglio.

#!/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
L'insieme di file nella cache sarà in genere molto più grande del piccolo sottoinsieme di quelli attualmente aperti (a meno che lo spazio della cache non sia piccolo). I file attualmente aperti sono molto probabilmente presenti nella cache (a meno che non fossero a lungo inattivi o la cache è stata recentemente pulita). Nota: lsofriporta anche i file mappati nello spazio degli indirizzi di processo (e non necessariamente nella cache). Probabilmente anche una grande parte dei file sarà solo parzialmente / scarsamente memorizzata nella cache ...
Vlad


2

Ho scritto il seguente script che stampa tutti i file e il loro stato della cache usando il comando pcstat. È uno script autonomo per 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 (N in alto 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}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.