GNU/Linux >> Tutoriels Linux >  >> Linux

Est-il possible de lister les fichiers mis en cache ?

Solution 1 :

Eh bien, il existe un moyen simple de jeter un coup d'œil au cache de pages du noyau si vous avez ftools - "fincore" vous donne des informations récapitulatives sur les pages de fichiers qui constituent le contenu du cache.

Vous devrez fournir une liste de noms de fichiers pour vérifier leur présence dans le cache de pages. En effet, les informations stockées dans les tables de cache de page du noyau ne contiendront que des références de blocs de données et non des noms de fichiers. fincore résoudrait les blocs de données d'un fichier donné via les données d'inode et rechercherait les entrées respectives dans les tables de cache de page.

Il n'y a pas de mécanisme de recherche efficace pour faire l'inverse - obtenir un nom de fichier appartenant à un bloc de données nécessiterait de lire tous les inodes et blocs indirects sur le système de fichiers. Si vous avez besoin de connaître les blocs de chaque fichier stocké dans le cache de page, vous devez fournir une liste de tous les fichiers de votre système de fichiers à fincore . Mais cela risque encore de gâcher la mesure car une grande quantité de données serait lue en traversant les répertoires et obtenant tous les inodes et blocs indirects - en les plaçant dans le cache de page et en supprimant les données de cache de page que vous essayiez d'examiner.

Solution 2 :

Vous pouvez utiliser l'utilitaire vmtouch pour voir si un fichier ou un répertoire nommé est en cache. Vous pouvez également utiliser l'outil pour forcer des éléments dans le cache ou les verrouiller dans le 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

Maintenant, je peux le "toucher" dans le 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

Maintenant, pour voir combien est en 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

Solution 3 :

J'écris un script shell très simple pour afficher les fichiers mis en cache à l'aide de linux-fincore. Puisque le cache est une partie de la mémoire, mon code est de trouver les 10 principales utilisations RSZ du processus et l'utilisation de lsof pour trouver les fichiers qui traitent ouverts, utilisez enfin linux-fincore pour savoir si ces fichiers sont en cache ou non.

Veuillez me corriger si je me trompe.

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

Solution 4 :

Vous pouvez également utiliser pcstat (Page Cache Stat)https://github.com/tobert/pstat

J'espère que cela aide quelqu'un.

Solution 5 :

J'ai écrit le script suivant qui imprime tous les fichiers et leur état de cache à l'aide de la commande pcstat. Il s'agit d'un script autonome pour les systèmes Linux x86_64. Il télécharge pcstat si nécessaire.

Le premier argument est l'emplacement du système de fichiers à analyser et le deuxième argument est le nombre de résultats (Top N par nombre de pages dans le 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. Utilisez le terminal Linux pour voir quels fichiers se trouvent sur votre ordinateur

  2. Linux - Comment vider les tampons et le cache sur un système Linux ?

  3. Outil pour obtenir les lignes d'un fichier qui ne sont pas dans un autre ?

  4. Lister les fichiers accessibles par un programme ?

  5. 7zip, Xz, Gzip, Tar, etc. - Quelles sont les différences ??

Comment éditer des fichiers PDF sous Linux de la manière la plus simple possible

6 distributions Linux inspirées de l'aspect et de la convivialité de macOS

Comment rechercher et répertorier récursivement les fichiers par date sous Linux

Sommes-nous censés supprimer manuellement le contenu de /tmp ?

Supprimer les fichiers répertoriés dans un fichier texte

Comment lister l'arborescence des périphériques du noyau