मैं मैक ओएस एक्स पर अधिकतम स्वैप स्थान कैसे बढ़ा सकता हूं?


14

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

9/25/15 7: 08: 40.000 PM कर्नेल [0]: कम स्वैप: हत्या पीआईडी ​​6202 (हिजड़ा)

गणना ठीक काम करती है और उचित समय में जब यह 64 जीबी मेमोरी आवंटित करता है और उपयोग करता है। माई मैक में हार्ड ड्राइव पर 32 जीबी की रैम और बीकूप स्पेस है। मैंने 8 जीबी रैम के साथ एक और मैक पर भी यह कोशिश की, जिस पर 64 जीबी गणना ठीक चलती है, बेशक अधिक समय लेती है, लेकिन 128 जीबी गणना उसी तरह से कर्नेल द्वारा मार दी जाती है।

वैसे, malloc()कोई त्रुटि कभी नहीं लौटती, चाहे मैं कितनी भी जगह मांगूं। कर्नेल प्रक्रिया को केवल एक बार मार देगा, क्योंकि उस मेमोरी का उपयोग वास्तव में प्रक्रिया द्वारा किया जा रहा है, जिसके परिणामस्वरूप हार्ड ड्राइव पर बहुत सारे स्वैपिंग होते हैं।

तो कहीं 64 जीबी और 128 जीबी के बीच एक गुप्त स्वैप स्थान सीमा प्रतीत होती है।

मेरा सवाल है: मैं और अधिक स्वैप स्थान की अनुमति देने के लिए कर्नेल को कैसे पुन: कॉन्फ़िगर करूं? मुझे एक आशाजनक दिखने वाली फ़ाइल मिली /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist, लेकिन मुझे वहां गुप्त संख्या दिखाई नहीं दे रही है। इसके लिए मैन पेज dynamic_pagerकहता है कि यह सब कुछ स्वैप फ़ाइलों का नाम और स्थान निर्धारित करता है। उसी मैन पेज का एक पुराना संस्करण है जो -Sबनाए गए स्वैपफाइल्स के आकार को सेट करने के लिए एक विकल्प का दस्तावेजीकरण करता है। मैंने कोशिश की कि, 160 जीबी स्वैपफाइल्स का अनुरोध करूं, लेकिन इसका कोई असर नहीं हुआ। स्वैपफाइल्स अभी भी प्रत्येक 1 जीबी थे, और प्रक्रिया अभी भी कर्नेल द्वारा मार दी गई थी।


मैंने इस सवाल को Apple.stackexchange.com पर भी पोस्ट किया है, लेकिन वहां कोई प्रतिक्रिया नहीं हुई है।
मार्क एडलर

1
mallocआपके पास इससे अधिक होने का कारण यह हो सकता है क्योंकि कमिटमेंट बहुत अधिक है (शायद अनंत)। इसलिए ओएस मेमोरी को आवंटित करेगा जो कि उसके पास नहीं है (यह शर्त लगा रहा है कि प्रक्रिया इसका उपयोग नहीं करेगी, ओएस आमतौर पर इस शर्त को जीतता है)। आप स्मृति सीमा होने के लिए प्रतिबद्ध सीमा को समायोजित करना चाह सकते हैं, इस तरह यह प्रक्रिया जल्दी विफल हो जाएगी।
ctrl-alt-delor-

मैं यह नहीं देख सकता कि आप यह क्यों कहते हैं कि पैराग्राफ 5 सच है, यह पैराग्राफ 4 से अनुसरण नहीं करता है (हालाँकि आप इसे "इसलिए" से शुरू करते हैं)। क्या आपने बहुत सारे स्वैप जोड़ने की कोशिश की है? (इस पर सवाल स्पष्ट नहीं है, हालांकि मुझे संदेह है कि उत्तर हां है)।
ctrl-alt-delor-

@ श्रीचंद हां, मुझे पता है कि malloc()ऐसा क्यों होता है। मैं किसी की सोच पर संभावित टिप्पणियों की अवहेलना कर रहा था, जिसकी वापसी मूल्य की जाँच नहीं कर रहा हूँ malloc()। वैसे, मेरा उद्देश्य पहले असफल होना नहीं है। मेरा उद्देश्य सफल होना है।
मार्क एडलर

@richard क्योंकि कर्नेल संदेश "कम स्वैप" कहता है। "बहुत से स्वैप जोड़ने" के रूप में, नहीं, मैंने ऐसा नहीं किया है क्योंकि मुझे नहीं पता कि कैसे। ठीक यही सवाल है। मैं स्वैप स्थान कैसे जोड़ूं? बेशक, कर्नेल स्वचालित रूप से स्वैप स्थान जोड़ता है, लेकिन केवल एक सीमा तक। इसलिए सवाल की जड़: मैं कर्नेल की स्वैप स्थान सीमा कैसे बढ़ाऊं?
मार्क एडलर

जवाबों:


4

आपके द्वारा पूछे गए उत्तर के लिए नहीं, लेकिन यदि आप एक उपयुक्त आकार की अपनी फ़ाइल बनाते हैं, तो उसे अपनी प्रक्रिया में मिलाएँ, और फिर इस पता स्थान में अपनी गणना चलाएँ, यह एक स्वैप फ़ाइल के समान प्रभाव होना चाहिए और आपको इसकी गारंटी होगी उपलब्ध रैम / स्वैप के लिए अन्य प्रक्रियाओं के साथ प्रतिस्पर्धा करने का विरोध करने के लिए स्थान है।

यह धीमा भी हो सकता है, यह इस बात पर निर्भर करता है कि आप कितनी बार डेटा को अधिलेखित करते हैं, लेकिन बहुत अधिक पोर्टेबल होना चाहिए।


2
महान विचार! मुझे उच्च उम्मीदें थीं। काश, वे वास्तविकता के कठोर तट के खिलाफ धराशायी हो जाते। प्रक्रिया को अभी भी बड़ी मात्रा में स्वैपिंग के लिए कर्नेल द्वारा मारा गया था , ठीक पहले ("कम स्वैप" कंसोल संदेश), भले ही यह एक ऐसी फाइल का उपयोग कर रहा था जिसे मैंने वर्चुअल मेमोरी के रूप में उपयोग करने के लिए बनाया था mmap()
मार्क एडलर

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

0

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

डायनामिक स्वैप फ़ोल्डर का उपयोग करने की अनिश्चितताओं को दूर करें। एक भौतिक स्वैप विभाजन बनाएँ (बस एक खाली असंरक्षित विभाजन, स्वैप के लिए डिस्क तालिका प्रकार कोड के साथ, लिनक्स में यह हेक्स कोड है 0x82।) फिर।

  1. / Etc / rc फ़ाइल को संपादित करें इसमें स्वैप अनुभाग टिप्पणी पाएं। लाइन जोड़ेंmount -vat swap
    • का अर्थ है / etc / fstab में सभी स्वैप विभाजन माउंट करना
  2. Daud pdisk /dev/disk? -dump
    • "?" आपके HD की डिस्क संख्या स्वैप विभाजन के आगे की संख्या रिकॉर्ड करती है
  3. संपादित करें या बनाएँ / etc / fstab (यह शायद मौजूद नहीं है) जैसे एक पंक्ति जोड़ें /dev/disk?s?? none swap sw 0 0
    • ? आपकी डिस्क है
    • ?? स्वैप विभाजन की संख्या है।
  4. रिबूट।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.