Можно ли перечислить файлы, которые кэшируются?

29

Вот вывод free -m:

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

Я вижу, что почти 6GB(5945 МБ) памяти 7GBиспользуется для кэширования файлов. Я знаю, как очистить тайники. Мой вопрос: возможно ли увидеть, какие файлы (или inode) кэшируются?

ssapkota
источник
Я не знаю ответа, но интересны 2 вещи: как вы очищаете кеш? Почему это интересно, я ничего здесь не
намекаю
2
Это смывает как buffersи cached: sysctl -w vm.drop_caches=3. Возможно, вы захотите прочитать больше об этом, прежде чем использовать. Иногда это просто необходимо. Его доступно - это должно быть еще одна причина :)
ssapkota
Многие люди просят об этом . Должна быть какая-то причина.
ссапкота
сброс кэшей полезен, если вы хотите провести измерения производительности, связанные с вводом / выводом, и не хотите, чтобы они были «испорчены» кэшированием O / S
the-wabbit

Ответы:

25

Ну, это простой способ взглянуть на страницы кэша ядра , если вам посчастливилось иметь ftools - «fincore» дает некоторую краткую информацию о том, какие страницы файлов которых являются содержание кэша.

Вам нужно будет предоставить список имен файлов, чтобы проверить их наличие в кэше страниц. Это связано с тем, что информация, хранящаяся только в таблицах кэша страниц ядра, будет содержать ссылки на блоки данных, а не имена файлов. fincoreбудет разрешать блоки данных данного файла через данные inode и искать соответствующие записи в таблицах кэша страниц.

Не существует эффективного механизма поиска для обратного - получение имени файла, принадлежащего блоку данных, потребует чтения всех inode и косвенных блоков в файловой системе. Если вам нужно знать о блоках каждого отдельного файла, хранящихся в кэше страниц, вам нужно будет предоставить список всех файлов в вашей файловой системе fincore. Но это, опять же, может испортить измерение, поскольку большое количество данных будет считываться через каталоги и получать все иноды и косвенные блоки - помещать их в кеш страниц и извлекать те самые данные кеша страниц, которые вы пытались исследовать.

заместитель Wabbit
источник
fincore сообщает, присутствует ли файл в кеше или нет. Тем не менее, есть ли инструмент, который будет перечислять все файлы, которые кэшируются (fincore принимает имя файла в качестве ввода и ищет. Я хочу просмотреть все записи, которые в настоящее время кэшируются)
Joe
@ Joe Я полагаю, что информация, хранящаяся только в таблицах кэша страниц ядра, будет содержать ссылки на блоки данных, а не имена файлов. fincoreбудет разрешать блоки данных данного файла через данные inode и искать соответствующие записи в таблицах кэша страниц. Не существует эффективного механизма поиска, который бы делал обратное - получение имени файла, принадлежащего блоку данных, потребовало бы чтения всех inode и косвенных блоков в файловой системе. Таким образом, алгоритмически вам будет лучше предоставить список всех файлов в вашей файловой системе, fincoreесли вам действительно нужен этот уровень информации.
The Wabbit
@ the-wabbit Спасибо. Кроме файлов, есть ли другие вещи, которые являются частью кеша, такие как дескрипторы, разделяемая память и т. Д.
Joe
@Joe К сожалению, я не настолько глубоко разбираюсь во внутренностях ядра, чтобы дать авторитетный ответ на эту тему. Кеш страниц кажется достаточно общим, чтобы кэшировать другие типы данных, а не только блоки данных файловой системы, но я не знаю ни одного примера.
the-wabbit
1
Позиция StackExchange относительно того, что делать с устаревшими ответами , несколько двусмысленна. Удаление или существенное изменение принятых ответов осуждается. Изменение этого ответа на рекомендацию vmtouch приведет к дублированию существующего ответа @ ewwhite, который имеет такое же количество голосов. Так что просто дальнейшее голосование с ответом ewwhite должно сработать, верно?
Вабб
19

Вы можете использовать утилиту vmtouch, чтобы увидеть, находится ли именованный файл или каталог в кеше. Вы также можете использовать инструмент для принудительного помещения элементов в кэш или блокировки их в кеше.

[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

Теперь я могу «прикоснуться» к нему в кеш.

[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

Теперь, чтобы увидеть, сколько кэшируется ...

[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
ewwhite
источник
3

Я пишу очень простой сценарий оболочки, чтобы показать кэшированные файлы с помощью linux-fincore. Поскольку кэш-память является одной из частей памяти, мой код состоит в том, чтобы найти 10 самых популярных процессов, используемых RSZ, и использовать lsof для определения файлов, которые открыли процесс, и, наконец, использовать linux-fincore, чтобы определить, кэшированы ли эти файлы или нет.

Пожалуйста, поправьте меня, если я ошибаюсь.

#!/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}
Шанкер Ли
источник
1
Набор файлов в кеше, как правило, будет намного больше, чем небольшое подмножество открытых в настоящее время (если только пространство кеша не мало). Открытые в данный момент файлы, скорее всего, присутствуют в кеше (если только они не простаивали или кэш не был недавно очищен). Примечание: lsofтакже сообщает о файлах, сопоставленных с адресным пространством процесса (и не обязательно кэшированных). Также вероятно, что большая доля файлов будет только частично / редко кэшироваться ...
Влад
2

Я написал следующий скрипт, который печатает все файлы и их состояние кеша с помощью команды pcstat. Это автономный скрипт для систем x86_64 linux. Он загружает pcstat, если это необходимо.

Первый аргумент - это местоположение файловой системы для анализа, а второй аргумент - это номер результата (Top N по количеству страниц в кеше).

#!/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}
Nadddy
источник