स्वैप को पूरी तरह से अक्षम कैसे करें?


30

मैं डेबियन किनारे का उपयोग कर रहा हूं, हार्ड ड्राइव ext4 के साथ स्वरूपित है, लिनक्स 3.1 पर चल रहा है

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

लेकिन मेरे वर्तमान सेटअप में, कंप्यूटर पृष्ठभूमि में हिंसक I / O थ्रूपुट के साथ लटका हुआ है। iotop ने kswapd0 को अपराधी होने का खुलासा किया, जिसका अर्थ है कि यह स्वैपिंग के कारण है। swapon -sसक्षम किए गए किसी भी स्वैप को निर्धारित करने के लिए उपयोग करने के बाद , मैंने swapoff -aसभी स्वैपों को अक्षम करने और swapon -sफिर से पुष्टि करने के लिए उपयोग किया कि सभी स्वैप अक्षम थे।

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

क्या मैं कुछ गलत करने की कोशिश कर रहा हूँ swapoff -a? जो व्यवहार पहले हुआ करता था उससे अलग क्यों है (शायद पूर्व 3.0 बार)?


यह वास्तव में मतलब नहीं है। ऐसा करने से swapoff -a ही है, अगर वहाँ स्वैप में सामान था, आई / ओ का एक बहुत उत्पन्न होगा (और अगर वहाँ पर्याप्त असली रैम availabe नहीं है प्रक्रियाओं में परिणाम कर सकते मारे जाने)। क्या आप सुनिश्चित हैं कि यह swapoff -aI / O "तूफान" का कारण नहीं है ?
Mat

1
मुझे लगता है कि fstabस्वैप के बारे में लाइन पर टिप्पणी करना पर्याप्त है । कोशिश करें कि व्यवहार समान हो।
enzotib

@ मेट swapoff -aको स्वैप को स्थायी रूप से अक्षम करना चाहिए, जिसका अर्थ है कि यह अगले रिबूट के बाद अक्षम होना चाहिए। मैंने इसकी पुष्टि की। फिर भी, मैं / ओ "तूफान" अगले रिबूट के बाद भी सत्र के दौरान होता है। रिकॉर्ड के लिए, I / O "तूफान" उस समय नहीं हुआ था जब मैंने किया था swapoff -aक्योंकि उस समय स्वैप 0 था।
syockit

9
@syockit: swapoff -aहै नहीं स्थायी।
Mat

1
डेटाबेस लोडिंग 14 घंटे में लगभग 15% हो गई। स्वैप बंद कर दिया, और अगले प्रयास में यह 4 घंटे में 40% हो गया। माना जाता है कि सर्वर राम पर आधारित और संचालित है, लेकिन बिना स्वैप के OpenSuSE इस एक प्रक्रिया के लिए बहुत तेजी से काम करता है। "बेहतर" और खान की ओएस की राय एक साधारण mysql db भार के दौरान नाटकीय रूप से भिन्न होती है। स्वैप ड्राइव को / etc / fstab में टिप्पणी की और रिबूट किया गया।
TheSatinKnight

जवाबों:


15

स्वैप को अक्षम करना वह नहीं करेगा जो आप चाहते हैं। आपको अभी भी हिंसक I / O थ्रूपुट मिलेगा, लेकिन यह गंदे लोगों के बजाय स्वच्छ पृष्ठों का होगा।

स्वैप नहीं होने से, सिस्टम क्लीन (अनमॉडिफाइड) पेजों के कैश को जीरो के पास कंप्रेस कर देगा, क्योंकि ये इकलौते ऐसे पेज हैं जो इसे फिजिकल मेमोरी से बेदखल कर सकते हैं। यह केवल गंदे (संशोधित) पृष्ठों को मेमोरी से निकालकर स्वैप करने के लिए लिख सकता है, बिना स्वैप के, इससे गंदे पृष्ठों को निकालने का कोई तरीका नहीं है।

जैसा कि आप भौतिक मेमोरी पर कम चलते हैं, प्रत्येक प्रक्रिया को अपने कोड पृष्ठों को डिस्क से लोड करना होगा क्योंकि यह पिछले प्रक्रिया कोड पृष्ठों को दिखाता है। परिणाम स्वैप थ्रस्टिंग द्वारा किए गए हिंसक थ्रशिंग और अत्यधिक काम होगा।

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


