क्यों लिनक्स रिपोर्टिंग "मुक्त" स्मृति अजीब है?


44

यह यूनिक्स ऑपरेटिंग सिस्टम मेमोरी उपयोग की रिपोर्ट कैसे करता है, इसके बारे में एक विहित प्रश्न है
इसी तरह के प्रश्न:

मेरे पास उत्पादन सर्वर है जो डेबियन 6.0.6 स्क्वीज़ चला रहा है

# नाम- a

Linux debsrv 2.6.32-5-xen-amd64 #1 SMP Sun Sep 23 13:49:30 UTC 2012 x86_64 GNU/Linux

हर दिन क्रॉन बैकअप स्क्रिप्ट को रूट के रूप में निष्पादित करता है:

# क्रेस्टैब-ई

0 5 * * * /root/sites_backup.sh > /dev/null 2>&1

# नैनो /root/sites_backup.sh

#!/bin/bash
str=`date +%Y-%m-%d-%H-%M-%S`
tar pzcf /home/backups/sites/mysite-$str.tar.gz /var/sites/mysite/public_html/www
mysqldump -u mysite -pmypass mysite | gzip -9 > /home/backups/sites/mysite-$str.sql.gz
cd /home/backups/sites/
sha512sum mysite-$str* > /home/backups/sites/mysite-$str.tar.gz.DIGESTS
cd ~

सब कुछ पूरी तरह से काम करता है, लेकिन मैं नोटिस करता हूं कि मुनिन का मेमोरी ग्राफ बैकअप के बाद कैश और बफ़र्स की वृद्धि दर्शाता है ।

फिर मैं सिर्फ बैकअप फाइल डाउनलोड करता हूं और उन्हें डिलीट करता हूं। हटाए जाने के बाद मुनिन का मेमोरी ग्राफ कैश और बफर को उस राज्य में लौटाता है जो बैकअप से पहले था।

यहाँ मुनिन ग्राफ है:

बाहरी रूप से होस्ट की गई छवि एक मृत लिंक थी।


3
बधाई हो, इस सवाल को कैनोनाइज़ किया गया है (यह आज के बारे में पूछने वाले 6 वें की तरह है, और यह सबसे दिलचस्प और सुंदर उदाहरण के लिए होता है :-)
voretaq7

जवाबों:


27

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

इस तथ्य पर ध्यान दें कि मेमोरी की खपत कैश से है । इसका मतलब है कि यह एक फाइल को मेमोरी में रखे हुए है। कैश्ड मेमोरी "फ्री" मेमोरी है। मेमोरी के ब्लॉक को खाली छोड़ने के बजाय, आपका OS उस स्थान पर हाल ही में पढ़ी गई फ़ाइलों को रख रहा है। यदि किसी एप्लिकेशन को उस मेमोरी की आवश्यकता होती है, तो इसका उपयोग एप्लिकेशन द्वारा किया जाएगा। तब तक, यह डिस्क से एक फ़ाइल को पढ़ने से बचाने का मौका देता है यदि इसे अक्सर संदर्भित किया जाता है।

इस ग्राफ के अनुसार, आपकी प्रभावी मेमोरी खपत ग्राफ की पूरी अवधि के लिए बिल्कुल भी नहीं बदली है।


क्या इन फ़ाइलों को कैश नहीं करने के लिए सर्वर को निर्देश देना संभव है? मुझे लगता है कि मुझे sync; echo 3 > /proc/sys/vm/drop_cachesबैकअप के बाद चलना चाहिए ?

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

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

61

आप लिनक्स Ate My Ram समस्या का अनुभव कर रहे हैं ।

दहशत नहीं।

ये कोई समस्या नहीं है।

आपका सिस्टम डिज़ाइन किए अनुसार कार्य कर रहा है।

समस्या आपका ओएस नहीं है - समस्या यह है कि "मुफ्त" मेमोरी की आपकी समझ है।


यूनिक्स सिस्टम केवल चलने वाले कार्यक्रमों से अधिक के लिए मेमोरी का उपयोग करता है। इसके लिए मेमोरी का उपयोग किया जा सकता है:

  • चल रहे कार्यक्रम (सक्रिय / उपयोग)
  • ट्रांजिट में बफरिंग डेटा (बफर)
  • कैशिंग डेटा हाल ही में डिस्क (कैश) से पढ़ा / लिखा गया है
  • बिल्कुल कुछ भी नहीं (मुक्त)

