वर्चुअल मेमोरी का आकार शीर्ष में क्या है?


124

मैं topअपने सर्वर के प्रदर्शन की निगरानी करने के लिए दौड़ रहा हूं और मेरी जावा प्रक्रियाओं के 2 800MB-1GB तक की वर्चुअल मेमोरी दिखाते हैं। क्या यह गलत बात है?

वर्चुअल मेमोरी का क्या अर्थ है?

और ओह btw, मेरे पास 1 जीबी की स्वैप है और यह 0% का उपयोग करता है। इसलिए मैं उलझन में हूं।

जावा प्रक्रिया = 1 टॉमकैट सर्वर + मेरा अपना जावा डेमॉन सर्वर = उबंटू ९ .१० (कर्मिक)


जवाबों:


142

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

पता स्थान (यानी प्रक्रिया सूची में आभासी मेमोरी) कुछ भी खर्च नहीं करता है; यह वास्तविक नहीं है। क्या वास्तविक है RSS (RES) कॉलम, जो निवासी मेमोरी है। कि आपकी वास्तविक मेमोरी में से कितनी पर एक प्रक्रिया व्याप्त है।

लेकिन वह भी पूरा जवाब नहीं है। यदि कोई प्रक्रिया कांटा () कहती है, तो यह दो भागों में विभाजित हो जाता है, और दोनों शुरू में अपने सभी आरएसएस को साझा करते हैं। इसलिए भले ही आरएसएस शुरू में 1 जीबी था, लेकिन फोर्किंग के बाद परिणाम दो प्रक्रियाएं होंगी, जिनमें से प्रत्येक 1 जीबी के आरएसएस के साथ होगी, लेकिन आप अभी भी केवल 1 जीबी मेमोरी का उपयोग कर रहे होंगे।

अभी तक उलझन में है? यहां आपको वास्तव में जानने की आवश्यकता है: freeअपने प्रोग्राम को शुरू करने से पहले और बाद में ( +/- buffers/cacheलाइन पर) कमांड का उपयोग करें और परिणामों की जांच करें । वह अंतर यह है कि आपके द्वारा शुरू किए गए नए प्रोग्राम में कितनी नई मेमोरी है।


2
"अपना कार्यक्रम शुरू करने से पहले और बाद में परिणामों की जांच करें", वैकल्पिक रूप से, यूएसएस (यूनिक सेट साइज़) का उपयोग करें जैसा कि वापस किया गया है smem
ह्यूबर्ट करियो

तो क्या ऐसा उपकरण है जो सही मात्रा में मेमोरी का उपयोग करता है, ऐसे उपकरण जो तीसरे पक्ष के नहीं हैं।
CMCDragonkai

@CMCDragonkai हाँ, मुफ्त।
देवयानफैन

1
अगर मैं एक जावा प्रक्रिया शुरू करता हूं java -Xmx16g RunLong, जो जावा प्रक्रिया के लिए 16 जीबी मेमोरी आरक्षित करेगा, तो VIRTशीर्ष पर, ऐसा लगता है कि 16 जीबी की गणना की जाती है। इस मामले में, यह 16 जीबी मेमोरी का प्रकार क्या है, यह मैप की गई मेमोरी है या ..?
एरिक वांग

1
@ EricWang, वह मेमोरी मैप नहीं की गई है। यह स्मृति को आरक्षित करने के लिए ओएस के लिए केवल एक अनुरोध है जिसे बाद में (शायद कभी नहीं) की आवश्यकता हो सकती है। (कम से कम) लिनक्स पर, यह MAP_NORESERVE और PROT_NONE झंडे (देखें ओएस :: pd_reserve_memory कॉल anon_mmap: github.com/AdoptOpenJKK/openjdk-jdk11u/blob/… ) के साथ एक एमएमएपी कॉल है ; कोई भी मेमोरी वास्तव में डिफ़ॉल्ट रूप से आवंटित नहीं की जाती है - यह केवल उस बिंदु पर बाद में किया जाता है जब प्रोग्राम को ऑब्जेक्ट आवंटन अनुरोधों को पूरा करने के लिए स्मृति की आवश्यकता होती है।
जुराज मार्टिंका

