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

Здесь вывод free -m:

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

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

21 голос | спросил ssapkota 9 J0000006Europe/Moscow 2011, 00:03:16

4 ответа


18

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

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

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

ответил the-wabbit 9 J0000006Europe/Moscow 2011, 12:24:54
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}
ответил Shanker lee 8 J0000006Europe/Moscow 2016, 10:52:19
1

Вы также можете использовать pcstat (Stat Cache Stat) https://github.com/tobert/pcstat

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

ответил blavoie 6 Jpm1000000pmFri, 06 Jan 2017 17:16:51 +030017 2017, 17:16:51
1

Я написал следующий скрипт, который печатает все файлы и их статус в кеше с помощью команды pcstat. Это автономный скрипт для Linux-систем x86_64. Он загружает 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 16 FebruaryEurope/MoscowbFri, 16 Feb 2018 16:40:27 +0300000000pmFri, 16 Feb 2018 16:40:27 +030018 2018, 16:40:27

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132