1
यह केवल तभी सच है जब आप सभी मेमोरी को कम आवंटित करते हैं। एक भागने की प्रक्रिया आमतौर पर बहुत अधिक आवंटित करने की कोशिश कर रही होगी, और इसलिए इसे जल्दी से मार दिया जाएगा, उस मेमोरी को मुक्त कर देगा, जैसा कि अधिक आवंटन को समायोजित करने की कोशिश करने के लिए सिस्टम को स्वैप करने के लिए जारी रखने का विरोध किया जाता है, इसलिए, स्वैप को अक्षम करना मददगार हो सकता है जब आप केवल एक भगोड़ा प्रक्रिया से अपने राम उपयोग को अधिकतम करते हैं।
Psusi

1
सभी स्मृति के बस बहुत सुंदर हमेशा आवंटित किया जाएगा। लिनक्स को विशेष रूप से इस तरह से ट्यून किया गया है। cat /proc/meminfoलोड के कुछ घंटों के बाद किसी भी विशिष्ट लिनक्स बॉक्स पर करें ।
डेविड श्वार्ट्ज

2
@syockit यदि आप पेजिंग को अक्षम करते हैं, तो आप कोई प्रोग्राम नहीं चला सकते। पेजिंग वह तंत्र है जिसके द्वारा मेमोरी में मैप किए जाने पर फाइलें पढ़ी जाती हैं।
डेविड श्वार्ट्ज

2
@psusi: स्वच्छ पृष्ठों को कम से कम नहीं किया जाएगा जब आपके पास स्वैप होगा। इसके बजाय यह उन गंदे, गुमनाम पृष्ठों को स्वैप कर देगा जिनका हाल ही में उपयोग नहीं किया गया है। बेशक, किसी भी तरह से आप हिंसक पिटाई करेंगे, अगर काम करने का सेट भौतिक मेमोरी से अधिक है। मुद्दा यह है कि, स्वैप के साथ या उसके बिना, आपको वास्तव में स्मृति से बाहर चलाने से पहले बहुत सारे हिंसक थ्रशिंग मिलेंगे। अंतर यह है कि, अदला-बदली के साथ हिंसक थपकी (गंदे पृष्ठ, लिखना और पढ़ना) स्वैपिंग होगी। स्वैप के बिना, हिंसक थ्रेशिंग कोड दोष होंगे (स्वच्छ पृष्ठ, केवल पढ़ें)।
डेविड श्वार्ट्ज

2
@ अपुस्सी: अगर आप एक भगोड़ा प्रक्रिया है तो आप सही हैं कि तेजी से मेमोरी खपत होती है। लेकिन यह ओपी के बारे में बात नहीं कर रहा है, जो एक ऐसी प्रक्रिया है जो अत्यधिक खपत करती है, लेकिन अनबाउंड या सामूहिक रूप से अत्यधिक नहीं, स्मृति। जैसे-जैसे यह बड़े स्वीट स्पॉट (जहां कैश निचोड़ा जाता है) के माध्यम से बढ़ता है, यह सिस्टम के जोर के रूप में अधिक से अधिक धीरे-धीरे बढ़ेगा।
डेविड श्वार्ट्ज

13

स्वैप को बंद करने से बेहतर उपाय, जो स्मृति के कम होने पर यादृच्छिक प्रक्रियाओं को मारने का सबसे अच्छा कारण होगा, नेट से सामान खींचने वाली प्रक्रियाओं के लिए प्रति प्रक्रिया डेटा खंड की सीमा निर्धारित करना है। इस तरह एक भगोड़ा ब्राउज़र सीमा से टकराएगा और मर जाएगा, बजाय इसके कि पूरा सिस्टम बेकार हो जाए। उदाहरण, खोल से

(ulimit -d 400000; firefox) &

-D के बाद की संख्या किलोबाइट्स में है। आपको अपने ब्राउज़िंग आदतों के लिए सर्वोत्तम मूल्य चुनने के लिए अपने सिस्टम पर इस पर प्रयोग करना चाहिए। कोष्ठक के कारण एक उपधारा बनाया जा सकता है; ulimit कमांड केवल उस शेल और उसके बच्चों को प्रभावित करता है, इसके प्रभाव को पेरेंट शेल से अलग करता है।


क्या यह क्रोमियम के लिए काम करेगा, जहां हम chromiumस्मृति के छोटे विखंडू का उपयोग करके प्रक्रियाओं का एक गुच्छा बनाते हैं?
jberryman

@jberryman नहीं, स्मृति सीमाएँ प्रति उपयोगकर्ता के बजाय प्रति-प्रक्रिया हैं।
काइल जोन्स

क्या यह एक निर्दिष्ट सिग्नल भेजने का एक तरीका है (जैसे, SIGHUP) जब यह मेमोरी सीमा तक पहुंचता है?
गेरिमिया