23

शीर्ष (1) मैन पेज से:

o: VIRT  --  Virtual Image (kb)
      The  total  amount  of  virtual  memory  used  by the task.  It
      includes all code, data and shared libraries  plus  pages  that
      have been swapped out.

      VIRT = SWAP + RES.

जहाँ RES का अर्थ है रेजिडेंट मेमोरी (प्रयुक्त भौतिक मेमोरी)।

वास्तव में यह सही नहीं है (अब)। जब यह "स्वैप" कहता है, तो इसमें वे फाइलें भी शामिल होती हैं जिन्हें प्रोग्राम ने अपने पता स्थान में मैप किया है, जो वास्तव में अभी तक वास्तविक रैम का उपभोग नहीं कर सकते हैं या नहीं कर सकते हैं। यह मेमोरी फ़ाइल-समर्थित है लेकिन वास्तव में स्वैप नहीं है।

VIRT में वे पृष्ठ भी शामिल हैं जिन्हें अभी तक आवंटित नहीं किया गया है, लेकिन उनका उपयोग नहीं किया गया है। इस स्थिति के किसी भी पृष्ठ को कर्नेल शून्य पृष्ठ (शानदार अवधारणा - आपको इसे देखना चाहिए) में मैप किया जाता है, इसलिए यह VIRT में दिखाई देता है लेकिन वास्तव में किसी भी मेमोरी का उपभोग नहीं करता है।


2
अच्छी तरह से दिलचस्प है, तो VIRT = SWAP + RES है, कैसे मेरे SWAP उपयोग शून्य है, जबकि 2 जावा प्रक्रियाओं के लिए वर्चुअल मेमोरी 1GB के करीब है ??
kapso

मूल रूप से शीर्ष शो .... स्वैप: 1048568k कुल, 0k इस्तेमाल किया, 1048568k मुफ्त, 505728k कैश किया गया
kapso

15
@ user42159 यह जवाब गलत है! मैन टॉप में कोई 'VIRT = SWAP + RES' नहीं है! -m : VIRT/USED toggle Reports USED (sum of process rss and swap total count) instead of VIRT। यह अफ़सोस की बात है कि मैं इस जवाब को अस्वीकार नहीं कर सकता।
1

3
यह उत्तर गलत है। उपयोग = Res + स्वैप आकार (शीर्ष फ़ील्ड्स प्रबंधन से, शीर्ष में होने पर f कुंजी दबाकर पहुँचा। शीर्ष मैन पेज से भी)।
जेसन एस

14

मुझे मुगुरल सुमनारू से यह स्पष्टीकरण बहुत स्पष्ट मिला:

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

RESनिवासी आकार के लिए खड़ा है, जो एक वास्तविक भौतिक स्मृति एक प्रक्रिया का उपभोग कर रहा है की एक सटीक प्रतिनिधित्व है। (यह भी सीधे% MEM कॉलम से मेल खाता है।) यह लगभग हमेशा VIRT आकार से कम होगा, क्योंकि अधिकांश प्रोग्राम C लाइब्रेरी पर निर्भर करते हैं।

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


मैं शायद केवल फिर से शब्द "वीआईआरटी का प्रतिनिधित्व करता है कि वर्तमान समय में कार्यक्रम कितनी मेमोरी तक पहुंचने में सक्षम है।" कुछ इस तरह "वीआईआरटी वर्तमान समय में कार्यक्रम के पूरे पते योग्य स्थान के आकार का प्रतिनिधित्व करता है।" ठीक है, कि अभी भी पॉलिश का उपयोग कर सकता है। लेकिन मुद्दा यह है कि, "कितनी मेमोरी" अभी भी हम राम की चर्चा कर रहे छाप दे सकते हैं, जब वीआईआरटी का रैम स्पेस से कोई लेना- देना नहीं है। वास्तव में, बड़े कार्यक्रमों में अक्सर एक VIRT आकार होता है जो कुल सिस्टम RAM आकार के कई MULTIPLEs होते हैं - क्योंकि VIRT लगभग पूरी तरह से फ़ाइल-समर्थित पता क्षेत्र (AKA "डिस्क रैम नहीं") है।
FeRD

