GNU/Linux >> Linux Esercitazione >  >> Linux

È possibile elencare i file memorizzati nella cache?

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}

Linux
  1. [Linux]:come copiare file/directory senza sovrascrivere i file che sono già stati copiati!

  2. 7zip, Xz, Gzip, Tar, ecc:quali sono le differenze??

  3. Come vengono interpretate le parentesi sulla riga di comando?

  4. Quale comando viene utilizzato per ordinare l'elenco di file/cartelle in base all'ora?

  5. nm :comando per elencare i simboli nei file oggetto.

Usa il terminale Linux per vedere quali file sono sul tuo computer

Come modificare i file PDF in Linux nel modo più semplice possibile

6 distribuzioni Linux ispirate all'aspetto grafico di macOS

Come trovare ed elencare in modo ricorsivo i file per data in Linux

Ricerca di file che utilizzano la maggior parte dello spazio su disco

Come elencare l'albero dei dispositivi del kernel