यदि लिनक्स कैश बहुत बड़ा है तो QEMU मेमोरी क्यों आवंटित नहीं कर सकता है?


9

अगर मैं थोड़ी देर के लिए अपनी मशीन [उबंटू 16.04 64 बिट, कर्नेल 4.4] का उपयोग करता हूं, तो क्यूईएमयू को कर्नेल कैश को छोड़ने की आवश्यकता है, अन्यथा, यह रैम को आवंटित करने का प्रबंधन नहीं करेगा।

क्यों होता है?

यह एक नमूना रन है:

~$ free -m
              total        used        free      shared  buff/cache   available
Mem:          15050        5427        3690          56        5931        4803
Swap:             0           0           0

~$ sudo qemu-system-x86_64 -m 10240 # and other options
qemu-system-x86_64: cannot set up guest memory 'pc.ram': Cannot allocate memory

~$ echo 3 | sudo tee /proc/sys/vm/drop_caches
3

~$ free -m
              total        used        free      shared  buff/cache   available
Mem:          15050        1799        9446          56        3803        9414
Swap:             0           0           0

~$ sudo qemu-system-x86_64 -m 10240 # and other options
qemu-system-x86_64: cannot set up guest memory 'pc.ram': Cannot allocate memory

~$ echo 3 | sudo tee /proc/sys/vm/drop_caches
3

~$ free -m
              total        used        free      shared  buff/cache   available
Mem:          15050        1502       10819          56        2727       10784
Swap:             0           0           0

~$ sudo qemu-system-x86_64 -m 10240 # and other options
# Now QEMU starts

4
क्योंकि आपको कोई स्वैप नहीं मिला है।
माइकल हैम्पटन

जवाबों:


19

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

आपको वास्तव में उचित मात्रा में स्वैप जोड़ना चाहिए। आप मेमोरी मैनेजर से यह उम्मीद नहीं कर सकते हैं कि वह अपनी पीठ के पीछे एक हाथ से अच्छा काम कर सकता है।


1
एक सैद्धांतिक सवाल के रूप में (क्योंकि मैं और अधिक सीखना चाहता हूं कि स्मृति प्रबंधन वास्तव में कैसे काम करता है) प्रबंधक विलंब (ब्लॉक) क्यूईएमयू के मेमोरी आवंटन के प्रयासों को क्यों नहीं कर सकता है जबकि गंदे पृष्ठ वापस लिखे जा रहे हैं?
नानोफारड

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

1
@hexafraction कर्नेल को पता नहीं है कि यह करने के लिए एक समझदार बात है। कुछ अनुप्रयोगों के लिए, इसका कोई मतलब नहीं है, इसलिए यह सामान्य नीति नहीं है। QEMU ने ऐसा नहीं करने का विकल्प चुना।
डेविड श्वार्ट्ज

2
@hexafraction वास्तव में, क्या आप 30 सेकंड इंतजार करना चाहते हैं - या कई मिनट - शायद आपके malloc()कॉल के लिए पर्याप्त मेमोरी मिल जाए?
माइकल हैम्पटन

3
@hexafraction इसके बारे में इस तरह से सोचें। यदि कर्नेल ने सैद्धांतिक रूप से कुछ समय के लिए ब्लॉक करने के लिए यह सुविधा दी है यदि कोई मॉलोक अन्यथा विफल हो जाएगा, तो अतिरिक्त एपीआई के बिना वर्तमान व्यवहार को प्राप्त करने का कोई तरीका नहीं होगा। दूसरी ओर, वर्तमान कार्यान्वयन सॉफ्टवेयर की अनुमति देता है जो प्रतीक्षा करने के लिए और धीमी गति से लूप में एक बार फिर से संतुष्ट होने तक इंतजार करना चाहता है।
वैलिटी ऑक्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.