मुझे लगा कि स्वैप का पूरा सार एक अस्थायी स्टोरेज सेफ्टी नेट के रूप में कार्य करना है जब RAM भरा था, लेकिन मेरे स्वैप विभाजन का लगातार उपयोग किया जा रहा है, भले ही मेरे पास कभी-कभी 3GB मुक्त रैम के रूप में है। क्या यह सामान्य है?
मुझे लगा कि स्वैप का पूरा सार एक अस्थायी स्टोरेज सेफ्टी नेट के रूप में कार्य करना है जब RAM भरा था, लेकिन मेरे स्वैप विभाजन का लगातार उपयोग किया जा रहा है, भले ही मेरे पास कभी-कभी 3GB मुक्त रैम के रूप में है। क्या यह सामान्य है?
जवाबों:
आप अपना "स्वपन" मान बदलने का प्रयास कर सकते हैं:
से उबंटू के स्वैप पूछे जाने वाले प्रश्न :
स्वैग क्या है और मैं इसे कैसे बदल सकता हूं?
स्वैपी पैरामीटर कर्नेल की प्रक्रिया को भौतिक मेमोरी से बाहर और स्वैप डिस्क पर स्थानांतरित करने की प्रवृत्ति को नियंत्रित करता है। क्योंकि डिस्क रैम की तुलना में बहुत धीमी है, यह सिस्टम और अनुप्रयोगों के लिए धीमी प्रतिक्रिया समय पैदा कर सकता है अगर प्रक्रियाएं बहुत आक्रामक रूप से स्मृति से बाहर हो जाती हैं।
स्वैग में 0 और 100 के बीच का मान हो सकता है
swappiness = 0 कर्नेल को यथासंभव लंबे समय तक भौतिक मेमोरी से स्वैपिंग प्रक्रियाओं से बचने के लिए कहता है। कर्नेल संस्करण 3.5 और नए के लिए यह स्वैच्छिकता को अक्षम करता है।
स्वैपीनेस = 100 शारीरिक मेमोरी से प्रक्रियाओं को आक्रामक रूप से स्वैप करने के लिए कर्नेल को बताता है और उन्हें कैश स्वैप करने के लिए स्थानांतरित करता है
उबंटू में डिफ़ॉल्ट सेटिंग स्वैपीनेस = 60 है। स्वैग के डिफ़ॉल्ट मान को कम करने से संभवतः एक विशिष्ट उबंटू डेस्कटॉप स्थापना के लिए समग्र प्रदर्शन में सुधार होगा। स्वैप्पीनेस = 10 के मूल्य की सिफारिश की जाती है, लेकिन प्रयोग करने में संकोच न करें। नोट: उबंटू सर्वर इंस्टॉलेशन में डेस्कटॉप सिस्टम के लिए अलग-अलग प्रदर्शन आवश्यकताएं हैं, और 60 का डिफ़ॉल्ट मान अधिक उपयुक्त है।
स्वैग्मेंटेशन वैल्यू चेक करने के लिए
cat /proc/sys/vm/swappiness
Swappiness value को बदलने के लिए 10 के swappiness value के साथ एक अस्थायी परिवर्तन (रिबूट पर खो दिया) के साथ किया जा सकता है
sudo sysctl vm.swappiness=10
परिवर्तन को स्थायी बनाने के लिए , अपने पसंदीदा संपादक के साथ कॉन्फ़िगरेशन फ़ाइल को संपादित करें:
gksudo gedit /etc/sysctl.conf
Vm.swappiness की खोज करें और उसका मान वांछित रूप से बदलें। यदि vm.swappiness मौजूद नहीं है, तो इसे फ़ाइल के अंत में इस तरह जोड़ें:
vm.swappiness=10
फ़ाइल सहेजें और रिबूट करें।
इसके अलावा आप देख सकते हैं: https://askubuntu.com/a/103916/54187
sudo sysctl --load=/etc/sysctl.conf
परिवर्तनों को लागू करने के लिए फ़ाइल को संपादित करने के बाद चलाएँ
आपके प्रश्न के कुछ अलग पहलू हैं।
सबसे पहले, "फ्री" की आपकी परिभाषा क्या है। यह वास्तव में उतना आसान नहीं है जितना कि लिनक्स (या किसी भी आधुनिक ऑपरेटिंग सिस्टम) में लगता है।
कैसे RAM रैम का उपयोग करता है (बहुत सरलीकृत)
प्रत्येक एप्लिकेशन आपकी कुछ मेमोरी का उपयोग कर सकता है। लिनक्स "कैश" के रूप में ( अन्यथा पिछले कुछ एमबी को छोड़कर) सभी अन्यथा अनुपयोगी मेमोरी का उपयोग करता है । इसमें पेज कैश, इनकोड कैश आदि शामिल हैं। यह एक अच्छी बात है - यह चीजों को गति देने में मदद करता है। डिस्क पर लिखना और डिस्क से पढ़ना दोनों को कैश द्वारा अत्यधिक खर्च किया जा सकता है।
आदर्श रूप से, आपके पास अपने सभी अनुप्रयोगों के लिए पर्याप्त मेमोरी है, और आपके पास कैश के लिए अभी भी कई सौ एमबी शेष हैं। इस स्थिति में, जब तक आपके एप्लिकेशन अपने मेमोरी उपयोग में वृद्धि नहीं करते हैं और सिस्टम कैश के लिए पर्याप्त स्थान पाने के लिए संघर्ष नहीं कर रहा है, तब तक किसी भी स्वैप की कोई आवश्यकता नहीं है।
एक बार जब एप्लिकेशन अधिक रैम का दावा करते हैं, तो यह बस उस स्थान में से कुछ में चला जाता है जो कैश द्वारा सिकुड़ जाता था। डी-आवंटन कैश सस्ता और आसान है कि यह बस वास्तविक समय में किया जाता है - सब कुछ जो कैश में बैठता है या तो किसी चीज़ की एक दूसरी प्रति है जो पहले से ही डिस्क पर है, इसलिए बस तुरंत ही निपटा जा सकता है, या यह कुछ ऐसा है जो हम वैसे भी अगले कुछ सेकंड के भीतर डिस्क को फ्लश करना पड़ा है ।
यह ऐसी स्थिति नहीं है जो लिनक्स के लिए विशिष्ट है - सभी आधुनिक ऑपरेटिंग सिस्टम इस तरह से काम करते हैं। अलग-अलग ऑपरेटिंग सिस्टम सिर्फ फ्री रैम को अलग तरीके से रिपोर्ट कर सकते हैं: कुछ में कैश को शामिल किया जाता है, जिसे वे "फ्री" मानते हैं और कुछ नहीं।
जब आप मुफ्त रैम के बारे में बात करते हैं, तो यह कैश को शामिल करने के लिए बहुत अधिक सार्थक है , क्योंकि यह व्यावहारिक रूप से मुफ़्त है - यह उपलब्ध है, इसे किसी भी आवेदन का अनुरोध करना चाहिए। लिनक्स पर, free
कमांड इसे दोनों तरीकों से रिपोर्ट करता है - पहली पंक्ति में प्रयुक्त रैम कॉलम में कैश शामिल है, और दूसरी पंक्ति में फ्री कॉलम में कैश (और बफ़र्स) शामिल हैं।
कैसे लिनक्स स्वैप का उपयोग करता है (और भी सरल)
एक बार जब आप पर्याप्त मेमोरी का उपयोग कर लेते हैं, तो सुचारू रूप से चलने वाले कैश के लिए पर्याप्त नहीं होता है, तो लिनक्स रैम से स्वैप के लिए कुछ अप्रयुक्त एप्लिकेशन मेमोरी को फिर से आवंटित करने का निर्णय ले सकता है।
यह एक निश्चित कट-ऑफ के अनुसार ऐसा नहीं करता है। यह ऐसा नहीं है कि आप आवंटन के एक निश्चित प्रतिशत तक पहुंच जाते हैं तो लिनक्स स्वैप करना शुरू कर देता है। यह एक बल्कि "फजी" एल्गोरिथ्म है। यह बहुत सी चीजों को ध्यान में रखता है, जिसे "स्मृति आवंटन के लिए कितना दबाव है" द्वारा सबसे अच्छा वर्णन किया जा सकता है। यदि नई मेमोरी आवंटित करने के लिए बहुत अधिक "दबाव" है, तो इससे संभावना बढ़ जाएगी कि कुछ को अधिक कमरे बनाने के लिए स्वैप किया जाएगा। यदि कम "दबाव" है तो यह इन अवसरों को कम करेगा।
आपके सिस्टम में एक "स्वैप्पीनेस" सेटिंग है जो आपको ट्विक करने में मदद करती है कि इस "दबाव" की गणना कैसे की जाती है। यह आमतौर पर इसे बदलने की सिफारिश नहीं की जाती है, और मैं आपको इसे बदलने की सिफारिश नहीं करूंगा। स्वैपिंग कुल मिलाकर एक बहुत अच्छी बात है - हालाँकि कुछ किनारे मामले हैं जहाँ यह प्रदर्शन को नुकसान पहुँचाता है, यदि आप समग्र सिस्टम प्रदर्शन को देखते हैं तो यह विभिन्न प्रकार के कार्यों के लिए शुद्ध लाभ है। यदि आप स्वप्नदोष को कम करते हैं, तो आप कैश मेमोरी की मात्रा को थोड़ा और कम कर देते हैं, अन्यथा यह तब भी होगा जब यह वास्तव में उपयोगी हो सकता है। चाहे आप स्वैपिंग के साथ जो भी समस्या हो उसके लिए यह एक अच्छा व्यापार है। आपको बस पता होना चाहिए कि आप क्या कर रहे हैं, बस इतना ही।
एक अच्छी तरह से ज्ञात स्थिति है जिसमें स्वैप वास्तव में एक डेस्कटॉप सिस्टम पर कथित प्रदर्शन को परेशान करता है, और यह है कि कैसे जल्दी से अनुप्रयोग उपयोगकर्ता इनपुट का जवाब लंबे समय तक बेकार रहने के बाद और आईओ में पृष्ठभूमि प्रक्रियाओं को भारी होने पर दे सकते हैं (जैसे कि रात भर बैकअप) चलाते हैं। यह एक बहुत ही सुस्त सुस्ती है, लेकिन सभी को एक साथ स्वैप करने का औचित्य साबित करने के लिए पर्याप्त नहीं है और किसी भी ऑपरेटिंग सिस्टम में रोकने के लिए बहुत कठिन है। बैकअप / वायरस स्कैन के बाद स्वैप और इस प्रारंभिक सुस्ती को बंद न करें, लेकिन सिस्टम दिन भर थोड़ा धीमा चल सकता है। यह ऐसी स्थिति नहीं है जो लिनक्स तक ही सीमित है।
जब यह चुना जाता है कि डिस्क पर स्वैप किया जाना है, तो सिस्टम मेमोरी को चुनने की कोशिश करता है जो वास्तव में उपयोग नहीं किया जा रहा है - से पढ़ा या लिखा गया है। यह गणना के लिए एक बहुत ही सरल एल्गोरिथ्म है जो ज्यादातर समय अच्छी तरह से चुनता है।
यदि आपके पास एक ऐसी प्रणाली है जहां आपके पास एक बड़ी मात्रा में रैम है (लेखन के समय, 8 जीबी एक विशिष्ट लिनक्स डिस्ट्रो के लिए एक बड़ी राशि है), तो आप शायद ही कभी ऐसी स्थिति मारेंगे जहां स्वैप की बिल्कुल आवश्यकता है। तुम भी स्वैप बंद करने की कोशिश कर सकते हैं। मैं ऐसा करने की सलाह कभी नहीं देता, लेकिन केवल इसलिए कि आप कभी नहीं जानते कि कब अधिक रैम आपको कुछ एप्लिकेशन क्रैश होने से बचा सकता है। लेकिन अगर आपको पता है कि आपको इसकी आवश्यकता नहीं है, तो आप इसे कर सकते हैं।
लेकिन स्वैप मेरे सिस्टम को कैसे गति दे सकता है? धीमी गति से चीजों को स्वैप नहीं करता है?
रैम से स्वैप करने के लिए डेटा को स्थानांतरित करने का कार्य एक धीमा ऑपरेशन है, लेकिन यह केवल तभी लिया जाता है जब कर्नेल को पूरा यकीन है कि यह समग्र लाभ होगा। उदाहरण के लिए, यदि आपकी एप्लिकेशन मेमोरी इस बिंदु पर पहुंच गई है कि आपके पास लगभग कोई कैश नहीं बचा है और I / O इस वजह से बहुत अक्षम है, तो आप वास्तव में कुछ मेमोरी को मुक्त करके अपने सिस्टम से बहुत अधिक गति प्राप्त कर सकते हैं, यहां तक कि डेटा को स्वैप करने के प्रारंभिक खर्च के बाद इसे मुक्त करने के लिए।
यह भी एक अंतिम उपाय है कि आपके आवेदन वास्तव में आपके पास वास्तव में अधिक मेमोरी का अनुरोध करें । इस मामले में, आउट-ऑफ-मेमोरी स्थिति को रोकने के लिए स्वैपिंग आवश्यक है जिसके परिणामस्वरूप अक्सर एक आवेदन दुर्घटनाग्रस्त हो जाएगा या जबरन मार दिया जाएगा।
स्वैपिंग केवल उस समय से जुड़ी होती है जहां आपका सिस्टम खराब प्रदर्शन कर रहा होता है क्योंकि ऐसा कई बार होता है जब आप प्रयोग करने योग्य रैम से बाहर चल रहे होते हैं, जो आपके सिस्टम को धीमा कर देगा (या इसे अस्थिर कर देगा) भले ही आपने स्वैप नहीं किया हो। इसलिए चीजों को सरल बनाने के लिए, स्वैपिंग होती है क्योंकि आपका सिस्टम चारों ओर से दूसरे रास्ते की बजाय नीचे से टकरा रहा है।
एक बार डेटा स्वैप में है, यह फिर से कब निकलता है?
डेटा को स्वैप से बाहर स्थानांतरित करना (पारंपरिक हार्ड डिस्क के लिए, कम से कम) बस समय लेने वाली के रूप में इसे वहां डालने में है। तो समझ लें, आपका कर्नेल स्वैप से डेटा को हटाने के लिए अनिच्छुक होगा, खासकर अगर यह वास्तव में उपयोग नहीं किया जा रहा है (यानी पढ़ा या लिखा हुआ)। आप स्वैप में डेटा है और इसका उपयोग नहीं किया जा रहा है, तो यह वास्तव में एक अच्छी बात है कि यह स्वैप में रहता है, क्योंकि यह अन्य चीजें हैं जो के लिए और अधिक स्मृति छोड़ देता है कर रहे हैं इस्तेमाल किया जा रहा है, जिससे आपकी प्रणाली को तेज।
free -m
।
Swappiness मान सेट करना हर स्थिति में काम नहीं करता है। अगर यह आपके लिए काम करता है, महान। यदि नहीं, तो मैंने समय-समय पर स्वैप को बंद करके और फिर से वापस करने के लिए एक स्क्रिप्ट लिखी है।
यदि आप सावधान नहीं हैं तो टॉगल स्वैप स्वैप थोड़ा जोखिम भरा है। यदि आपके पास पर्याप्त नि: शुल्क रैम नहीं है तो सब कुछ रैम के साथ-साथ स्वैप में सब कुछ रखने के लिए, स्वैप को अक्षम करने की कोशिश करने से आपका सिस्टम अप्रतिसादी हो जाएगा। मेरी स्क्रिप्ट पहले जांच करती है कि क्या पर्याप्त रूप से मुफ्त रैम है (जो थोड़ा सा काम करता है, क्योंकि मुफ्त रैम की वास्तविक मात्रा क्या है जो free
रिपोर्ट के रूप में अलग है ), फिर केवल टॉगल स्वैप अगर ऐसा है। लेकिन, यदि आप RAM पर थोड़े कम हैं, तो स्क्रिप्ट चालू होने के दौरान एक और बड़ी प्रक्रिया शुरू न करें। यह रहा:
#!/bin/bash
# Make sure that all text is parsed in the same language
export LC_MESSAGES=en_US.UTF-8
export LC_COLLATE=en_US.UTF-8
export LANG=en_US.utf8
export LANGUAGE=en_US:en
export LC_CTYPE=en_US.UTF-8
# Calculate how much memory and swap is free
free_data="$(free)"
mem_data="$(echo "$free_data" | grep 'Mem:')"
free_mem="$(echo "$mem_data" | awk '{print $4}')"
buffers="$(echo "$mem_data" | awk '{print $6}')"
cache="$(echo "$mem_data" | awk '{print $7}')"
total_free=$((free_mem + buffers + cache))
used_swap="$(echo "$free_data" | grep 'Swap:' | awk '{print $3}')"
echo -e "Free memory:\t$total_free kB ($((total_free / 1024)) MB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MB)"
# Do the work
if [[ $used_swap -eq 0 ]]; then
echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $total_free ]]; then
echo "Freeing swap..."
swapoff -a
swapon -a
else
echo "Not enough free memory. Exiting."
exit 1
fi
आपको इस स्क्रिप्ट को रूट (जैसे, के साथ sudo
) चलाना होगा । यह स्क्रिप्ट आपके सिस्टम को अनुत्तरदायी नहीं छोड़ेगी; यदि आपके पास अपर्याप्त रैम है, तो यह स्वैप को टॉगल करने से इंकार कर देगा। मैंने इस स्क्रिप्ट का उपयोग पाँच वर्षों के लिए समस्याओं के बिना किया है।
आम तौर पर स्वैप अब अप्रयुक्त प्रणालियों पर अप्रयुक्त रहता है। मेरे अनुभव में, गहन संचालन के बिना लंबे समय तक चलने वाली प्रक्रियाओं को लिनक्स द्वारा स्वैप करने के लिए स्थानांतरित कर दिया जाता है।
यह कुछ प्रभावित कार्यक्रमों को धीमा चलाता है।
यदि आपके पास बहुत सारे राम मुक्त हैं, तो आप कमांड चलाकर स्वैप को बंद कर सकते हैं:
swapoff -av
(आपको इसके sudo
लिए अधिकारों की आवश्यकता होगी ।)
यदि आपको स्वैप बंद पसंद नहीं है, तो आप सममित कमांड का उपयोग करके इसे स्विच कर सकते हैं:
swapon -av
( फिर से sudo
आवश्यक)।
एक बार स्वैप का उपयोग एक कार्यक्रम के लिए किया जाता है, यह कार्यक्रम के जीवन के लिए मैप किए जाने के लिए रहता है। कई कार्यक्रमों में कोड (और डेटा) होता है जिसका उपयोग शायद ही कभी किया जाता है .. एक बार मेमोरी को स्वैप करने के बाद, इसमें स्वैप होने की संभावना नहीं है।
इन पृष्ठों को मेमोरी में बाध्य करने का एक तरीका स्वैप डिवाइस को बंद करना है। यदि आपके पास दो हैं, तो आप एक को बंद कर सकते हैं, इसे वापस चालू कर सकते हैं, फिर दूसरे को बंद कर सकते हैं। यदि स्वैप वास्तव में आवश्यक है, तो यह उपकरणों के बीच चलेगा। आप बस स्वैप डिवाइस (या फ़ाइल) को बंद कर सकते हैं, लेकिन अगर आपको वास्तव में स्वैप स्थान की आवश्यकता है तो कठोर चीजें हो सकती हैं।
मेमोरी में सामान्य चीजों के अलावा, टेम्पो स्वैप स्पेस का उपयोग करता है, और बाकी मेमोरी की तरह स्वैप करेगा। यदि आप ऐसी कोई चीज़ चलाते हैं, जिसमें बहुत सी अस्थायी डिस्क की आवश्यकता होती है, तो यह पृष्ठों को अदला-बदली करने के लिए बाध्य कर सकती है। एक बार बनाई गई अस्थायी फ़ाइलें अब कुछ मिनटों के बाद उपयोग नहीं की जा सकती हैं और स्वैप डिवाइस पर ले जाने के लिए अच्छे उम्मीदवार हैं।
एक चुटकी में आप एक स्वैप डिवाइस के रूप में एक फ़ाइल का उपयोग कर सकते हैं। यह उपयोगी है यदि आपको अस्थायी रूप से अतिरिक्त स्वैप स्थान की आवश्यकता है।
मैंने स्कॉट सेवरेंस की स्क्रिप्ट को मुफ्त के नए संस्करणों से मिलान करने के लिए संपादित किया , जिसमें पहले से ही उपलब्ध कुल मेमोरी फ़ील्ड शामिल है।
#!/bin/bash
free_mem="$(free | grep 'Mem:' | awk '{print $7}')"
used_swap="$(free | grep 'Swap:' | awk '{print $3}')"
echo -e "Free memory:\t$free_mem kB ($((free_mem / 1024)) MiB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MiB)"
if [[ $used_swap -eq 0 ]]; then
echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $free_mem ]]; then
echo "Freeing swap..."
sudo swapoff -a
sudo swapon -a
else
echo "Not enough free memory. Exiting."
exit 1
fi
free -m
,top -b 1