लिनक्स को पढ़कर स्‍मैप में वापस स्‍पैप करें


28

जब मैं एक ऐसी एप्लीकेशन चलाता हूं जिसमें 16GB की फिजिकल मेमोरी का उपयोग करने पर लिनक्स कर्नेल मेमोरी से अधिकांश पेजों को स्वैप कर देता है। एप्लिकेशन के खत्म होने के बाद, हर क्रिया (टाइपिंग कमांड, वर्कस्पेस को स्विच करना, एक नया वेब पेज खोलना आदि) पूरा होने में बहुत लंबा समय लेता है क्योंकि संबंधित पेजों को पहले स्वैप से वापस पढ़ने की जरूरत होती है।

क्या प्रत्येक एप्लिकेशन को मैन्युअल रूप से स्पर्श (और प्रतीक्षा करने) के बिना भौतिक मेमोरी में वापस स्वैप करने के लिए लिनक्स कर्नेल को बताने का एक तरीका है? मैं बहुत सारे एप्लिकेशन चलाता हूं इसलिए प्रतीक्षा हमेशा दर्दनाक होती है।

मैं अक्सर swapoff -a && swapon -aसिस्टम को फिर से उत्तरदायी बनाने के लिए उपयोग करता हूं , लेकिन यह स्वैप से पृष्ठों को साफ करता है, इसलिए अगली बार जब मैं स्क्रिप्ट चलाता हूं तो उन्हें फिर से लिखना होगा।

क्या कर्नेल इंटरफ़ेस है, शायद sysfs का उपयोग करके, कर्नेल को स्वैप से सभी पृष्ठ पढ़ने के लिए निर्देश देने के लिए?

संपादित करें: मैं वास्तव में अदला-बदली करने के लिए एक रास्ता खोज रहा हूं। (धन्यवाद अपमान!)

[PS serverfault.com/questions/153946/… और serverfault.com/questions/100448/… संबंधित विषय हैं, लेकिन यह स्पष्ट नहीं है कि लिनक्स कर्नेल को स्वैप से पृष्ठों को कॉपी करने के तरीके को स्पष्ट स्वैप के बिना कैसे कॉपी करें।]


आप चाहते हैं कि स्वैप सभी सिस्टम की मेमोरी का कैश हो? तो आप सिस्टम की मेमोरी की एक छवि चाहते हैं जिसे आप फिर से लोड कर सकते हैं? यह मूल रूप से हाइबरनेशन कैसे काम करता है - सिस्टम अपनी मेमोरी को डिस्क, पावर ऑफ और पावर अप पर इमेज को पुनर्स्थापित करता है। क्या कोई मौका है, क्या आपको लगता है कि उस थ्रेड का अनुसरण करने पर आपके लिए मददगार हो सकता है? उदाहरण के लिए, यदि आप अपनी मेमोरी की छवि बनाना चाहते हैं, तो स्वैप को अक्षम करें, एक कार्य को पूरा करें, फिर छवि को पुनर्स्थापित करें और दोहराएं - क्या यह ऐसा कुछ है जिसे आप करना चाहते हैं?
mikeserv

मुझे नहीं लगता कि यह बदली हुई अवस्था में स्वैप छोड़ देगा। जैसा कि यह मुझे लगता है कि आपका सुझाव स्वैप-स्वेपन विधि के लिए एक विकल्प है।
ड्रॉसम

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

जवाबों:


4

मूल रूप से मेमर्डप कार्यक्रम के आधार पर यहां पाया गया है कि मैंने चुनिंदा अनुप्रयोगों को मेमोरी में वापस पढ़ने के लिए एक स्क्रिप्ट बनाई है। remember:

#!/bin/bash
declare -A Q
for i in "$@"; do
    E=$(readlink /proc/$i/exe);
    if [ -z "$E" ]; then.
        #echo skipped $i;.
        continue;.
    fi
    if echo $E | grep -qF memdump; then.
        #echo skipped $i >&2;.
        continue;.
    fi
    if [ -n "${Q[${E}]}" ]; then.
        #echo already $i >&2;.
        continue;.
    fi
    echo "$i $E" >&2
    memdump $i 2> /dev/null
    Q[$E]=$i
done | pv -c -i 2 > /dev/null

उपयोग: कुछ इस तरह

# ./remember $(< /mnt/cgroup/tasks )
1 /sbin/init
882 /bin/bash
1301 /usr/bin/hexchat
...
2.21GiB 0:00:02 [ 1.1GiB/s] [  <=>     ]
...
6838 /sbin/agetty
11.6GiB 0:00:10 [1.16GiB/s] [      <=> ]
...
23.7GiB 0:00:38 [ 637MiB/s] [   <=>    ]
# 

यह गैर-स्वैप की गई मेमोरी (गीगाबाइट्स प्रति सेकंड) पर जल्दी से रुक जाता है और स्वैप की आवश्यकता होने पर धीमा हो जाता है।


