Apakah mungkin untuk membuat daftar file yang di-cache?


29

Di sini output dari free -m:

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

Saya dapat melihat hampir 6GB(5945MB) kehabisan memori 7GBdigunakan dalam caching file. Saya tahu cara membersihkan cache. Pertanyaan saya adalah: Apakah mungkin melihat file (atau inode) mana yang sedang di-cache?


Saya tidak tahu jawabannya tetapi ada 2 hal yang menarik: Bagaimana Anda menyiram cache? Mengapa itu menarik, saya tidak menyiratkan apa pun di sini - hanya tertarik pada use case
serverhorror

2
Ini flushes baik buffersdan cached: sysctl -w vm.drop_caches=3. Anda mungkin ingin membaca lebih lanjut tentangnya, sebelum menggunakan. Terkadang itu hanya dibutuhkan. Ini tersedia - ini harus menjadi alasan lain :)
ssapkota

Banyak orang yang memintanya . Harus ada beberapa alasan.
ssapkota

menjatuhkan cache berguna jika Anda ingin melakukan beberapa pengukuran kinerja terkait I / O dan tidak ingin mereka "dimanjakan" oleh cache O / S
the-wabbit

Jawaban:


25

Nah, ada adalah cara mudah untuk melihat pada tembolok halaman kernel jika Anda kebetulan memiliki ftools - "fincore" memberikan beberapa ringkasan informasi tentang apa halaman file adalah isi dari cache.

Anda harus menyediakan daftar nama file untuk memeriksa keberadaannya di cache halaman. Ini karena informasi yang disimpan dalam tabel cache halaman kernel hanya akan berisi referensi blok data dan bukan nama file. fincoreakan menyelesaikan blok data file yang diberikan melalui data inode dan mencari entri masing-masing dalam tabel cache halaman.

Tidak ada mekanisme pencarian yang efisien untuk melakukan sebaliknya - mendapatkan nama file yang dimiliki oleh blok data akan memerlukan membaca semua inode dan blok tidak langsung pada sistem file. Jika Anda perlu tahu tentang setiap blok file yang disimpan dalam cache halaman, Anda harus menyediakan daftar semua file pada sistem file Anda fincore. Tapi itu lagi kemungkinan akan merusak pengukuran karena sejumlah besar data akan dibaca melintasi direktori dan mendapatkan semua inode dan blok tidak langsung - menempatkan mereka ke dalam cache halaman dan mengusir data cache halaman yang Anda coba periksa.


fincore menginformasikan apakah ada file dalam cache atau tidak. Namun, apakah ada alat yang akan mencantumkan semua file yang di-cache (fincore mengambil nama file sebagai input dan pencarian. Saya ingin melihat semua entri yang saat ini di-cache)
Joe

@ Jo. Saya kira bahwa informasi yang disimpan dalam tabel cache halaman kernel hanya akan berisi referensi blok data dan bukan nama file. fincoreakan menyelesaikan blok data file yang diberikan melalui data inode dan mencari entri masing-masing dalam tabel cache halaman. Tidak ada mekanisme pencarian yang efisien melakukan kebalikan - mendapatkan nama file milik blok data akan memerlukan membaca semua inode dan blok tidak langsung pada sistem file. Dengan demikian, secara algoritmik Anda akan lebih baik menyediakan daftar semua file pada sistem file fincoreAnda jika Anda benar-benar membutuhkan tingkat informasi ini.
the-wabbit

@ the-wabbit Terima kasih. Selain file, apakah ada hal lain yang merupakan bagian dari cache, seperti deskriptor, memori bersama, dll.
Joe

@ Jo Sayangnya, saya tidak terlalu jauh ke internal Kernel untuk memberikan jawaban yang otoritatif tentang topik ini. Cache halaman tampaknya cukup umum untuk men-cache jenis data lain dari sekadar blok data sistem file, tetapi saya tidak mengetahui adanya contoh.
the-wabbit

1
Sikap StackExchange tentang apa yang harus dilakukan dengan jawaban yang sudah usang agak ambigu. Menghapus atau secara substansial mengubah jawaban yang diterima disukai. Mengubah jawaban ini untuk merekomendasikan vmtouch akan menggandakan jawaban @ ewwhite yang ada, yang memiliki jumlah upvotes yang serupa. Jadi, hanya dengan meningkatkan lebih lanjut jawaban ewwhite harus melakukan trik, bukan?
the-wabbit

19

Anda dapat menggunakan utilitas vmtouch untuk melihat apakah file atau direktori bernama dalam cache. Anda juga dapat menggunakan alat untuk memaksa item ke dalam cache atau menguncinya ke dalam cache.

[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

Sekarang saya bisa "menyentuhnya" ke dalam cache.

[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

Sekarang untuk melihat berapa banyak yang di-cache ...

[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

Saya menulis skrip shell yang sangat sederhana untuk menampilkan file-file yang di-cache dengan menggunakan linux-fincore. Karena cache adalah salah satu bagian dari memori, kode saya adalah menemukan 10 besar penggunaan proses RSZ, dan penggunaan lsof untuk mengetahui file yang dibuka, akhirnya gunakan linux-fincore untuk mengetahui apakah file-file ini di-cache atau tidak.

Harap perbaiki saya jika saya salah berpikir.

#!/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
Set file dalam cache biasanya akan jauh lebih besar daripada subset kecil yang saat ini terbuka (kecuali ruang cache kecil). File yang saat ini terbuka kemungkinan besar ada dalam cache (kecuali jika file itu lama tidak digunakan atau cache baru saja dibersihkan). Catatan: lsofjuga melaporkan file yang dipetakan ke dalam ruang-proses-alamat (dan tidak harus di-cache). Kemungkinan besar juga sebagian besar file hanya akan di-cache sebagian / jarang ...
Vlad


2

Saya menulis skrip berikut yang mencetak semua file dan status cache mereka menggunakan perintah pcstat. Ini adalah skrip mandiri untuk sistem linux x86_64. Ini mengunduh pcstat jika diperlukan.

Argumen pertama adalah lokasi sistem file untuk dianalisis dan argumen kedua adalah jumlah hasil (Top N dengan jumlah halaman dalam cache).

#!/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}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.