लिनक्स में बफर बनाम कैश मेमोरी के बीच अंतर क्या है?


179

मेरे लिए यह स्पष्ट नहीं है कि दो लिनक्स मेमोरी अवधारणा के बीच क्या अंतर है: bufferऔर cache। मैंने इस पोस्ट के माध्यम से पढ़ा है और मुझे लगता है कि उनके बीच का अंतर समाप्ति नीति है:

  1. बफ़र की नीति फ़र्स्ट-इन, फ़र्स्ट-आउट है
  2. कैश की पॉलिसी कम से कम हाल ही में उपयोग की गई है।

क्या मैं सही हू?

विशेष रूप से, मैं दो आज्ञाओं को देख रहा हूं: freeऔरvmstat

james@utopia:~$ vmstat -S M
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
5  0      0    173     67    912    0    0    19    59   75 1087 24  4 71  1
james@utopia:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          2007       1834        172          0         67        914
-/+ buffers/cache:        853       1153
Swap:         2859          0       2859

यो को हमें अधिक संदर्भ देना चाहिए, दोनों शब्दों का उपयोग अलग-अलग अर्थों के साथ किया जाता है। क्या आप freeकमांड आउटपुट का उल्लेख कर रहे हैं ?
leonbloy

3
आप सही हैं, मैं दो आज्ञाओं को देख रहा हूं: मुक्त, vmstat। मेरे अपडेट देखें।
जेम्स.एक्सयू

जवाबों:


69

"बफ़र्स" दर्शाता है कि रैम का कितना हिस्सा कैश डिस्क ब्लॉक को समर्पित है। "कैश्ड" "बफ़र्स" के समान है, केवल इस बार यह फ़ाइल रीडिंग से पृष्ठों को कैश करता है।

कोट फ़ॉर्म:


3
मैंने इसे एक साधारण अजगर कार्यक्रम का उपयोग करके परीक्षण किया है जो बड़ी मात्रा में ब्लॉक लिखता है। क्या होता है कि कॉलम cacheद्वारा free -w -hनहीं, जैसा कि रिपोर्ट द्वारा भरा जाता है buffers। मुझे लगता है कि cacheकॉलम डिस्क लिखता है और डिस्क पढ़ता है और buffersकुछ और के लिए उपयोग किया जाता है।
CMCDragonkai 5

प्रयोगात्मक सबूत के लिए @CMCDragonkai धन्यवाद। दिलचस्प सवाल यह है कि क्या आप तेजी से लिख रहे थे डिस्क से बाहर फ्लश हो सकता है। (उदाहरण के लिए सिंक में एक लंबा समय लगेगा) जो हमें बताएगा कि गंदे ब्लॉक को साफ की तुलना में अलग तरीके से गिना जाता है। लिनक्स निश्चित रूप से दोनों प्रकारों को कैश करेगा (प्रश्न के अनुसार)
सेठ रॉबर्टसन

179

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

उद्धरण लिंक


1
छोटा और अच्छा समझाया। धन्यवाद।
जिज्ञासु

84

उद्धृत उत्तर (संदर्भ के लिए):

संक्षिप्त उत्तर: कैश्ड पृष्ठ कैश का आकार है। बफ़र इन-मेमोरी ब्लॉक I / O बफ़र्स का आकार है। कैश्ड मामले; बफ़र्स काफी हद तक अप्रासंगिक हैं।

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

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


7
"बफ़र्स काफी हद तक अप्रासंगिक हैं" - नहीं। कई मामले हैं, जहां फ़ाइल सामग्री कैशिंग अप्रासंगिक है, लेकिन मेटाडेटा को कैश में रखने से चीजों को गति मिलती है। उदाहरण के लिए एक वीडियो स्ट्रीमिंग NAS सर्वर।
गनथर पाईज़

बहुत सारी I / O करने वाली कोई भी प्रणाली बफ़र्स के लिए बहुत सारी मेमोरी का उपयोग करेगी। मैं एक 100GB MySQL / InnoDB डेटाबेस को लोड कर रहा हूँ और बफ़र हर समय 2GB से ऊपर जाते हैं।
मार्सेलो पाचेको

21

यह 'काफी' इतना सरल नहीं है, लेकिन यह समझने में मदद कर सकता है:

बफर फ़ाइल मेटाडेटा (अनुमतियाँ, स्थान, आदि) के भंडारण के लिए है। हर मेमोरी पेज को यहाँ ट्रैक किया जाता है।

कैश वास्तविक फ़ाइल सामग्री संग्रहीत करने के लिए है।


