क्या कैश की गई फ़ाइलों को सूचीबद्ध करना संभव है?


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(5945MB) मेमोरी देख सकता हूं 7GBइसका उपयोग फाइलों को कैशिंग करने में किया जाता है। मुझे पता है कि कैश को कैसे फ्लश किया जाता है। मेरा प्रश्न है: क्या यह संभव है कि कौन सी फाइलें (या इनोडेस) कैश की जा रही हैं?


मुझे जवाब नहीं पता, लेकिन 2 चीजें दिलचस्पी की हैं: आप कैश कैसे फ्लश करते हैं? यह दिलचस्पी का विषय क्यों है, मैं यहां कुछ भी नहीं बता रहा हूं - सिर्फ उपयोग के मामले में दिलचस्पी है
सर्वरोड

2
यह buffersऔर cached: दोनों फ्लश करता है sysctl -w vm.drop_caches=3। उपयोग करने से पहले आप इस पर और अधिक पढ़ना चाह सकते हैं। कभी-कभी इसकी बस जरूरत होती है। इसका उपलब्ध - यह एक और कारण होना चाहिए :)
ssapkota 20

बहुत सारे लोग इसके लिए पूछ रहे हैं । कुछ कारण होना चाहिए।
ssapkota

अगर आप कुछ I / O संबंधित प्रदर्शन माप करना चाहते हैं तो ड्रॉपिंग कैश काम आता है और O / S कैशिंग द्वारा उन्हें "खराब" नहीं करना चाहते हैं
Wabbit

जवाबों:


25

ठीक है, कर्नेल के पेज कैश पर एक नज़र डालने का एक आसान तरीका है यदि आपके पास फ़ूल हैं - "फिनकोर" आपको कुछ सारांश जानकारी देता है कि किस फाइल के पेज कैश की सामग्री हैं।

पृष्ठ कैश में उनकी उपस्थिति की जांच करने के लिए आपको फ़ाइल नामों की एक सूची प्रदान करनी होगी। ऐसा इसलिए है क्योंकि कर्नेल के पेज कैश टेबल में संग्रहीत जानकारी में केवल डेटा ब्लॉक संदर्भ होंगे और फाइलनाम नहीं होंगे। fincoreकिसी फ़ाइल के डेटा ब्लॉक को इनकोड डेटा के माध्यम से हल करेगा और पेज कैश टेबल में संबंधित प्रविष्टियों की खोज करेगा।

रिवर्स करने के लिए कोई कुशल खोज तंत्र नहीं है - डेटा ब्लॉक से संबंधित फ़ाइल नाम प्राप्त करने के लिए फ़ाइल सिस्टम पर सभी इनकोड और अप्रत्यक्ष ब्लॉक पढ़ना होगा। यदि आपको पृष्ठ कैश में संग्रहीत हर एक फ़ाइल के ब्लॉक के बारे में जानना है, तो आपको अपने फ़ाइल सिस्टम (ओं) पर सभी फ़ाइलों की एक सूची प्रदान करनी होगी fincore। लेकिन फिर से माप को बिगाड़ने की संभावना है क्योंकि डेटा की एक बड़ी मात्रा को निर्देशिकाओं को ट्रैवर्स करने और सभी इनोडेस और इनडायरेक्ट ब्लॉक प्राप्त करने के लिए पढ़ा जाएगा - उन्हें पेज कैश में डाल दिया जाएगा और बहुत पेज कैश डेटा को जांचने की कोशिश कर रहा है।


अगर कोई फ़ाइल कैश में मौजूद है या नहीं, तो फ़िनकोर सूचित करता है। हालाँकि, कोई भी उपकरण है जो कैश की गई सभी फाइलों को सूचीबद्ध करेगा (फिनकोर फ़ाइल का नाम इनपुट और खोजों के रूप में लेता है। मैं उन सभी प्रविष्टियों पर गौर करना चाहता हूं
जो

@ मुझे लगता है कि कर्नेल के पेज कैश टेबल में संग्रहीत जानकारी में केवल डेटा ब्लॉक संदर्भ होंगे और फ़ाइल नाम नहीं होंगे। fincoreकिसी दिए गए फ़ाइल के डेटा ब्लॉक को इनकोड डेटा के माध्यम से हल करेगा और पेज कैश टेबल में संबंधित प्रविष्टियों की खोज करेगा। रिवर्स करने के लिए कोई कुशल खोज तंत्र नहीं है - डेटा ब्लॉक से संबंधित फ़ाइल नाम प्राप्त करने के लिए फ़ाइल सिस्टम पर सभी इनडायरेक्ट और अप्रत्यक्ष ब्लॉक पढ़ने की आवश्यकता होगी। इस प्रकार, fincoreयदि आप वास्तव में इस स्तर की जानकारी की आवश्यकता है , तो एल्गोरिथ्म में आप अपने फाइल सिस्टम पर सभी फाइलों की एक सूची की आपूर्ति करना बेहतर होगा ।
वाबबिट

@ वाबेट धन्यवाद। फ़ाइलों के अलावा, क्या अन्य चीजें हैं जो कैश का हिस्सा हैं, जैसे कि डिस्क्रिप्टर, साझा की गई मेमोरी आदि
जो

@ जो दुर्भाग्य से, मैं इस विषय पर एक आधिकारिक जवाब देने के लिए कर्नेल इंटर्नल में उतना गहरा नहीं हूं। पेज कैश केवल फाइल सिस्टम डेटा ब्लॉक की तुलना में अन्य प्रकार के डेटा को कैश करने के लिए पर्याप्त सामान्य लगता है, लेकिन मुझे किसी भी उदाहरण के बारे में पता नहीं है।
वबबिट

1
अप्रचलित उत्तरों के साथ क्या करना है, इस पर StackExchange रुख कुछ अस्पष्ट है। हटाए गए या काफी हद तक स्वीकृत उत्तरों को बदल दिया जाता है। Vmtouch की अनुशंसा करने के लिए इस उत्तर को बदलने से @ ewwhite के मौजूदा उत्तर की नकल हो जाएगी, जिसमें समान संख्या में अपवोट हैं। तो बस आगे evhite के उत्तर को आगे बढ़ाना चाहिए, सही है?
वबबिट

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 आरएसजेड उपयोग का पता लगाता है, और उपयोग की गई फ़ाइलों को खोजने के लिए lsof का उपयोग करता है, जो अंततः खोली गई फाइल-फिनकोर का उपयोग करके पता लगाता है कि ये फाइलें कैश हैं या नहीं।

कृपया मुझे सही करें अगर मैं गलत सोचता हूं।

#!/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रिपोर्ट की गई फाइलों को प्रोसेस-एड्रेस-स्पेस में मैप किया गया (और जरूरी नहीं कि कैश किया गया हो)। इसके अलावा संभावना फ़ाइलों का बड़ा हिस्सा केवल आंशिक रूप से / कम कैश की गई ... होने जा रहा है कि
Vlad


2

मैंने स्क्रिप्ट का अनुसरण करते हुए लिखा जो पीसीएसटैट कमांड का उपयोग करके सभी फाइलों और उनकी कैश स्थिति को प्रिंट करता है। यह x86_64 लिनक्स सिस्टम के लिए स्व-निहित स्क्रिप्ट है। यह जरूरत पड़ने पर pcstat को डाउनलोड करता है।

पहला तर्क फ़ाइल सिस्टम स्थान का विश्लेषण करने के लिए है और दूसरा तर्क परिणाम की संख्या (कैश में पृष्ठों की संख्या से शीर्ष एन) है।

#!/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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.