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}