आधुनिक यूनिक्स सिस्टम रैम के उपयोग की रिपोर्ट कैसे करता है, इसका संक्षिप्त (और काफी हद तक अधूरा) दौरा है।

फ्री मेमोरी (ओएस परिभाषा) क्या है?

जब यूनिक्स प्रणाली रैम को फ्री के रूप में रिपोर्ट कर रही है तो इसका मतलब है "मैं इस रैम का उपयोग किसी भी चीज के लिए नहीं कर रहा हूं"।
फ्री रैम प्रभावी रूप से बेकार है - यह आपके सिस्टम को तेजी से नहीं बना रहा है, यह सिर्फ वहाँ बैठे है "फ्री" होने की स्थिति में कुछ इसकी आवश्यकता है। वह चीज जो ऊपर बताई गई तीन अन्य वस्तुओं में से कोई भी हो सकती है।

कैश और बफर मेमोरी क्या हैं?

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

एक्टिव मेमोरी क्या है?

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

निष्क्रिय स्मृति क्या है?

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

"यूज्ड" मेमोरी (HUMAN परिभाषा) क्या है

आप और मैं जो "यूज्ड" मेमोरी के रूप में सोचते हैं, अनिवार्य रूप से, सक्रिय और निष्क्रिय स्मृति का योग है। वर्तमान में सभी RAM ने उनके उपयोग के लिए अनुप्रयोगों द्वारा दावा किया है।
जब तक आपके पास एक्टिव और इनएक्टिव मेमोरी के योग से अधिक स्थापित RAM है (प्लस का एक अच्छा सुरक्षा मार्जिन 512-1024MB शीर्ष पर है) आप एक ठीक जगह पर हैं: आपका OS शायद स्वैप और प्रदर्शन को मार नहीं रहा होगा ।

"फ्री" मेमोरी (HUMAN परिभाषा) क्या है?

आप और मैं जो "मुक्त" स्मृति के बारे में सोचते हैं वह मेमोरी है जो प्रोग्राम चलाने के लिए उपलब्ध है।
यह आपके "OS" रिपोर्ट की "फ्री" आकृति की तुलना में थोड़ा अधिक जटिल है। जब कोई प्रोग्राम RAM के लिए पूछता है तो ऑपरेटिंग सिस्टम उस रैम को कम से कम विघटनकारी तरीके से प्राप्त करने की कोशिश करेगा:

  • यदि मुफ्त मेमोरी उपलब्ध है (कुछ भी नहीं करने के आसपास बैठे हुए) जो कि RAM को आवंटित किया जाएगा।
  • यदि कोई मुफ्त मेमोरी उपलब्ध नहीं है, तो OS कैश और बफर स्पेस को कैनालिबलाइज करेगा: बफर पूल में कम से कम / हाल ही में एक्सेस किया गया सामान बाहर फेंक दिया जाएगा, और उस रैम को प्रोग्राम को दिया जाएगा।
  • यदि कोई बफ़र / कैश रैम नहीं है, तो स्वैपर को निष्क्रिय करने के लिए निष्क्रिय मेमोरी को देखेंगे और उन क्षेत्रों को चुनें जिन्हें लगता है कि कम से कम एक्सेस होने की संभावना है। यही कारण है कि डेटा जाएगा बाहर पृष्ठांकित स्वैप (डिस्क), और नव मुक्त कर दिया रैम कार्यक्रम के लिए दिया।
  • यदि सभी इनएक्टिव रैम को स्वैप कर दिया गया है तो स्वैपर डिस्क पर एक्टिव रैम डालने लगेगा।
    (यह उस जगह के बारे में है जहां प्रदर्शन आमतौर पर कुत्तों के लिए जाता है: हर बार जब कोई प्रोग्राम सीपीयू पर अपनी बारी आती है तो उसके स्वैप किए गए बिट्स को रैम में वापस लाने की आवश्यकता होती है, जिसका अर्थ है कि किसी अन्य प्रोग्राम की सक्रिय मेमोरी को स्वैप करना होगा - स्वैप में उच्च कारोबार को थ्रैशिंग कहा जाता है )
  • यदि सिस्टम ने सब कुछ स्वैप किया है (और स्वैप विभाजन को भर सकता है), या यदि आप एक स्वैप विभाजन के बिना एक सिस्टम चला रहे हैं , तो खराब चीजें होती हैं। इस बिंदु पर दो चीजों में से एक होगा:
    • malloc()असफल हो जायेगी। यह पोसिक्स-अनुरूप व्यवहार है - ऑपरेटिंग सिस्टम रैम के लिए पूछने वाले कार्यक्रम को बताएगा कि यह अनुरोध को संतुष्ट नहीं कर सकता है।
      कार्यक्रम या तो कम रैम के लिए पूछ सकता है, या यदि यह मेमोरी का एक छोटा हिस्सा नहीं बना सकता है तो यह साफ हो सकता है और बाहर निकल सकता है। (यदि कार्यक्रम बुरी तरह से लिखा गया है तो यह बस दुर्घटनाग्रस्त हो जाएगा।)
    • यदि आप एक लिनक्स बॉक्स पर हैं, तो OOM- किलर एक गैंग-स्टाइल ड्राइव पर जा सकता है , स्प्री को मारकर, अन्य प्रक्रियाओं को समाप्त करके अनुरोध को पूरा करने के लिए पर्याप्त रैम मुक्त करने का प्रयास कर सकता है।
      यदि आप मेरे विवरण के बारे में यहाँ और मेरे द्वारा जुड़े प्रश्न पर अपना उत्तर नहीं बता सकते हैं, तो मुझे लगता है कि यह समस्या से निपटने का एक भयानक तरीका है।

