Voici la sortie de free -m
:
total used free shared buffers cached
Mem: 7188 6894 294 0 249 5945
-/+ buffers/cache: 698 6489
Swap: 0 0 0
Je peux voir presque 6GB
(5945 Mo) de mémoire sur 7GB
est utilisé dans la mise en cache des fichiers. Je sais comment vider les caches. Ma question est: Est-il possible de voir quels fichiers (ou inodes) sont mis en cache?
Eh bien, il y a un moyen facile de jeter un oeil au cache de page 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, seules les informations stockées dans les tables de cache de pages du noyau contiendront 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é par le biais de données inode et rechercherait les entrées respectives dans les tables de cache de pages.
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 la lecture de tous les inodes et blocs indirects du système de fichiers. Si vous avez besoin de connaître les blocs de chaque fichier stockés dans le cache de pages, vous devez fournir une liste de tous les fichiers de votre ou vos systèmes de fichiers à fincore
. Mais cela risque également de gâcher la mesure, car une grande quantité de données serait lue en parcourant les répertoires et en obtenant tous les inodes et blocs indirects - en les mettant dans le cache de pages et en expulsant les données du cache de pages que vous essayez d'examiner.
Vous pouvez utiliser tilitaire vmtouch pour voir si un fichier ou un répertoire nommé est dans le cache. Vous pouvez également utiliser l'outil pour forcer des éléments dans le cache ou les verrouiller dans le cache.
[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
Maintenant, je peux le "toucher" dans le cache.
[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
Maintenant, pour voir combien est mis en cache ...
[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
J'écris un script Shell très simple pour montrer les fichiers mis en cache en utilisant linux-fincore. Étant donné que le cache est une partie de la mémoire, mon code est de trouver le top 10 des utilisations RSZ du processus, et d'utiliser lsof pour trouver les fichiers ouverts par le processus, enfin utiliser linux-fincore pour savoir si ces fichiers sont mis en cache ou non.
Veuillez me corriger si je pense 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}
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 (N premiers 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}
Vous pouvez également utiliser pcstat (Page Cache Stat) https://github.com/tobert/pcstat
J'espère que cela aide quelqu'un.