Czy można wyświetlić listę buforowanych plików?

29

Oto wynik free -m:

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

Widzę prawie 6GB(5945 MB) wolnej pamięci 7GBużywanej do buforowania plików. Wiem, jak opróżniać skrzynki. Moje pytanie brzmi: czy można zobaczyć, które pliki (lub i-węzły) są buforowane?

ssapkota
źródło
Nie znam odpowiedzi, ale dwie rzeczy są interesujące: Jak opróżniasz skrzynki? Dlaczego jest to interesujące, nie sugeruję niczego tutaj - po prostu interesuje mnie przypadek użycia
serverhorror
2
Wypłukuje to zarówno buffersi cached: sysctl -w vm.drop_caches=3. Przed użyciem możesz przeczytać więcej na ten temat. Czasami jest to po prostu potrzebne. Jest dostępny - to powinien być kolejny powód :)
ssapkota,
Wiele osób o to prosi . Powinien być jakiś powód.
ssapkota
upuszczenie bufory jest przydatny, jeśli chcesz zrobić pomiary wydajności niektórych I / O związany i nie chcą mieć je „zepsute” przez O / S buforowania
the-Wabbit

Odpowiedzi:

25

Cóż, nie jest to łatwy sposób, aby spojrzeć na widoku pamięci podręcznej jądra, jeśli zdarzy się, że ftools - „fincore” daje pewne podsumowanie informacji na temat tego, co strony Files' jest zawartość pamięci podręcznej.

Musisz podać listę nazw plików, aby sprawdzić ich obecność w pamięci podręcznej strony. Jest tak, ponieważ informacje przechowywane w tabelach pamięci podręcznej stron jądra będą zawierać tylko odwołania do bloków danych, a nie nazwy plików. fincorerozwiązuje bloki danych danego pliku poprzez dane i-węzłów i szuka odpowiednich wpisów w tabelach pamięci podręcznej stron.

Nie ma wydajnego mechanizmu wyszukiwania umożliwiającego wykonanie operacji odwrotnej - uzyskanie nazwy pliku należącej do bloku danych wymagałoby odczytania wszystkich i-węzłów i bloków pośrednich w systemie plików. Jeśli chcesz wiedzieć o blokach każdego pliku przechowywanych w pamięci podręcznej stron, musisz podać listę wszystkich plików w systemie plików fincore. Ale to znowu może zepsuć pomiar, ponieważ duża ilość danych byłaby czytana przez katalogi i uzyskiwanie wszystkich i-węzłów i bloków pośrednich - umieszczanie ich w pamięci podręcznej strony i eksmisja danych z pamięci podręcznej strony, które próbujesz zbadać.

the-wabbit
źródło
fincore informuje, czy plik jest obecny w pamięci podręcznej, czy nie. Czy jest jednak jakieś narzędzie, które wyświetli listę wszystkich plików, które są buforowane (fincore bierze nazwę pliku jako dane wejściowe i wyszukuje. Chcę przejrzeć wszystkie wpisy, które są obecnie buforowane)
Joe
@Joe Przypuszczam, że informacje przechowywane w tabelach pamięci podręcznej stron jądra będą zawierać tylko odwołania do bloków danych, a nie nazwy plików. fincorerozwiązuje bloki danych danego pliku poprzez dane i-węzłów i szuka odpowiednich wpisów w tabelach pamięci podręcznej stron. Nie ma wydajnego mechanizmu wyszukiwania odwrotnego - uzyskanie nazwy pliku należącej do bloku danych wymagałoby odczytania wszystkich i-węzłów i bloków pośrednich w systemie plików. W związku z tym algorytmicznie lepiej będzie dostarczyć listę wszystkich plików w systemie plików, fincorejeśli naprawdę potrzebujesz tego poziomu informacji.
the-wabbit
@ the-wabbit Thanks. Oprócz plików istnieją inne rzeczy, które są częścią pamięci podręcznej, takie jak deskryptory, pamięć współużytkowana itp.
Joe
@Joe Niestety, nie jestem tak głęboko w jądrach jądra, aby udzielić wiarygodnej odpowiedzi na ten temat. Pamięć podręczna strony wydaje się wystarczająco ogólna, aby buforować inne typy danych niż tylko bloki danych systemu plików, ale nie znam żadnych przykładów.
the-wabbit
1
Stanowisko StackExchange dotyczące tego, co zrobić z przestarzałymi odpowiedziami, jest nieco niejednoznaczne. Usunięcie lub istotna zmiana zaakceptowanych odpowiedzi jest niezadowolona. Zmiana tej odpowiedzi na zalecenie vmtouch spowoduje skopiowanie istniejącej odpowiedzi @ ewwhite, która ma podobną liczbę głosów pozytywnych. Więc po prostu dalsze poprawianie odpowiedzi ewwhite powinno załatwić sprawę, prawda?
the-wabbit
19

Za pomocą narzędzia vmtouch można sprawdzić, czy nazwany plik lub katalog znajduje się w pamięci podręcznej. Możesz także użyć tego narzędzia, aby wymusić elementy w pamięci podręcznej lub zablokować je w pamięci podręcznej.

[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

Teraz mogę „dotknąć” go do pamięci podręcznej.

[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

Teraz sprawdź, ile kosztuje pamięć podręczna ...

[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
źródło
3

Piszę bardzo prosty skrypt powłoki, aby pokazać buforowane pliki za pomocą linux-fincore. Ponieważ pamięć podręczna jest jedną z części pamięci, mój kod znajduje 10 najlepszych zastosowań procesu w RSZ, a użycie lsof do znalezienia otwartych plików, w końcu użyj linux-fincore, aby dowiedzieć się, czy pliki te są buforowane, czy nie.

Popraw mnie, jeśli się mylę.

#!/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
źródło
1
Zestaw plików w pamięci podręcznej zwykle będzie znacznie większy niż niewielki podzbiór obecnie otwartych (chyba że pamięć podręczna jest niewielka). Aktualnie otwarte pliki najprawdopodobniej znajdują się w pamięci podręcznej (chyba że były długo nieaktywne lub pamięć podręczna została niedawno wyczyszczona). Uwaga: lsofzgłasza także pliki odwzorowane na przestrzeń adresową procesu (i niekoniecznie buforowane). Prawdopodobnie również duża część plików będzie tylko częściowo / rzadko buforowana ...
Vlad
2

Możesz także użyć pcstat (stat pamięci podręcznej strony) https://github.com/tobert/pcstat

Mam nadzieję, że to komuś pomoże.

blavoie
źródło
2

Napisałem następujący skrypt, który drukuje wszystkie pliki i ich stan pamięci podręcznej za pomocą polecenia pcstat. Jest to samodzielny skrypt dla systemów Linux x86_64. W razie potrzeby pobiera pcstat.

Pierwszy argument to lokalizacja systemu plików do analizy, a drugi argument to liczba wyników (Top N według liczby stron w pamięci podręcznej).

#!/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
źródło