जब आप फ़ाइलें हटाते हैं तो Free RAM ऊपर क्यों जाती है?

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


अब यह मेरे लिए पूरी तरह से स्पष्ट है ... मेरा लिनक्स अनुभव कुछ 2 महीने है, यह सब इस डेबियन सर्वर के साथ शुरू हुआ। एक महीने पहले मैंने अपने घर के लैपटॉप पर जेंटू स्थापित किया है, और यह प्रदर्शन से बहुत चकित था, जो कि विंडोज उपयोगकर्ता से लिनक्स उपयोगकर्ता से पूरी तरह से मेरे काम के कंप्यूटर पर भी बदल गया है। Gentoo के साथ लिनक्स सीखना बहुत अच्छा है, और अभी भी बहुत कुछ सीखने के लिए नरक है।

@ stan31337 आप इसके लिए अस्पष्ट नहीं हैं - यह केवल विंडोज पृष्ठभूमि से आने वाले लोगों के लिए विशेष रूप से कठिन है क्योंकि जब तक आप इसे ड्रिल नहीं करते हैं विंडोज विस्तार के इस स्तर के साथ स्मृति उपयोग की रिपोर्ट नहीं करता है - यह सिर्फ "उपयोग" है (कार्यक्रमों द्वारा) ) और "नि: शुल्क" (कार्यक्रमों के लिए)। मैक उपयोगकर्ताओं के लिए यह थोड़ा आसान है क्योंकि गतिविधि मॉनिटर मूल रूप से एक ग्राफिकल संस्करण है topऔर रिपोर्ट करता है फ्री / वायर्ड / एक्टिव / इनएक्टिव रैम।
voretaq7

मैं विंडोज पर प्रोसेस एक्सप्लोरर के साथ काम करता था, इसमें बहुत सी मेमोरी चीजें दिखाई जाती थीं, लेकिन उनमें से ज्यादातर मेरे लिए इतनी अस्पष्ट थीं, कि मैं वास्तव में उन्हें नहीं देखता था ...

2
इसके अलावा, यह ध्यान दिया जाना चाहिए, कि विंडोज आमतौर पर इसे बहुत विस्तार से नहीं दिखाता है , इसमें बहुत समान सेटअप है।
जोकिम सॉउर

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

2

उपरोक्त जांच विफल होने पर जांच करने के लिए कुछ और:

स्लैब कैश (के उपयोग की जाँच करें Slab:, SReclaimable:और SUnreclaim:में /proc/meminfo)। यह इन-कर्नेल डेटा संरचनाओं का एक कैश है, और इसके द्वारा रिपोर्ट किए गए पेज कैश से अलग है free

यदि स्लैब कैश आपकी "लापता मेमोरी" के एक बड़े हिस्से के लिए सम्मानित है, तो /proc/slabinfoयह देखने के लिए जांचें कि यह कहां गया है। यदि यह डेन्चर या इनोड है, तो आप sync ; echo 2 > /proc/sys/vm/drop_cachesउनसे छुटकारा पाने के लिए उपयोग कर सकते हैं।

slabtopस्लैब कैश के वर्तमान उपयोग को मैत्रीपूर्ण प्रारूप में दिखाने के लिए आप टूल का भी उपयोग कर सकते हैं । cवर्तमान कैश आकार द्वारा सूची को सॉर्ट करेगा।

प्रेषक: https://stackoverflow.com/a/5467207

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