लिनक्स कर्नेल की मेमोरी सीमा


12

मुझे एक समस्या है। मेरे पास एक पुस्तकालय है जो अनुकूलित CDB निष्पादित करने के लिए sg का उपयोग करता है । कुछ सिस्टम हैं जो नियमित रूप से sg में मेमोरी आवंटन के साथ समस्याएँ हैं । आमतौर पर, sg ड्राइवर की सीमा लगभग 4mb होती है, लेकिन हम इसे ~ 2.3mb के अनुरोध के साथ इन कुछ सिस्टम पर देख रहे हैं। यही है, CDBs 2.3mb हस्तांतरण के लिए आवंटित करने की तैयारी कर रहे हैं। यहाँ कोई समस्या नहीं होनी चाहिए: 2.3 <4.0।

अब, मशीन का प्रोफाइल। यह एक 64 बिट सीपीयू है, लेकिन CentOS 6.0 32-बिट चलाता है (मैंने उन्हें नहीं बनाया और न ही मुझे इस फैसले से कोई लेना देना है)। इस CentOS डिस्ट्रो के लिए कर्नेल संस्करण 2.6.32 है। उनके पास 16 जीबी की रैम है।

सिस्टम पर मेमोरी का उपयोग कैसा दिखता है (हालांकि, क्योंकि यह त्रुटि स्वचालित परीक्षण के दौरान होती है, मैंने अभी तक यह सत्यापित नहीं किया है कि क्या यह स्थिति तब प्रदर्शित होती है जब यह त्रुटी sg से वापस आ जाती है )।

top - 00:54:46 up 5 days, 22:05,  1 user,  load average: 0.00, 0.01, 0.21
Tasks: 297 total,   1 running, 296 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  15888480k total,  9460408k used,  6428072k free,   258280k buffers
Swap:  4194296k total,        0k used,  4194296k free,  8497424k cached

मुझे यह लेख लिनक्स जर्नल से मिला, जो कर्नेल में मेमोरी आवंटित करने के बारे में है। लेख दिनांकित है लेकिन 2.6 से संबंधित है (लेखक के बारे में कुछ टिप्पणियाँ सिर पर हैं)। लेख में उल्लेख किया गया है कि कर्नेल लगभग 1 जीबी मेमोरी तक सीमित है (हालांकि यह पाठ से पूरी तरह से स्पष्ट नहीं है अगर यह 1 जीबी प्रत्येक भौतिक और आभासी या कुल के लिए है)। मुझे आश्चर्य है कि अगर यह 2.6.32 के लिए एक सटीक बयान है। अंततः, मैं सोच रहा हूँ कि क्या ये सिस्टम इस सीमा को मार रहे हैं।

हालांकि यह वास्तव में मेरी समस्या का जवाब नहीं है, मैं 2.6.32 के लिए दावे की सत्यता के बारे में सोच रहा हूं। तो फिर, कर्नेल के लिए मेमोरी की वास्तविक सीमा क्या है? समस्या निवारण के लिए इस पर विचार करने की आवश्यकता हो सकती है। अन्य सुझावों का स्वागत है। यह इतना चकरा देने वाला है कि ये सिस्टम कई अन्य लोगों के समान हैं जो इस समस्या को नहीं दिखाते हैं।

जवाबों:


21

32-बिट सिस्टम में लिनक्स कर्नेल मेमोरी के लिए 1 GiB सीमा 32-बिट एड्रेसिंग का परिणाम है, और यह एक बहुत ही कठोर सीमा है। इसे बदलना असंभव नहीं है, लेकिन यह एक बहुत अच्छे कारण के लिए है; इसे बदलने के परिणाम हैं।

