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


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

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

  • बफ़र

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

  • कैश

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

क्या मुझे वंशावली के लिए स्पष्ट स्पष्टीकरण मिल सकता है?


68
2018-06-10 15:46


मूल


stackoverflow.com/questions/6345020/... - Ciro Santilli 新疆改造中心 六四事件 法轮功
यह मेटाडेटा की तरह है जो आपको बफर में मिलता है, यह आईओ बफर से संबंधित नहीं है। कर्नेल बफर में से कुछ को स्लैब आवंटक में माना जाता है लेकिन बफर या कैश मेमोरी पर गिनती नहीं है। - eckes


जवाब:


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

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

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

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

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


41
2018-06-10 16:26



दिलचस्प बारीकियों के लिए +1। यह वह जानकारी है जिसे मैं ढूंढ रहा हूं। असल में, मुझे संदेह है कि आंकड़े इतने शांत हैं, इसलिए कई अलग-अलग गतिविधियों में शामिल हैं, कि वे सबसे अच्छे सामान्य संकेतक हैं। - Avery Payne
मुझे नहीं लगता कि वर्चुअल मशीनों द्वारा उपयोग की जाने वाली रैम को कम से कम qemu-kvm के लिए "कैश" के रूप में गिना जाता है। मैंने देखा है कि मेरे केवीएम होस्ट पर, कैश वैल्यू न केवल सही होने के लिए बहुत छोटा है (1.9 गीग पर), लेकिन अगर मैं अपने वीएम को नष्ट / शुरू करता हूं तो यह नहीं बदलेगा। अगर मैं वीएम में से किसी एक पर tmpfs माउंट चाल करता हूं तो यह भी नहीं बदलेगा। मैंने वहां एक 800 मेग tmpfs विभाजन बनाया और "कैश्ड" ने वीएम पर उचित मान दिखाए लेकिन यह वीएम होस्ट पर नहीं बदला। लेकिन जब मैंने अपना वीएम नष्ट / शुरू किया तो "प्रयुक्त" मूल्य घट गया / बढ़ गया। - Mike S
... मैंने एक केंद्र 7.2.1511 वीएम मेजबान कर्नेल 3.10.0-327 पर परीक्षण चलाया। - Mike S
@ माइकएस: स्मृति वर्चुअलाइजेशन समाधान कैसे अलग-अलग वर्चुअलाइजेशन समाधान भिन्न होते हैं, वास्तव में कर्नेल विभिन्न संस्करणों के बीच मेमोरी के विभिन्न उपयोगों को कैसे माप सकता है। - David Spillett
@ माइकस: "वीएम में से किसी एक पर tmpfs माउंट चाल" करने के संबंध में - मैं मेजबान रीडिंग को प्रभावित नहीं करूंगा यदि वे वीएम द्वारा उपयोग किए जाने वाले अन्य ज्ञापन को नहीं दिखा रहे हैं। मुझे एक केवीएम वीएम में प्रभाव दिखाई देता है: डीडी फ्री = 2020 से पहले, डीडी फ्री = 18 99 के बाद, ड्रॉप एफएस फ्री = 2001 के बाद (1 9 एमबी अंतर वीएम पर अन्य प्रक्रियाओं के कारण होगा, जब मैं भाग गया तो यह निष्क्रिय नहीं था कसौटी)। मेजबान परिवर्तन को नहीं देख सकता है: स्मृति अभी भी वीएम को आवंटित की गई है, भले ही यह वीएम में प्रक्रियाओं के उपयोग के लिए स्वतंत्र है। - David Spillett


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

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

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


8
2018-06-11 12:01





मैं बफर के बारे में अधिक स्पष्ट विवरण ढूंढ रहा था और मुझे मिला "Professional Linux Kernel Architecture 2008"

अध्याय 16: पेज और बफर कैश

इंटरेक्शन

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


5
2018-01-23 08:07





बफर / कैश फ्रीिंग

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

समझने के लिए, चीज, आप कर सकते हैं बल आपकी प्रणाली जितनी संभव हो उतनी मेमोरी को प्रतिनिधि देने के लिए 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
...

वास्तविक समय में स्वैप के विकास के बाद।

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

डेमो
$ 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

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


2
2018-02-25 13:41



-1 अगर मैं कर सकता था। यह दोनों (ए) पूछे गए प्रश्न के लिए अप्रासंगिक है और (बी) कैश क्लीयरेंस ट्रिगर करने का एक बहुत ही ब्लंट-फोर्स तरीका है। उत्तरार्द्ध करने के प्रत्यक्ष तरीके मौजूद हैं, इसलिए यह डेटा के साथ स्पैमिंग करके अनुपालन में सिस्टम को चालित करने के लिए रक्षात्मक नहीं है जब तक कि यह दुष्प्रभाव के रूप में फ़्लश न हो जाए - underscore_d
हे भगवान! असली सर्वर पर कभी ऐसा न करें! - tamerlaha
@ टामरलाहा मैं सहमत हूं, लेकिन कृपया 1 अनुच्छेद दोबारा पढ़ें: आपको चेतावनी दी गई है, मुझे दोष मत दो! इसका लक्ष्य बफर / कैश निहितार्थ दिखाना है। - F. Hauri


द्वारा समझाया गया लाल टोपी:

कैश पेजेस:

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

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

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

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

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

बफर:

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


2
2017-10-14 20:36