5

पीएस / टॉप आउटपुट में VIRT कॉलम मेमोरी उपयोग को मापने के लिए लगभग अप्रासंगिक है। इसके बारे में चिंता मत करो। अपाचे भारी लोड VIRT बनाम RES मेमोरी

https://stackoverflow.com/questions/561245/virtual-memory-usage-from-java-under-linux-too-much-memory-used


धन्यवाद, मैं चिंतित और भ्रमित हो गया, क्योंकि जब स्वैप उपयोग 0% था, तो वर्चुअल मेमोरी कॉलम बहुत अधिक है। और मेरे पास कुल 2.7GB भौतिक मेमोरी में से केवल 1.7GB का उपयोग होता है, जबकि आभासी मेमोरी अधिक है?
kapso 15

2

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

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

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

ऑपरेटिंग सिस्टम शब्दावली पर एक नोट: कंप्यूटर विज्ञान आमतौर पर स्वैपिंग (पूरी प्रक्रिया को स्वैप स्थान पर लिखने) और पेजिंग के बीच अंतर करता है (केवल निश्चित आकार के हिस्सों को लिखता है, आमतौर पर एक समय में कुछ किलोबाइट्स)। पेजिंग आमतौर पर अधिक कुशल है, और यही वह है जो लिनक्स करता है, लेकिन पारंपरिक लिनक्स शब्दावली वैसे भी स्वैपिंग के बारे में बात करती है।

स्रोत: http://www.faqs.org/docs/linux_admin/x1752.html


1
यह उत्तर गलत धारणा फैलाता है कि वर्चुअल मेमोरी स्वैपिंग या पेजिंग के समान है। रैम के विस्तार के रूप में डिस्क का उपयोग करना वर्चुअल मेमोरी को पूर्ववर्ती करता है। और बहुत सारी प्रणालियाँ हैं (जैसे अधिकांश सोहो राउटर) जिनमें वर्चुअल मेमोरी होती है लेकिन रैम के विस्तार के रूप में डिस्क का उपयोग नहीं करते हैं। (और यह ओपी के सवाल का जवाब नहीं है, क्योंकि वह किसी भी स्वैप का उपयोग नहीं कर रहा है।)
डेविड श्वार्ट्ज

2

VIRtualशीर्ष का स्तंभ, प्रक्रिया के सुपर-स्पेस (सुपर खपत स्थान) को संदर्भित करता है, जो प्रक्रिया वास्तव में रन टाइम पर नहीं हो सकती है। एक और कॉलम है RESident, जो प्रक्रिया द्वारा आवंटित वास्तविक भौतिक मेमोरी / स्थान को संदर्भित करता है, रनटाइम पर।

दोनों के बीच अंतर का कारण, उदाहरण से समझा जा सकता है: यदि प्रक्रिया कुछ निश्चित पुस्तकालय का उपयोग कर रही है, तो पुस्तकालय का आकार, भी सहायता करेगा virtual-size। हालाँकि, चूंकि पुस्तकालय का केवल एक हिस्सा उपयोग किया जाएगा (अर्थात उपयोग में कुछ तरीके), ताकि इसमें सहायता मिलेगी resident-size

अधिक जानकारी के लिए देखें


0

"वीआईआरटी" सिर्फ पते की जगह है, आरईएस "वास्तविक" मेमोरी है, लेकिन "एसईआर" की "एसएचआर" (= साझा) राशि आरईएस का हिस्सा है जो अन्य प्रक्रियाओं के साथ साझा की जाती है। इसलिए अधिकांश प्रक्रियाओं के लिए, मेरा मानना ​​है कि आरईएस से एसएचआर घटाकर आपको स्मृति की मात्रा मिलती है जो वास्तव में इस विशेष प्रक्रिया के लिए जिम्मेदार है।

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