चलो 1990 के दशक की शुरुआत में वेक्सबैक मशीन को लेते हैं, जब लिनक्स बनाया जा रहा था। उन दिनों में वापस, हम के बारे में है कि क्या लिनक्स रैम 2 MiB में चलाने के लिए या अगर यह किया जा सकता है तर्क होगा वास्तव में जरूरत 4 पूरे MiB । बेशक, हाई-एंड स्नोब अपने सभी 16 एमबीबी मॉन्स्टर सर्वर के साथ हम पर छींटाकशी कर रहे थे।

उस छोटे से जादू-टोने से किसी चीज का क्या लेना-देना है? उस दुनिया में, यह आसान बनाने के बारे में निर्णय लेने के लिए है कि आप साधारण 32-बिट एड्रेसिंग से प्राप्त 4 GiB एड्रेस स्पेस को कैसे विभाजित करें। कुछ OSes सिर्फ छमाही में यह अलग हो गए, "कर्नेल झंडा" के रूप में पता के शीर्ष सा इलाज: पतों 0 से 2 31 -1 पतों 2 शीर्ष बिट को मंजूरी दे दी है, और उपयोगकर्ता अंतरिक्ष कोड के लिए थे, था और 31 2 के माध्यम से 32 - 1 में शीर्ष बिट सेट था, और कर्नेल के लिए थे। आप केवल पते को देख सकते हैं और बता सकते हैं: 0x80000000 और ऊपर, यह कर्नेल-स्थान है, अन्यथा यह उपयोगकर्ता-स्थान है।

जैसे ही पीसी मेमोरी साइज़ उस 4 GiB मेमोरी लिमिट की ओर बढ़ा, यह साधारण 2/2 स्प्लिट एक समस्या बनने लगी। उपयोगकर्ता स्थान और कर्नेल स्थान दोनों में बहुत सारे रैम पर अच्छे दावे थे, लेकिन चूंकि कंप्यूटर होने का हमारा उद्देश्य आम तौर पर उपयोगकर्ता कार्यक्रमों को चलाने के लिए होता है, न कि कर्नेल को चलाने के बजाय, ओएस ने उपयोगकर्ता / कर्नेल विभाजन के साथ खेलना शुरू कर दिया। 3/1 का विभाजन एक सामान्य समझौता है।

भौतिक बनाम आभासी के बारे में आपके प्रश्न के अनुसार, यह वास्तव में मायने नहीं रखता है। तकनीकी रूप से, यह एक वर्चुअल मेमोरी लिमिट है, लेकिन ऐसा सिर्फ इसलिए है क्योंकि लिनक्स एक VM- आधारित OS है। 32 GB का भौतिक RAM स्थापित करने से कुछ भी नहीं बदलेगा, न ही यह swapon32 GiB स्वैप विभाजन में मदद करेगा । कोई फर्क नहीं पड़ता कि आप क्या करते हैं, एक 32-बिट लिनक्स कर्नेल कभी भी 4 से अधिक GiB को एक साथ संबोधित नहीं कर पाएगा।

(हां, मैं पीएई के बारे में जानता हूं । अब जब 64-बिट ओएस खत्म हो रहे हैं, तो मुझे आशा है कि हम इस बुरा हैक को भूल सकते हैं। मुझे विश्वास नहीं है कि यह इस मामले में आपकी मदद कर सकता है।)

लब्बोलुआब यह है कि यदि आप 1 GiB कर्नेल VM सीमा में चल रहे हैं, तो आप कर्नेल को 2/2 विभाजन के साथ पुन: बना सकते हैं, लेकिन यह सीधे उपयोगकर्ता के अंतरिक्ष कार्यक्रमों को प्रभावित करता है।

64-बिट वास्तव में सही उत्तर है।


