लिनक्स में, फ्री कमांड द्वारा बताए गए "बफ़र्स" और "कैश" में क्या अंतर है?


73

यह एक पुराना प्रश्न है जिसे मैंने समय-समय पर देखा है। इसके बारे में मेरी समझ सीमित है (बहुत समय पहले मतभेदों के बारे में पढ़ना, लेकिन इसमें शामिल factoid (एस) वास्तव में कभी अटका नहीं है)।

जैसा मुझे समझ में आया,

  • बफ़र

    सक्रिय I / O परिचालनों के साथ कार्यक्रमों द्वारा उपयोग किया जाता है, अर्थात डिस्क पर लिखे जाने के लिए प्रतीक्षा की जा रही डेटा

  • कैश

    क्या पूर्ण I / O परिचालनों का परिणाम है, अर्थात बफ़र्स जो फ़्लश हो गए हैं या डिस्क से डेटा पढ़ने के लिए एक अनुरोध को पूरा करना है।

क्या मुझे पश्चात की स्पष्ट व्याख्या मिल सकती है?



यह मेटाडेटा की तरह है जो आपको बफ़र्स में मिलता है, यह io बफ़र्स से संबंधित नहीं है। कर्नेल बफ़र्स में से कुछ स्लैब एलोकेटर के लिए जिम्मेदार होते हैं, लेकिन बफ़र्स या कैश मेमोरी में बिलकुल भी नहीं होते हैं।
Eckes

जवाबों:


42

"कैश्ड" कुल में कुछ अन्य मेमोरी आवंटन भी शामिल होंगे, जैसे कि किसी भी tmpfs फाइलाइट। इसे प्रभाव में देखने के लिए प्रयास करें:

mkdir t
mount -t tmpfs none t
dd if=/dev/zero of=t/zero.file bs=10240 count=10240
sync; echo 3 > /proc/sys/vm/drop_caches; free -m
umount t
sync; echo 3 > /proc/sys/vm/drop_caches; free -m

और आपको "कैश" मूल्य ड्रॉप 100Mb द्वारा दिखाई देगा जिसे आपने रैम-आधारित फाइलसिस्टम में कॉपी किया था (यह मानते हुए कि पर्याप्त मुक्त रैम था, आप पा सकते हैं कि यह स्वैप में समाप्त हो गया है अगर मशीन पहले से ही अधिक प्रतिबद्ध है स्मृति उपयोग के)। फ्री में प्रत्येक कॉल से पहले "सिंक; इको 3> / proc / sys / vm / drop_caches" सभी राइट बफ़र्स (सिंक) में लंबित कुछ भी लिखना चाहिए और मेमोरी से सभी कैश्ड / बफ़र्ड डिस्क ब्लॉक को खाली करना चाहिए ताकि केवल अन्य ही पढ़ रहे हों "कैशेड" मान में आवंटन।

वर्चुअल मशीनों (जैसे VMWare के तहत चलने वाले) द्वारा उपयोग की जाने वाली RAM को मुफ्त में "कैश्ड" मूल्य में भी गिना जा सकता है, जैसा कि वर्तमान में खुली मेमोरी मैप्ड फ़ाइलों द्वारा उपयोग की जाने वाली RAM होगी (यह आपके द्वारा उपयोग किए जा रहे हाइपरवाइजर / संस्करण के आधार पर भिन्न होगी) संभवतः कर्नेल संस्करणों के बीच भी)।

तो यह उतना आसान नहीं है जितना "बफ़र्स ने लंबित फ़ाइल / नेटवर्क लिखते हैं और भविष्य में भौतिक रीड्स को बचाने के लिए रैम में हाल ही में पढ़े / लिखे ब्लॉकों को गिना है", हालांकि अधिकांश प्रयोजनों के लिए यह सरल वर्णन करेगा।


1
दिलचस्प बारीकियों के लिए +1। इस तरह की जानकारी मुझे मिल रही है। वास्तव में, मुझे संदेह है कि आंकड़े बहुत जटिल हैं, इतने सारे विभिन्न गतिविधियों में शामिल हैं, कि वे सबसे अच्छे सामान्य संकेतक हैं।
अवन पायने

