É possível listar os arquivos que estão em cache?

21

Aqui, a saída de free -m :

             total       used       free     shared    buffers     cached
Mem:          7188       6894        294          0        249       5945
-/+ buffers/cache:        698       6489
Swap:            0          0          0

Eu posso ver quase 6GB (5945MB) de memória de 7GB é usada no armazenamento em cache dos arquivos. Eu sei como liberar os caches. Minha pergunta é: É possível ver quais arquivos (ou inodes) estão sendo armazenados em cache?

    
por ssapkota 08.06.2011 / 22:03

5 respostas

18

Bem, é uma maneira fácil de ver o cache de páginas do kernel se você tiver ftools -" fincore "fornece algumas informações resumidas sobre quais páginas dos arquivos são o conteúdo do cache.

Você precisará fornecer uma lista de nomes de arquivos para verificar sua presença no cache de páginas. Isso ocorre porque as informações armazenadas nas tabelas de cache de páginas do kernel conterão apenas referências de bloco de dados e não nomes de arquivos. fincore resolveria os blocos de dados de um determinado arquivo por meio de dados de inode e procuraria pelas respectivas entradas nas tabelas de cache da página.

Não há mecanismo de busca eficiente para fazer o contrário - obter um nome de arquivo pertencente a um bloco de dados exigiria a leitura de todos os inodes e blocos indiretos no sistema de arquivos. Se você precisar saber sobre os blocos de cada arquivo armazenado no cache de páginas, precisará fornecer uma lista de todos os arquivos em seus sistemas de arquivos para fincore . Mas isso provavelmente estragará a medição, já que uma grande quantidade de dados seria lida nos diretórios e obtendo todos os inodes e blocos indiretos - colocando-os no cache de páginas e expulsando os próprios dados do cache de páginas que você estava tentando examinar.

    
por 09.06.2011 / 10:24
12

Você pode usar o utilitário vmtouch para ver se um arquivo ou diretório nomeado está em cache. Você também pode usar a ferramenta para forçar itens no cache ou bloqueá-los no 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

Agora posso "tocá-lo" no 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

Agora, para ver quanto está armazenado em 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
    
por 12.11.2014 / 14:13
3

Eu escrevo um script de shell muito simples para mostrar os arquivos em cache usando o linux-fincore. Como o cache é uma parte da memória, meu código encontra o top 10 de uso do RSZ, e o uso lsof para descobrir os arquivos que o processo abriu, finalmente use o linux-fincore para descobrir se esses arquivos estão em cache ou não. / p>

Por favor corrija-me se estiver errado.

#!/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}
    
por 08.06.2016 / 09:52
2

Eu escrevi o seguinte script que imprime todos os arquivos e seu status de cache usando o comando pcstat. É um script auto-suficiente para sistemas Linux x86_64. Faz o download do pcstat, se necessário.

Primeiro argumento é a localização do sistema de arquivos para analisar e o segundo argumento é o número de resultados (Top N por número de páginas no 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}
    
por 16.02.2018 / 14:40
1

Você também pode usar pcstat (Page Cache Stat) link

Espero que ajude alguém.

    
por 06.01.2017 / 15:16