1
धन्यवाद। यह राइटअप बढ़िया है। मैं विंडोज में आमतौर पर उपयोग किए जाने वाले 2/2 विभाजन में चला गया हूं। उस समय, मुझे पता चला कि लिनक्स 3/1 विभाजन का उपयोग करता है। काश, मैं यह सोचता कि जब लेख पढ़ा जाता है, तो मुझे लगता है कि मैंने डॉट्स को कनेक्ट किया होगा। तो ... यह मुझे लगता है कि मुझे इसे ध्यान में रखना होगा। इन प्रणालियों के परीक्षणों की प्रकृति पर विचार करने की सीमाएं मार रही हैं, यह सोचना शायद बहुत दूर की बात नहीं है। बड़ा सवाल यह है कि अन्य प्रणालियां भी इसका अनुभव क्यों नहीं कर रही हैं। एक बार फिर धन्यवाद।
एंड्रयू फलांगा

1
@AndrewFalanga: वास्तव में, आधुनिक विंडोज एक फजी 3/1 विभाजन का उपयोग करता है।
वॉरेन यंग

1
हम में से कुछ 12 एमबी सर्वर प्राप्त करने के लिए एसएससी से विरासत में मिली तीन अलग-अलग मशीनों से मेमोरी को मिलाने में सक्षम थे। तो ज्यादा स्मृति हम कुछ भी हम चाहते थे कर सकता है ...
dmckee --- पूर्व मॉडरेटर बिल्ली का बच्चा

3
"हां, मैं x86 खंडित मेमोरी मॉडल के बारे में जानता हूं । अब जब 32-बिट ओएस खत्म हो रहे हैं, तो मुझे उम्मीद है कि हम उस गंदा हैक को भूलना शुरू कर सकते हैं।"
एक CVn

32- और 64-बिट्स के बीच 16- और 32 के बीच दुगनी दोगुनी होती है, जो कि इस तरह के हैक को बंद करने के समय की मात्रा को दोगुना करता है, बाकी सभी समान हैं। लेकिन बाकी सभी समान नहीं हैं , मूर के कानून के सूर्यास्त के साथ क्या। हमें 32-बिट x86 कंप्यूटिंग में से दो दशक मिले। हम 64-बिट से शतक बना सकते हैं । आज के DRAM बैंडवाइथ्स में RAM के 2⁶⁴ बाइट्स का एक सिंगल-पास रीड लगभग 30 साल लेगा । 64-बिट सीमा तक पहुंचने में सक्षम करने के लिए बैंडविड्थ की वृद्धि कहां से आने वाली है?
वॉरेन यंग

2

मैं वारेन यंग के उत्कृष्ट उत्तर के साथ थोड़ा जोड़ना चाहता हूं , क्योंकि चीजें वास्तव में उनके लिखे से भी बदतर हैं।

1GB कर्नेल पता स्थान को दो भागों में विभाजित किया गया है। 128 एमबी के लिए vmallocऔर 896 एमबी के लिए हैं lowmem। कोई बात नहीं यह वास्तव में क्या मतलब है। मेमोरी आवंटित करते समय, कर्नेल कोड को यह चुनना चाहिए कि वह इनमें से कौन चाहता है। जो भी खाली जगह है उससे आपको सिर्फ मेमोरी नहीं मिल सकती है।

यदि आप चुनते हैं vmalloc, तो आप 128MB तक सीमित हैं। अब 1GB इतना बुरा नहीं लगता ...

यदि आप चुनते हैं lowmem, तो आप 896MB तक सीमित हैं। 1 जीबी से अब तक नहीं, लेकिन इस मामले में, सभी आवंटन 2 की अगली शक्ति तक गोल हैं। इसलिए 2.3MB का आवंटन वास्तव में 4MB का उपभोग करता है। साथ ही, उपयोग करते समय आप एक कॉल में 4MB से अधिक आवंटित नहीं कर सकते lowmem

64-बिट वास्तव में सही उत्तर है।


मेरे पास आपके उत्तर से संबंधित एक प्रश्न है। स्मृति के इस स्थान के लिए , जिसका नाम लोयम है , क्या यह वह जगह है जहां से किमीमैलो और क्ज़्मालोक जैसे कॉल आते हैं?
एंड्रयू फेलंगा

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