मुझे नहीं लगता कि वर्चुअल मशीनों द्वारा उपयोग की जाने वाली RAM को "कैशेड" के रूप में गिना जाता है, कम से कम qemu-kvm के लिए। मुझे लगता है कि मेरे KVM होस्ट पर, कैश मान न केवल सही होने के लिए छोटा है (1.9 गिग पर), लेकिन अगर मैं अपने एक वीएम को नष्ट / शुरू कर दूं तो यह नहीं बदलता है। अगर मैं VMs में से किसी एक पर tmpfs माउंट ट्रिक करता हूं तो यह भी नहीं बदलता है। मैंने वहां 800Meg का tmpfs विभाजन बनाया और "कैशेड" ने VM पर उचित मान दिखाए लेकिन यह VM होस्ट पर परिवर्तित नहीं हुआ। लेकिन "यूज्ड" वैल्यू सिकुड़ने / बढ़ने पर मैंने अपने वीएम को नष्ट / शुरू कर दिया।
माइक एस

... मैंने एक सेंटोस 7.2.1511 वीएम होस्ट कर्नेल 3.10.0-327 पर परीक्षण चलाया।
माइक एस

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

@ माइक: "वीएम में से एक पर tmpfs माउंट ट्रिक प्रदर्शन करने के संबंध में" - मैं मेजबान रीडिंग को प्रभावित नहीं करूंगा यदि वे वीएम द्वारा उपयोग किए गए अन्य मेम नहीं दिखा रहे हैं। मुझे केवीएम वीएम में ही प्रभाव दिखाई देता है: dd free = 2020 से पहले, dd free = 1899 के बाद, ड्रॉप fs मुक्त होने के बाद = 2001 (19Mb का अंतर VM पर अन्य प्रक्रियाओं के कारण होगा, यह बेकार नहीं था जब हम इसे डाउनलोड करते हैं। कसौटी)। होस्ट परिवर्तन को नहीं देख सकता है: मेमोरी शायद अभी भी वीएम को आवंटित की गई है, भले ही यह वीएम में प्रक्रियाओं द्वारा उपयोग के लिए स्वतंत्र हो।
डेविड स्पिललेट 12

8

टेढ़ा प्रश्न। जब आप मुक्त स्थान की गणना करते हैं तो आपको वास्तव में बफर और कैश दोनों को जोड़ना होगा। यह वही है जो मैं पा सकता था

एक बफर एक ऐसी चीज है जिसे अभी तक डिस्क पर "लिखा" जाना है। एक कैश कुछ ऐसा है जिसे डिस्क से "पढ़ा" गया है और बाद में उपयोग के लिए संग्रहीत किया गया है।

http://visualbasic.ittoolbox.com/documents/difference-between-buffer-and-cache-12135


5

मैं बफर के बारे में अधिक स्पष्ट विवरण की तलाश में था और मुझे इसमें मिला "Professional Linux® Kernel Architecture 2008"

अध्याय 16: पृष्ठ और बफर कैश

इंटरेक्शन

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


3

द्वारा समझाया RedHat :

कैश पेज:

एक कैश मेमोरी का हिस्सा है जो पारदर्शी रूप से डेटा को स्टोर करता है ताकि भविष्य में उस डेटा के लिए अनुरोध तेजी से परोसा जा सके। इस मेमोरी का उपयोग कर्नेल डिस्क डेटा को कैश करने और i / o प्रदर्शन को बेहतर बनाने के लिए किया जाता है।

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

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

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

SysV साझा मेमोरी खंडों को भी कैश के रूप में जाना जाता है, हालांकि वे डिस्क पर किसी भी डेटा का प्रतिनिधित्व नहीं करते हैं। एक साझा स्मृति खंडों के आकार की जाँच कर सकते हैं, जो ipcs-m कमांड का उपयोग करके और बाइट्स कॉलम की जाँच कर रहे हैं।

बफ़र:

