¿Es posible enumerar los archivos que están en caché?

29

Aquí la salida de free -m:

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

Puedo ver que casi 6GB(5945 MB) de memoria 7GBse usa para almacenar en caché los archivos. Sé cómo vaciar los escondites. Mi pregunta es: ¿es posible ver qué archivos (o inodos) se almacenan en caché?

ssapkota
fuente
No sé la respuesta, pero hay dos cosas de interés: ¿cómo se limpian los cachés? ¿Por qué es interesante? No estoy implicando nada aquí, solo estoy interesado en el caso de uso
Serverhorror
2
Esto limpia tanto la bufferse cached: sysctl -w vm.drop_caches=3. Es posible que desee leer más sobre él, antes de usar. A veces solo es necesario. Está disponible, esta debería ser otra razón :)
ssapkota
Mucha gente lo pide . Debería haber alguna razón.
ssapkota
colocar cachés es útil si desea realizar algunas mediciones de rendimiento relacionadas con E / S y no desea que se "estropeen" con el almacenamiento en caché de O / S
the-wabbit

Respuestas:

25

Bueno, no es una manera fácil de echar un vistazo a la página de caché del núcleo si le sucede que tiene fTools - "fincore" le da cierta información resumida sobre las páginas que los archivos son el contenido de la caché.

Deberá proporcionar una lista de nombres de archivos para verificar su presencia en la memoria caché de la página. Esto se debe a que la información almacenada en las tablas de caché de la página del núcleo solo contendrá referencias de bloques de datos y no nombres de archivos. fincoreresolvería los bloques de datos de un archivo dado a través de datos de inodo y buscaría las entradas respectivas en las tablas de caché de la página.

No existe un mecanismo de búsqueda eficiente para hacer lo contrario: obtener un nombre de archivo que pertenezca a un bloque de datos requeriría leer todos los inodos y bloques indirectos en el sistema de archivos. Si necesita saber acerca de los bloques de todos los archivos almacenados en la memoria caché de la página, deberá proporcionar una lista de todos los archivos en su (s) sistema (s) de archivos fincore. Pero es probable que eso estropee la medición ya que una gran cantidad de datos se leería atravesando los directorios y obteniendo todos los inodos y bloques indirectos, colocándolos en la caché de la página y desalojando los mismos datos de la caché de la página que estaba tratando de examinar.

el wabbit
fuente
fincore informa si un archivo está presente en la memoria caché o no. Sin embargo, ¿hay alguna herramienta que enumere todos los archivos que se almacenan en caché (fincore toma el nombre del archivo como entrada y busca. Quiero ver todas las entradas que están actualmente en caché)
Joe
@ Joe Supongo que la información almacenada en las tablas de caché de la página del núcleo solo contendrá referencias de bloques de datos y no nombres de archivos. fincoreresolvería los bloques de datos de un archivo dado a través de datos de inodo y buscaría las entradas respectivas en las tablas de caché de la página. No existe un mecanismo de búsqueda eficiente que haga lo contrario: obtener un nombre de archivo que pertenezca a un bloque de datos requeriría leer todos los inodos y bloques indirectos del sistema de archivos. Por lo tanto, algorítmicamente será mejor que proporcione una lista de todos los archivos en su sistema de archivos fincoresi realmente necesita este nivel de información.
the-wabbit
@ the-wabbit Gracias. Además de los archivos, ¿hay otras cosas que son parte de la memoria caché, como descriptores, memoria compartida, etc.
Joe
@ Joe Desafortunadamente, no estoy tan metido en lo interno de Kernel para dar una respuesta autorizada sobre este tema. El caché de la página parece lo suficientemente genérico como para almacenar en caché otros tipos de datos además de los bloques de datos del sistema de archivos, pero no conozco ningún ejemplo.
the-wabbit
1
La postura de StackExchange sobre qué hacer con las respuestas obsoletas es algo ambiguo. Eliminar o cambiar sustancialmente las respuestas aceptadas está mal visto. Cambiar esta respuesta para recomendar vmtouch duplicaría la respuesta existente de @ewwhite, que tiene un número similar de votos a favor. Entonces, simplemente votar más por la respuesta de ewwhite debería hacer el truco, ¿verdad?
the-wabbit
19

Puede usar la utilidad vmtouch para ver si un archivo o directorio con nombre está en caché. También puede usar la herramienta para forzar elementos en caché o bloquearlos en caché.

[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

Ahora puedo "tocarlo" en el caché.

[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

Ahora para ver cuánto se almacena en caché ...

[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
ewwhite
fuente
3

Escribo un script de shell muy simple para mostrar los archivos en caché usando linux-fincore. Dado que la memoria caché es una parte de la memoria, mi código es encontrar los 10 principales usos de RSZ del proceso, y el uso de lsof para descubrir los archivos que el proceso abrió, finalmente uso linux-fincore para averiguar si estos archivos están en caché o no.

Por favor corrígeme si estoy pensando mal.

#!/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}
Shanker Lee
fuente
1
El conjunto de archivos en el caché generalmente será mucho más grande que el pequeño subconjunto de los actualmente abiertos (a menos que el espacio en caché sea pequeño). Es probable que los archivos abiertos actualmente estén presentes en la memoria caché (a menos que hayan estado inactivos durante mucho tiempo o la memoria caché se haya limpiado recientemente). Nota: lsoftambién informa los archivos asignados al espacio de direcciones de proceso (y no necesariamente en caché). También es probable que una gran parte de los archivos se almacene en caché parcial / escasamente ...
Vlad
2

Escribí el siguiente script que imprime todos los archivos y su estado de caché usando el comando pcstat. Es un script autónomo para sistemas linux x86_64. Descarga pcstat si es necesario.

El primer argumento es la ubicación del sistema de archivos para analizar y el segundo argumento es el número de resultados (N superior por número de páginas en caché).

#!/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}
Nadddy
fuente