1
@Geremia No. brk और sbrk सिस्टम कॉल काम करना बंद कर देती हैं, जिससे ज्यादातर चीजें कर्ल हो जाती हैं और मर जाती हैं।
काइल जोन्स

यदि आप मैन्युअल ट्यूनिंग के साथ जाना चाहते हैं, तो मैं सुझाव दूंगा कि आप मेमोरी सिमग्रुप का उपयोग करें क्योंकि इसमें मेमोरी सीग्रुप के साथ आप पूरी प्रक्रिया समूह के लिए सीमा निर्धारित कर सकते हैं और बंद करने के लिए मेमोरी आवंटन प्रक्रिया को कॉन्फ़िगर कर सकते हैं और आपकी उपयोगकर्ता मोड नीति प्रक्रिया तय कर सकती है कि क्या हो सकता है करते हैं (उदाहरण के लिए, कुछ संकेतों को भेजें, मारे जाने की प्रक्रिया का चयन करें, मक्खी पर मेमोरी सीमा बढ़ाएं)। देखें kernel.org/doc/Documentation/cgroup-v1/memory.txt और kernel.org/doc/Documentation/cgroup-v2.txt जानकारी के लिए।
मिकको रेंटालिनेन

4

यह सुनिश्चित करने के लिए कि स्वैप का उपयोग नहीं किया गया है, आप बूट पर जोड़े जा रहे किसी भी स्वैप को रोकने से बेहतर होंगे। यह swapबूट सेवा को अक्षम करके या केवल स्वैप प्रविष्टि में टिप्पणी करके, सिस्टम के आधार पर किया जा सकता है /etc/fstab

जहां तक ​​आपके हैंगअप की बात है, तो stop()फंक्शन /etc/init.d/swapएक क्लू दे सकता है:

stop()
{
       ebegin "Deactivating swap devices"

       # Try to unmount all tmpfs filesystems not in use, else a deadlock may
       # occure. As $RC_SVCDIR may also be tmpfs we cd to it to lock it
       cd "$RC_SVCDIR"
       umount -a -t tmpfs 2>/dev/null

       case "$RC_UNAME" in
               NetBSD|OpenBSD) swapctl -U -t noblk >/dev/null;;
               *)              swapoff -a >/dev/null;;
       esac
       eend 0
}

गतिरोध के बारे में हिस्सा नोटिस करें । आप स्वैप बंद करने से पहलेumount -a -t tmpfs खुद को करने की कोशिश कर सकते हैं ।


संपादित करें:

संभवतः, आप sysctlसेटिंग को संशोधित करके भी अपना लक्ष्य प्राप्त कर सकते हैं ( यह प्रश्न देखें )।


मैं नहीं है swapमें init.d, और न ही मैं इस पर है fstab, लेकिन मैं क्या ज़रूरत है /etc/init.d/mountoverflowtmpकि माउंट tmpfsआपात लॉग लेखन के लिए। क्या स्वैप डेमॉन tmpfsभी उपयोग करता है?
11

आप इसे कहीं और सक्षम कर सकते हैं - करते हैं grep -RF swap /etc/ यदि आप इसे ढूंढना चाहते हैं तो करें। लेकिन एक सेवा को निष्क्रिय करने के लिए, आप एक कमांड का उपयोग करेंगे service(IIRC; मैं खुद डेबियन का उपयोग नहीं करता)।
rozcietrzewiacz

1
स्वैप स्वयं का उपयोग नहीं करता है tmpfs, क्योंकि tmpfsएक इन-मेमोरी (रैम) फाइलसिस्टम है। लेकिन अन्य सेवाओं / कार्यक्रमों का उपयोग tmpfsविशेष रूप से स्वैप पर निर्भर हो सकता है। मैं वास्तव में नहीं जानता, लेकिन यह कैशिंग या एक विशेष तरीके से करने के लिए कुछ हो सकता है जिसमें tmpfsड्राइवर स्वैप स्थान तक पहुंच का दावा करता है।
rozcietrzewiacz

लिनक्स वर्चुअल मेमोरी को कैसे हैंडल करता है, इसके बारे में कुछ है जो मुझे समझ में नहीं आता है। मैंने ज्यादातर तरीकों से स्वैप को अक्षम कर दिया है: के माध्यम से swapoff, और के माध्यम से vm.swappiness=0। फिर kswapd0भी चलता है! मुझे आश्चर्य है कि अगर यह 2.4 दिनों से एक प्रतिगमन है ...
syockit