बफ़र्स उस डेटा का डिस्क ब्लॉक प्रतिनिधित्व है जो पेज कैश के तहत संग्रहीत है। बफ़र्स में फ़ाइलों / डेटा का मेटाडेटा होता है जो पेज कैश के अंतर्गत रहता है। उदाहरण: जब पृष्ठ कैश में मौजूद किसी भी डेटा का अनुरोध होता है, तो पहले कर्नेल बफ़र में डेटा की जाँच करता है जिसमें मेटाडेटा होता है जो पृष्ठ कैश में निहित वास्तविक फ़ाइलों / डेटा को इंगित करता है। एक बार मेटाडेटा से फ़ाइल का वास्तविक ब्लॉक पता ज्ञात हो जाता है, इसे प्रोसेसिंग के लिए कर्नेल द्वारा उठाया जाता है।


2

बफर / कैश को मुक्त करना

चेतावनी यह एक मजबूत तरीका है जो उत्पादन सर्वर पर अनुशंसित नहीं है! तो आपको चेतावनी दी जाती है कि अगर कुछ गलत हुआ तो मुझे दोष मत देना।

समझने के लिए, इस बात के लिए, आप अपने सिस्टम को कैश्ड फ़ाइल को छोड़ने की तुलना में अधिक से अधिक मेमोरी को सौंपने के लिए बाध्य कर सकते हैं cache:

प्रस्तावना

परीक्षण करने से पहले, आप एक और विंडो को हिट कर सकते हैं:

$ vmstat -n 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  1  39132  59740  39892 1038820    0    0     1     0    3    3  5 13 81  1
 1  0  39132  59140  40076 1038812    0    0   184     0 10566 2157 27 15 48 11
...

वास्तविक समय में स्वैप के विकास के लिए।

नोट: आपको वर्तमान निर्देशिका पर कई डिस्क मुक्त होना चाहिए, आपके पास मेम + स्वैप है

डेमो
$ free
         total       used       free     shared    buffers     cached
Mem:       2064396    2004320      60076          0      90740     945964
-/+ buffers/cache:     967616    1096780
Swap:      3145720      38812    3106908

$ tot=0
$ while read -a line;do
      [[ "${line%:}" =~ ^(Swap|Mem)Total$ ]] && ((tot+=2*${line[1]}))
    done </proc/meminfo
$ echo $tot
10420232

$ dd if=/dev/zero of=veryBigFile count=$tot
10420232+0 records in
10420232+0 records out
5335158784 bytes (5.3 GB) copied, 109.526 s, 48.7 MB/s

$ cat >/dev/null veryBigFile

$ free
             total       used       free     shared    buffers     cached
Mem:       2064396    2010160      54236          0      41568    1039636
-/+ buffers/cache:     928956    1135440
Swap:      3145720      39132    3106588

$ rm veryBigFile 

$ free
         total       used       free     shared    buffers     cached
Mem:       2064396    1005104    1059292          0      41840      48124
-/+ buffers/cache:     915140    1149256
Swap:      3145720      39132    3106588

नोटा, जो मैंने किया है उस पर होस्ट का दृढ़ता से उपयोग किया जाता है। यह वास्तव में शांत मशीन पर अधिक महत्वपूर्ण होगा।


1
-1 अगर मैं कर सकता था। यह दोनों (ए) पूछे गए प्रश्न के लिए अप्रासंगिक है और (बी) कैश निकासी को ट्रिगर करने का एक भयानक रूप से कुंद बल बल है। उत्तरार्द्ध करने के लिए प्रत्यक्ष तरीके मौजूद हैं, इसलिए सिस्टम को डेटा के साथ स्पैमिंग द्वारा अनुपालन करने में इसे धोखा देने के लिए संवेदनशील नहीं है, जब तक कि यह एक साइड-इफेक्ट के रूप में फ्लश न हो जाए
underscore_d

हे भगवान! कृपया वास्तविक सर्वर पर कभी ऐसा न करें!
तामरला

@Tamerlaha मैं सहमत हूं, लेकिन कृपया पहले पैराग्राफ को फिर से पढ़ें: आपको चेतावनी दी गई है, मुझे दोष न दें ! इसका लक्ष्य बफर / कैश निहितार्थ दिखाना है।
एफ। होरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.