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

Я полагаю, что точка LVM должна переместить разделение "один слой" и чтобы это работало лучше всего, это должно знать больше всего, это может о самом физическом диске. Так, один раздел с точки зрения LVM является правильным. Чем больше Вы добавляете, тем больше вариантов Вы удаляете из его управления и менее хорошего, это станет.

Это не о LVM так же как НИКАКОЕ физическое/логичное разделение как это.

29
задан 8 June 2011 в 23:14
5 ответов

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

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

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

25
ответ дан 28 November 2019 в 20:00
  • 1
    fincore действительно сообщает, присутствует ли файл в кэше или нет. Однако есть ли любой инструмент, который перечислит все файлы, которые кэшируются (fincore, берет имя файла в качестве входа и поисков. Я хочу изучить все записи, которые в настоящее время кэшируются), –  Joe 12 November 2014 в 11:06
  • 2
    @Joe я предполагаю, что информация сохранила в kernel' s таблицы кэша страницы только будет содержать ссылки блока данных и не имена файлов. fincore разрешил бы данный file' s блоки данных через inode данные и ищут соответствующие записи в таблицах кэша страницы. Нет никакого эффективного поискового механизма, делающего реверс - получение имени файла, принадлежащего блоку данных, потребовало бы чтения всего inodes и косвенных блоков в файловой системе. Таким образом алгоритмически Вы будете более обеспеченным предоставлением списка всех файлов в Вашей файловой системе к fincore при реальной необходимости в этом уровне информации. –  the-wabbit 12 November 2014 в 13:45
  • 3
    @the-wabbit Спасибо. Кроме файлов, там другие вещи, которые являются частью кэша, такого как дескрипторы, общая память и т.д. –  Joe 12 November 2014 в 17:43
  • 4
    @Joe, К сожалению, я не то, что глубоко во внутренности Ядра для предоставления авторитетного ответа по этой теме. Кэш страницы кажется достаточно универсальным для кэширования других типов данных, чем просто блоки данных файловой системы, но я не знаю ни о каких примерах. –  the-wabbit 13 November 2014 в 12:03

Вы можно использовать утилиту 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
19
ответ дан 28 November 2019 в 20:00

Я пишу очень простой скрипт оболочки, чтобы показать кэшированные файлы с помощью 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}
3
ответ дан 28 November 2019 в 20:00

Вы также можете использовать pcstat (Статистика кэша страниц) https://github.com/tobert/pcstat

Надеюсь, это кому-то поможет.

2
ответ дан 28 November 2019 в 20:00

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

Первый аргумент - это местоположение файловой системы для анализа, а второй аргумент - это номер результата (первые 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}
2
ответ дан 28 November 2019 в 20:00

Теги

Похожие вопросы