5
@syockit यह अपेक्षित व्यवहार है। सिस्टम अभी भी स्वच्छ पृष्ठों (उन पृष्ठों को स्वैप कर रहा है जिनमें फ़ाइल डेटा की प्रतियां हैं)। स्वच्छ पृष्ठों की अदला-बदली के लिए इसे स्वैप स्थान की आवश्यकता नहीं है, क्योंकि इन्हें स्वैप के अलावा अन्य स्रोतों से वापस पढ़ा जा सकता है।
डेविड श्वार्ट्ज

2

प्रत्येक बूट के बाद /etc/fstabचलने की तुलना में स्वैप विभाजन प्रविष्टि पर टिप्पणी करना बेहतर है swapoff -a

मैं अपने हार्डवेयर पर kswapd0 के साथ एक ही मुद्दा है।

ट्यूनिंग vm.swappinessसिस्टम पैरामीटर मेरे लिए मदद नहीं करता है।

sysctl -w vm.swappiness=0

मैंने बहुत सारे पोस्ट देखे, मेलिंग लिस्ट देखी और अब मुझे लगता है कि यह कर्नेल बग है।

जब कोई सक्रिय स्वैप विभाजन नहीं होता है और मुफ्त मेमोरी कम हो जाती है तो कुछ थ्रेशोल्ड (मेरे मामले में लगभग 300 एमबी) सिस्टम kswapd0 पागलपन के कारण गैर-जिम्मेदार हो जाता है।

संभवतः इसे विशेष कॉन्फ़िगरेशन और शर्तों के साथ पुन: प्रस्तुत किया जाता है।

किसी के लिए यह सिस्टम री-इंस्टॉलेशन द्वारा हल किया जाता है, kswapd0विकलांगों के साथ कस्टम कर्नेल का निर्माण करके दूसरों के लिए पुन: विभाजन के साथ ।


2
यदि kswapd0आप पागल हो जाते हैं और आपके पास स्वैप सक्रिय नहीं है तो आप रैम से बाहर हैं। आपकी पसंद OOM किलर हैं या kswapd0। लिनक्स के साथ चला जाता है kswapd0क्योंकि कर्नेल मानता है कि प्रक्रिया को समाप्त करने की तुलना में धीरे-धीरे समाप्त करना अधिक महत्वपूर्ण है। कैजुअल इंसानों के लिए, जहां दहलीज सोचती है कि पर्याप्त आगे की प्रगति अभी भी होती है, पहले से ही ग्लेशियल धीमा है और लगभग कोई भी OOM Killer का चयन करेगा।
मिकको रेंटालीनें

1

मेरे सिस्टम पर (डेबियन साइड 2016-11-15), मैंने ऐसा किया:

  1. अब स्वैप अक्षम करें:

    swapoff -a
    
  2. / etc / fstab में स्वैप विभाजन के साथ लाइन पर टिप्पणी करें

    #### #UUID=c6ddbc95-3bb5-49e1-ab25-b1c505e5360c none            swap    sw              0       0
    
  3. systemd में स्वैप के बढ़ते को अक्षम करें:

    systemctl --type swap
    systemctl stop dev-sda6.swap
    systemctl mask dev-sda6.swap
    

यह पर्याप्त होगा। /etc/initramfs-tools/conf.d/resumeफ़ाइल में स्वैप का संदर्भ है । मुझे नहीं पता कि इसका उद्देश्य क्या है। शायद यह फ़ाइल अगले रिबूट पर एक समस्या होगी (मैं अभी तक रिबूट करने की कोशिश नहीं करता, मेरा अपटाइम कीमती है;))।


1

कंप्यूटर पृष्ठभूमि में I / O थ्रूपुट के साथ हिंसक होता है। iotop ने kswapd0 को अपराधी होने का खुलासा किया

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


क्या यह कर्नेल पैच पहले से ही मुख्य है?
मानवतावादी

@humanityANDpp शायद नहीं, क्योंकि यह उतना अच्छा नहीं है (जैसा कि मैं एक प्रोग्रामर नहीं हूं), हालांकि मैंने इसके साथ कुछ मुद्दों में भाग लिया, जैसे: कभी-कभी, कार्यभार के आधार पर, इस पैच के साथ , आप मामलों में मेमोरी से बाहर भाग सकते हैं जिसमें इस पैच के बिना आपके पास नहीं होगा और इस तरह OOM- किलर Xorg और xfwm4 को मार देगा, UNLESS I echo 1 | sudo tee /proc/sys/vm/drop_cachesतब चलाएगा जब Active(file):(/ proc / meminfo में) 2GB से अधिक हो (16G RAM सिस्टम पर) -यह अधिकतम 4G में जा सकता है
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.