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}