Чи можна перерахувати файли, які кешуються?


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яка використовується, використовується для кешування файлів. Я знаю, як промити схованки. Моє запитання: чи можна побачити, які файли (або вставки) кешуються?


Я не знаю відповіді, але цікавлять 2 речі: як ви промиєте кеші? Чому це цікавить, я тут нічого не маю на увазі - просто зацікавлений у випадку використання
serverhorror

2
Це змиває як buffersі cached: sysctl -w vm.drop_caches=3. Можливо, ви захочете прочитати детальніше про нього, перш ніж використовувати. Іноді це просто потрібно. Є в наявності - це повинна бути ще одна причина :)
ssapkota

Про це просить багато людей . Має бути якась причина.
ssapkota

видалення кеш-пам'яток стане в нагоді, якщо ви хочете зробити деякі вимірювання продуктивності, пов'язані з введенням-виведеннями, і не хочете, щоб вони були «зіпсовані» кешуванням O / S
the wabbit

Відповіді:


25

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

Вам потрібно буде надати список імен файлів, щоб перевірити їх присутність у кеші сторінки. Це відбувається тому, що інформація, що зберігається в таблицях кешу сторінок ядра, буде містити посилання блоку даних, а не назви файлів. fincoreдозволить вирішити блоки даних заданого файлу за допомогою даних inode та шукати відповідні записи в таблицях кешу сторінок.

Не існує ефективного механізму пошуку для зворотного зв'язку - отримання імені файлу, що належить до блоку даних, потребує зчитування всіх входів та непрямих блоків у файловій системі. Якщо вам потрібно знати про всі блоки файлів, що зберігаються в кеш-пам'яті сторінки, вам потрібно буде надати список усіх файлів у вашій файловій системі fincore. Але це, ймовірно, зіпсує вимірювання, оскільки велика кількість даних буде прочитана, проходячи через каталоги та отримуючи всі вставки та непрямі блоки - введення їх у кеш сторінки та вилучення самих даних кешу сторінки, які ви намагалися перевірити.


fincore повідомляє, чи файл присутній у кеші чи ні. Однак чи є який-небудь інструмент, який перелічить усі файли, які є в кешованому режимі (fincore приймає ім'я файлу як вхідний і шукає. Я хочу вивчити всі записи, які зараз кешовані)
Joe

@Joe Я припускаю, що інформація, що зберігається тільки в кеш-таблицях сторінок ядра, буде містити посилання на блок даних, а не назви файлів. fincoreдозволить вирішити блоки даних заданого файлу за допомогою даних inode та шукати відповідні записи в таблицях кешу сторінок. Не існує ефективного механізму пошуку, який би здійснював зворотне значення - для отримання імені файлу, що належить до блоку даних, потрібно було б прочитати всі вставки та непрямі блоки файлової системи. Таким чином, алгоритмічно вам буде краще надавати список усіх файлів у вашій файловій системі, fincoreякщо вам справді потрібен цей рівень інформації.
the wabbit

@ the-wabbit Дякую Окрім файлів, чи є інші речі, що входять до кешу, такі як дескриптори, спільна пам'ять тощо
Joe

@Joe На жаль, я не настільки глибокий в інтернеті Kernel, щоб дати авторитетну відповідь на цю тему. Кеш сторінок здається загальним для кешування інших типів даних, ніж просто блоки даних файлової системи, але я не знаю жодного прикладу.
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

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.

Перший аргумент - це розташування файлової системи для аналізу, а другий аргумент - кількість результату (верхній 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}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.