यह उपकरण वही करता है जो मैं देख रहा था। धन्यवाद!
ड्रम

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

11

यह अप करने में मदद कर सकता है /proc/sys/vm/page-cluster(डिफ़ॉल्ट: 3)।

कर्नेल प्रलेखन से ( sysctl/vm.txt):

पेज-क्लस्टर

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

यह एक लघुगणक मूल्य है - इसे शून्य पर सेट करने का अर्थ है "1 पृष्ठ", इसे 1 का अर्थ है "2 पृष्ठ", इसे 2 के लिए सेट करने का अर्थ है "4 पृष्ठ", आदि शून्य पूरी तरह से स्वैपहैड को निष्क्रिय करता है।

डिफ़ॉल्ट मान तीन (एक समय में आठ पृष्ठ) है। यदि आपके कार्यभार में तीव्र-गहनता है, तो इसे एक अलग मूल्य में बाँधने में कुछ छोटे लाभ हो सकते हैं।

निम्न मानों का अर्थ है प्रारंभिक दोषों के लिए कम विलंबता, लेकिन एक ही समय में अतिरिक्त दोष और I / O दोषों का पालन करने के लिए यदि वे उस निरंतर पृष्ठों का हिस्सा होते हैं जो रीडहेड में लाया जाता है।

दस्तावेज़ में एक सीमा का उल्लेख नहीं है, इसलिए संभवतः आप इस बेतुके उच्च को सेट कर सकते हैं कि स्वैप के सभी को वास्तव में जल्द ही वापस पढ़ा जा सके। और निश्चित रूप से इसे बाद में एक समझदार मूल्य में बदल दें।


यह एक उपयोगी समाधान की तरह लगता है। दो मैनुअल हस्तक्षेपों को एक एकल उपयोगकर्ता हस्तक्षेप बनाने के लिए स्लीप कमांड के साथ जोड़ा जा सकता है। लेकिन, यह जरूरी नहीं है कि सभी स्वैप स्वैच्च्ड बहुत जल्दी कर सकते हैं क्योंकि यह केवल उस पृष्ठ से लगातार पढ़ता है जो एक्सेस किया गया है। यह अब तक का सबसे अच्छा समाधान है। धन्यवाद!
ड्रॉसम

tbh यह शायद सबसे अच्छा समाधान है जिसे आप प्राप्त करने जा रहे हैं। मैंने इसके बारे में पहले नहीं सुना है लेकिन ऐसा लग रहा है कि यह स्वैप को बड़ी IOP की श्रृंखला में बदल देता है बजाय छोटे IOP के एक निरंतर सेट के जो संभवत: आपके प्रदर्शन के मुद्दों का कारण बन रहा है। मैं कानूनी रूप से आश्चर्यचकित रहूंगा यदि ऐसा कुछ है जो आपकी व्यक्तिगत स्थिति को पूरी तरह से संबोधित करता है।
ब्राचली

उस बात के लिए, यदि आप लगातार छोटे स्वैप-इन्स के कारण मंदी का सामना कर रहे हैं, यहां तक ​​कि स्थायी रूप से page-clusterमूल्य को समायोजित करने से प्रदर्शन में सुधार हो सकता है।
इल्मरी करोनन

5

आप उन प्रोग्रामों को जोड़ने की कोशिश कर सकते हैं जिन्हें आप एक cgroup और ट्यूनिंग स्वैगपन के बारे में सबसे अधिक ध्यान रखते हैं ताकि अगली बार जब आप जो प्रोग्राम जोड़ते हैं वह एप्लिकेशन रन हो जाए तो स्वैपिंग के लिए उम्मीदवार होने की संभावना कम है।

उनके पृष्ठों में से कुछ की संभावना अभी भी अदला-बदली होगी, लेकिन यह आपकी प्रदर्शन समस्याओं के आसपास हो सकती है। इसका एक बड़ा हिस्सा संभवतः "स्टॉप एंड स्टार्ट" व्यवहार है जब प्रोग्राम के बहुत सारे पेज स्वैप में होते हैं और प्रोग्राम को लगातार अपने पेज को रैम में स्वैप करना होता है लेकिन केवल 4k वेतन वृद्धि में।

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


4

यह मुझे लगता है कि आप जादुई रूप से "सिस्टम को फिर से उत्तरदायी नहीं बना सकते हैं"। आप या तो जुर्माना या पढ़ने के पन्नों को स्वैप स्पेस से वापस स्मृति में लाते हैं या आप इसे बाद में लाइक करते हैं, लेकिन एक तरीका या दूसरा जिसे आप इसे लाइक करते हैं। वास्तव में, यदि आप कुछ ऐसा करते हैं, swapoff -a && swapon -aतो आप कम होने के बजाय अधिक दर्द महसूस कर सकते हैं , क्योंकि आप कुछ पृष्ठों को स्मृति में वापस कॉपी करने के लिए मजबूर करते हैं, जिन्हें अन्यथा फिर से कभी भी आवश्यकता नहीं होगी और अंततः पढ़े बिना ही गिरा दिया जाएगा (विचार करें: आपने एक आवेदन छोड़ दिया जबकि इसके ढेरों की अदला-बदली की जाती है; उन पन्नों को पूरी तरह से खारिज किया जा सकता है, जिन्हें कभी भी स्मृति में वापस पढ़े बिना)।

