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


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

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

#uname -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

#nano /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 ~

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

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

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

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


44
2017-11-16 04:29


मूल


बधाई हो, इस सवाल को कैनन किया गया है (यह आज 6 वें जैसा है, इस बारे में पूछना, और यह सबसे दिलचस्प और सबसे सुंदर उदाहरण है :-) - voretaq7
देख LinuxAteMyRam.com - Christoffer Hammarström


जवाब:


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

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

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


27
2017-11-16 04:47



क्या सर्वर को निर्देश देना संभव है कि इन फ़ाइलों को कैश न करें? मुझे लगता है मुझे दौड़ना चाहिए sync; echo 3 > /proc/sys/vm/drop_caches बैकअप के बाद?
@ stan31337 हां, यह संभव है, आप नहीं नहीं चाहिए वो करें। स्मृति में इस फ़ाइल को रखने से आपको कुछ भी नहीं लगता है। यदि आप अपने सभी कैश साफ़ करते हैं, तो कैश की गई प्रत्येक फ़ाइल और डिस्क से फिर से पढ़ना पड़ता है, बस आपके सिस्टम को धीमा कर देगा। ऐसा करने दें जो इसे करने के लिए डिज़ाइन किया गया था। - Jeff Ferland
@ stan31337 जब आप अपनी बैकअप फ़ाइल हटाते हैं तो ओएस स्वचालित रूप से कैश से बाहर निकलता है (यही कारण है कि आपकी मुफ्त मेमोरी इसे हटाने के बाद फिर से कूदती है) - लिनक्स यह जानकर काफी समझदार है कि एक फ़ाइल जो खुली नहीं है और नहीं कर सकती फाइल सिस्टम पेड़ से पहुंचेगा कभी भी फिर से नहीं पहुंचेगा। जेफ ने कहा कि आप निश्चित रूप से अपने पूरे एफएस कैश को डंप नहीं करना चाहते हैं (सिस्टम को डिस्क से उस डेटा को फिर से पढ़ना और फिर से कैश करना होगा, जो वास्तव में आपके सर्वर को थोड़ी देर के लिए धीमा कर देगा) - voretaq7


आप अनुभव कर रहे हैं लिनक्स एटी माई राम मुद्दा।

घबराओ मत

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

आपका सिस्टम डिज़ाइन के रूप में काम कर रहा है।

समस्या आपका ओएस नहीं है - समस्या यह है कि आपकी "मुक्त" स्मृति क्या है।


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

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

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

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

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

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

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

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

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

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

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

"प्रयुक्त" स्मृति क्या है (मानव परिभाषा)

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

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

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

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

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

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


61
2017-11-16 05:10



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


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

स्लैब कैश के उपयोग की जांच करें (Slab:, SReclaimable: तथा    SUnreclaim: में /proc/meminfo)। यह कर्नेल डेटा का कैश है   संरचनाएं, और रिपोर्ट किए गए पृष्ठ कैश से अलग है free

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

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

से: https://stackoverflow.com/a/5467207


2
2018-02-21 15:57