Önbelleğe alınmış dosyaları listelemek mümkün mü?


29

İşte çıktısı free -m:

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

Neredeyse 6GB(5945MB) belleğin 7GBdosyaların önbelleğe alınmasında kullanıldığını görebiliyorum. Önbellekleri nasıl temizleyeceğimi biliyorum. Sorum şu: Hangi dosyaların (veya inode'ların) önbellekte saklandığını görmek mümkün mü?


Cevabı bilmiyorum ama 2 şey ilgi çekici: Önbellekleri nasıl temizlersiniz? Neden bu ilgilenmiyor, burada hiçbir şey ima etmiyorum - sadece kullanım durumuyla ilgileniyorum
serverhorror

2
Bu hem buffersve cached: hem de temizler sysctl -w vm.drop_caches=3. Kullanmadan önce, daha fazla okumak isteyebilirsiniz. Bazen onun sadece gerekli. Kullanılabilirliği - bu başka bir sebep olmalı :)
ssapkota

Bir çok insan bunu istiyor . Bir nedeni olmalı.
ssapkota

bırakma önbellekleri, bazı G / Ç ile ilgili performans ölçümleri yapmak ve bunları O / S önbelleklemesi tarafından "şımarık" yapmak istemiyorsanız kullanışlıdır
the-wabbit

Yanıtlar:


25

Öyleyse, var olan sen için ne varsa çekirdeğin sayfa cache bakmak için kolay bir yol ftools - "fincore" Size dosyaları sayfaları önbellek içeriğidir ilgili bazı özet bilgiler verir.

Sayfa önbelleğindeki varlıklarını kontrol etmek için bir dosya adı listesi sağlamanız gerekir. Bunun nedeni, çekirdeğin sayfa önbellek tablolarında depolanan bilgilerin yalnızca veri bloğu başvurularını içereceği, dosya adlarını içermeyeceğidir. fincorebelirli bir dosyanın veri bloklarını inode verileri aracılığıyla çözer ve sayfa önbellek tablolarındaki ilgili girişleri arar.

Tersini yapmak için etkili bir arama mekanizması yoktur - bir veri bloğuna ait bir dosya adını almak, dosya sistemindeki tüm inode'ları ve dolaylı blokları okumayı gerektirir. Sayfa önbelleğinde saklanan her bir dosyanın bloklarını bilmeniz gerekiyorsa, dosya sisteminizdeki tüm dosyaların bir listesini sağlamanız gerekir fincore. Ancak bu, ölçümü büyük miktarda veri dizinleri geçip okuduktan sonra tüm düğümleri ve dolaylı blokları almak - bunları sayfa önbelleğine yerleştirmek ve incelemeye çalıştığınız sayfa önbellek verisini çıkarmak gibi - okuyacağından dolayı, bozulma olasılığı yüksektir.


Bir dosya önbellekte olup olmadığını fincore bildirir. Ancak, önbelleğe alınmış tüm dosyaları listeleyen herhangi bir araç var mı (fincore dosya adını giriş ve arama olarak alır. Şu anda önbelleğe alınmış olan tüm girişleri incelemek istiyorum)
Joe

@Joe Çekirdeğin sayfa önbellek tablolarında depolanan bilgilerin yalnızca dosya bloğu referanslarını içerdiğini, dosya adlarını içerdiğini sanıyorum. fincorebelirli bir dosyanın veri bloklarını inode verileri aracılığıyla çözer ve sayfa önbellek tablolarındaki ilgili girişleri arar. Tersini yapan etkin bir arama mekanizması yoktur - bir veri bloğuna ait bir dosya ismi almak, dosya sistemindeki tüm inode'ları ve dolaylı blokları okumayı gerektirir. Bu nedenle, algoritma fincoregereği, gerçekten bu düzeyde bir bilgiye ihtiyaç duyarsanız , dosya sisteminizdeki tüm dosyaların bir listesini sağlamaktan daha iyi olursunuz.
the wabbit 12:14

@ the-wabbit Teşekkürler. Dosyalar dışında, tanımlayıcılar, paylaşılan bellek vb. Gibi önbelleğin bir parçası olan başka şeyler var mı
Joe

@Joe Ne yazık ki, bu konuda yetkili bir cevap vermek için Çekirdek iç adamlarının derinliklerinde değilim. Sayfa önbelleği, yalnızca dosya sistemi veri bloklarından başka veri türlerini önbelleğe alacak kadar genel görünüyor, ancak herhangi bir örnek bilmiyorum.
WABBT

1
StackExchange , eskimiş cevaplarla ne yapılacağı konusundaki tutumu biraz belirsizdir. Kabul edilen cevapları silmek veya büyük ölçüde değiştirmek üzerine kaşlarını çattı. Vmtouch 'u önermek için bu cevabı değiştirmek, @ ewwhite'ın, benzer sayıda oy sayısına sahip olan mevcut cevabını çoğaltacaktır. Öyleyse, daha beyaz olanın cevabını daha da kızdırmak, hile yapmak değil mi?
the wabbit

19

Sen kullanabilirsiniz vmtouch yarar adlandırılmış dosya veya dizin önbellekte olup olmadığını görmek için. Aracı ayrıca öğeleri önbelleğe zorlamak veya önbelleğe kilitlemek için kullanabilirsiniz.

[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

Şimdi önbelleğe "dokunabilirim".

[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

Şimdi ne kadarının önbellekte saklandığını görmek için ...

[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 kullanarak önbelleğe alınmış dosyaları göstermek için çok basit bir kabuk betiği yazıyorum. Önbellek hafızanın bir parçası olduğundan, kodum işlemin ilk 10 RSZ kullanımını ve açılan işlem dosyalarını bulmak için lsof işlevini kullanır, nihayet bu dosyaların önbellekte saklanıp saklanmadığını bulmak için linux-fincore kullanılır.

Yanlış düşünüyorsam lütfen beni düzelt.

#!/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
Önbellekteki dosya kümesi, genellikle açık olanların küçük alt kümesinden çok daha büyük olacaktır (önbellek alanı küçük değilse). Açık olan dosyalar büyük olasılıkla önbellekte bulunur (uzun süre boşta olmayanlar veya önbellek yakın zamanda temizlenmediyse). Not: lsofayrıca işlem-adres-alanı ile eşlenen dosyaları da bildirir (ve mutlaka önbelleğe alınmaz). Büyük olasılıkla dosyaların büyük bir kısmı sadece kısmen / seyrek olarak önbelleğe alınacak ...
Vlad


2

Pcstat komutunu kullanarak tüm dosyaları ve önbellek durumlarını basan aşağıdaki betiği yazdım. X86_64 linux sistemler için kendi kendine yeten script. Gerekirse pcstat indirir.

İlk argüman analiz edilecek dosya sistemi konumu ve ikinci argüman sonuç sayısıdır (önbellekteki sayfa sayısına göre 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}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.