लेकिन यह स्वैप से पृष्ठों को साफ करता है, इसलिए अगली बार जब मैं स्क्रिप्ट चलाऊंगा तो उन्हें फिर से लिखना होगा।

खैर, बहुत ज्यादा किसी भी पृष्ठ को जो मुख्य मेमोरी में स्वैप से वापस कॉपी हो जाता है, वैसे भी संशोधित किया जाना है, इसलिए यदि भविष्य में इसे फिर से स्वैप करने के लिए वापस ले जाने की आवश्यकता है, तो इसे वैसे भी स्वैप में नए सिरे से लिखा जाना होगा। ध्यान रखें कि स्वैप मुख्य रूप से मेमोरी है, केवल पढ़ने वाले पृष्ठ (जो आमतौर पर फ़ाइल-समर्थित हैं) नहीं।

मुझे लगता है कि आपकी swapoff -a && swapon -aचाल उतनी ही अच्छी है जितनी कुछ भी आप के साथ आ सकती है।


हम में से दो एक ही समय में एक ही बात कह रहे हैं;)
गोल्डिलॉक्स

@goldilocks हाँ, मैंने देखा कि आपका जवाब मेरे सामने आने से पहले तैयार था, लेकिन मैं पहले से ही ऐसा कर रहा था इसलिए मैं इसके साथ फंस गया हूं
सेलाडा

आप और गोल्डीलॉक्स एक ही बात कहते हैं लेकिन मुझे विश्वास नहीं होता कि स्वैप कैशिंग कैसे काम करता है। मेरी समझ यह है कि आपके पास एक ही समय में स्वैप और मेमोरी में पेज हो सकते हैं। मेमोरी में पेज अपडेट होने के बाद स्वैप पेज केवल अमान्य हो जाता है।
ड्रॉसम

मुझे विश्वास है कि आपने डेविड स्पिललेट द्वारा जो उत्तर दिया है वह सही है: आप वास्तव में एक ही समय में स्वैप और रैम में एक पृष्ठ रख सकते हैं ... लेकिन केवल जब तक कि राम संस्करण संशोधित नहीं हो जाता। फिर आपको स्वैप में आउट-ऑफ-डेट कॉपी छोड़नी होगी। जब मैंने कहा "बहुत ज्यादा किसी भी पृष्ठ को जो स्वैप से वापस कॉपी हो जाता है [...] वैसे भी संशोधित होने वाला है" मेरा मतलब है कि मुझे उम्मीद है कि यह वही होता है जो ज्यादातर समय होता है, इसलिए मुझे पृष्ठों की उम्मीद नहीं है दोनों स्थानों पर एक महत्वपूर्ण अंश के बारे में चिंता करने लायक है।
सेलडा

आपका उपयोग परिदृश्य भिन्न हो सकता है: आपके पास बड़े ढेर के साथ बहुत सारे अनुप्रयोग हो सकते हैं जो अक्सर पढ़े जाते हैं और लिखे नहीं जाते हैं। मेरी भावना यह है कि अधिकांश लोगों के पास ऐसा कोई परिदृश्य नहीं है। लेकिन अगर आप करते हैं, तो मुझे लगता है कि आप सही हैं: swapoff -a && swapon -aआपके लिए अच्छा नहीं होगा। मुझे लगता है कि उस स्थिति में आपको कुछ ऐसा चाहिए होगा जो /proc/<each-process>/memरैम में मौजूद मेमोरी के प्रत्येक पृष्ठ को स्कैन और रीड करे। पता नहीं कि क्या मौजूद है।
सेलाडा

0

यहाँ एक बहुत अच्छी चर्चा है http://rudd-o.com/en/linux-and-free-software/tales-from-responsivenessland-why-linux-feels-slow-and-how-to-fix-that जो घटते-बढ़ते स्वपनदोष को उकसाता है, इस विचार के साथ कि सिस्टम की कथित जवाबदेही को बढ़ाने के लिए कोड को स्वैप करने से रोका जाना चाहिए (और ऐसा ही होता है)। यह वास्तव में आपके प्रश्न का उत्तर नहीं है, लेकिन यह समस्या को प्रकट होने से रोक सकता है (आपके एप्लिकेशन केवल स्वैप नहीं किए जाते हैं, केवल अप्रयुक्त डेटा और पेज कैश)


जब भी यह सैद्धांतिक रूप से प्रश्न का उत्तर दे सकता है, तो उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर होगा
स्लम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.