5
IOW, बफर = मेटाडेटा; कैश = डेटा;
फ्रीडम_Ben

13

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

कैश पेज:

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

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

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

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

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

बफ़र:

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


12

बफर और कैश।

एक बफर एक ऐसी चीज है जिसे अभी तक डिस्क पर "लिखा" जाना है।

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


2
नया उपयोगकर्ता टिप: अपना उत्तर यथासंभव स्पष्ट रूप से संबंधित प्रश्न के साथ बनाएं। अगर मैं तुम थे, तो मैं आपके जवाब में एक खंड जोड़ दूंगा "तो, आपके उदाहरण के साथ ..." और उस पर थोड़ा विस्तार करें।
पायोत्र वाडस

25
मुझे नहीं लगता कि यह उत्तर उसी संदर्भ में सच है जैसे प्रश्न (अर्थात्, "बफर" और "कैश" के द्वारा लिनक्स कर्नेल का क्या अर्थ है
'21

8

मुझे लगता है कि यह पृष्ठ बफर और कैश के बीच के अंतर को गहराई से समझने में मदद करेगा। http://www.tldp.org/LDP/sag/html/buffer-cache.html

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

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

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


यह बताता है कि बफर कैश क्या है, लेकिन नहीं क्या अंतर vmstat और मुफ्त कमांड के आउटपुट में बफर और कैश के बीच है।
रोएल श्रोएवेन

4

सेठ रॉबर्टसन के लिंक 2 ने कहा "उन शर्तों को पूरी तरह से समझने के लिए, रॉबर्ट एम। लव द्वारा लिनक्स कर्नेल डेवलपमेंट जैसी लिनक्स कर्नेल पुस्तक देखें।"

मुझे पुस्तक के दूसरे संस्करण में 'बफर' के बारे में कुछ सामग्री मिली।

यद्यपि भौतिक डिवाइस स्वयं सेक्टर स्तर पर पता करने योग्य है, फिर भी कर्नेल सभी डिस्क संचालन को ब्लॉक के संदर्भ में करता है।

जब एक ब्लॉक मेमोरी में संग्रहीत किया जाता है (कहते हैं, एक पढ़ने के बाद या एक लेखन लंबित), यह एक 'बफर' में संग्रहीत होता है। प्रत्येक 'बफर' ठीक एक ब्लॉक से जुड़ा होता है। 'बफर' उस ऑब्जेक्ट के रूप में कार्य करता है जो मेमोरी में डिस्क ब्लॉक का प्रतिनिधित्व करता है।

एक 'बफर' एकल भौतिक डिस्क ब्लॉक की इन-मेमोरी प्रतिनिधित्व है।

ब्लॉक I / O ऑपरेशन एक बार में एक ही डिस्क ब्लॉक में हेरफेर करते हैं। एक सामान्य ब्लॉक I / O ऑपरेशन इनोड को पढ़ना और लिखना है। कर्नेल ब्रेड () डिस्क से एकल ब्लॉक के निम्न-स्तरीय रीड को करने के लिए फ़ंक्शन प्रदान करता है। 'बफ़र्स' के माध्यम से, डिस्क ब्लॉक को उनके संबंधित इन-मेमोरी पेज पर मैप किया जाता है। "


2

बफ़र में मेटाडेटा होता है जो लिखने के प्रदर्शन को बेहतर बनाने में मदद करता है

कैश में फ़ाइल सामग्री ही होती है (कभी-कभी डिस्क पर लिखने के लिए) जो पढ़ने के प्रदर्शन को बेहतर बनाती है


1

पुस्तक का उद्धरण: सूचना पुनर्प्राप्ति का परिचय

कैश

हम मेमोरी में जितना संभव हो उतना डेटा रखना चाहते हैं, खासकर उन डेटा को जिन्हें हमें अक्सर एक्सेस करने की आवश्यकता होती है। हम मुख्य मेमोरी कैशिंग में अक्सर उपयोग किए जाने वाले डिस्क डेटा को रखने की तकनीक कहते हैं।

बफर

ऑपरेटिंग सिस्टम आम तौर पर पूरे ब्लॉक को पढ़ते और लिखते हैं। इस प्रकार, डिस्क से एक एकल बाइट को पढ़ने में पूरे ब्लॉक को पढ़ने में उतना ही समय लग सकता है। 8, 16, 32 और 64 किलोबाइट (KB) के ब्लॉक आकार आम हैं। हम मुख्य मेमोरी के उस हिस्से को कहते हैं जहां एक ब्लॉक को पढ़ा या लिखा जा रहा है, एक बफर स्टोर किया जाता है।


0

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.