GNU/Linux >> Tutoriales Linux >  >> Linux

¿Es posible enumerar los archivos que se almacenan en caché?

Solución 1:

Bueno, hay hay una manera fácil de echar un vistazo a la memoria caché de la página del kernel si tiene ftools:"fincore" le brinda información resumida sobre qué páginas de archivos son el contenido de la memoria caché.

Deberá proporcionar una lista de nombres de archivo para comprobar 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 páginas del kernel solo contendrá referencias a bloques de datos y no nombres de archivos. fincore resolverí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 cada archivo almacenados en el caché de la página, deberá proporcionar una lista de todos los archivos en su(s) sistema(s) de archivos a fincore . Pero eso nuevamente es probable que arruine la medición, ya que se leería una gran cantidad de datos atravesando los directorios y obteniendo todos los inodos y bloques indirectos, colocándolos en el caché de la página y expulsando los mismos datos del caché de la página que estaba tratando de examinar.

Solución 2:

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

[[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

Ahora puedo "tocarlo" en el caché.

[[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

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

[[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

Solución 3:

Escribo un script de shell muy simple para mostrar los archivos almacenados en caché mediante el uso de linux-fincore. Dado que el 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 encontrar los archivos que procesan abierto, finalmente use linux-fincore para averiguar si estos archivos están almacenados 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}

Solución 4:

También puede usar pcstat (Estadística de caché de página) https://github.com/tobert/pcstat

Espero que ayude a alguien.

Solución 5:

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}

Linux
  1. [Linux]:¡Cómo copiar archivos/directorios sin sobrescribir los archivos que ya están copiados!

  2. 7zip, Xz, Gzip, Tar, etc., ¿cuáles son las diferencias?

  3. ¿Cómo se interpretan los paréntesis en la línea de comandos?

  4. ¿Qué comando se usa para ordenar la lista de archivos/carpetas por tiempo?

  5. ¿Es posible agregar el disco actual que está arrancando?

Cómo editar archivos PDF en Linux de la manera más fácil posible

6 distribuciones de Linux inspiradas en la apariencia de macOS

Cómo encontrar recursivamente y enumerar los archivos por fecha en Linux

¿Se supone que debemos eliminar manualmente el contenido de /tmp?

Eliminar archivos que se enumeran en un archivo de texto

Búsqueda de archivos que utilizan la mayor cantidad de espacio en disco