किसी विशिष्ट प्रोग्राम को स्वैप करने से कैसे रोकें?


23

क्या किसी विशेष प्रोग्राम (यानी रिदमबॉक्स और उसकी निर्भरता) को कभी भी स्वैप करने से डिस्क पर रोकना संभव है?

मैं पूछ रहा हूं क्योंकि मुझे एक समस्या है जब एक संगीत खिलाड़ी को हिचकी आती है जब भी क्रोमियम बहुत अधिक मेमोरी करता है। क्या इसके आसपास काम करने का कोई तरीका है? यह विंडोज में अब कोई समस्या नहीं है, इसलिए संभवतः एक रास्ता है।


टॉम्बॉय की भी यही समस्या है। यह उन कारणों में से एक है, जिन्हें कुछ लोगों ने GNote में बदल दिया है ।
क्रिस्टियन सियुपिटु

1
मुझे लगता है कि हिचकी की समस्या स्वैपिंग के कारण जरूरी नहीं है। यदि प्रोग्राम कुछ खेल रहा है, तो लिनक्स को यह नोटिस करना चाहिए और इसे स्वैप नहीं करना चाहिए। प्रोग्राम जो बहुत कुछ नहीं करते हैं वे पहले वाले हैं जो स्वैप हो जाते हैं। क्या आपने रन किया है psया topयह देखने के लिए कि क्या rhytmbox RSS/ RESफ़ील्ड की जाँच करके वास्तव में स्वैप किया गया है ? मुझे लगता है कि आपकी समस्या ज्यादातर अनुचित समय-निर्धारण के कारण होती है। आपको renicerhytmbox प्रक्रिया की कोशिश करनी चाहिए या इसकी कुछ सेटिंग्स को बदलना चाहिए , जैसे ऑडियो बफर का आकार।
क्रिस्टियन सियुपिटु

1
धन्यवाद! क्या किसी प्रोग्राम के शुरुआती अच्छे मूल्य को सेट करने का कोई तरीका है? / आदि / निकेत या कुछ और? :)
एलेक्सी एवेरेंको

जवाबों:


10

मुझे लगता है कि हिचकी की समस्या स्वैपिंग के कारण जरूरी नहीं है। यदि कोई प्रोग्राम कुछ खेल रहा है, तो लिनक्स को यह नोटिस करना चाहिए और इसे स्वैप नहीं करना चाहिए। प्रोग्राम जो बहुत कुछ नहीं करते हैं वे पहले वाले हैं जो स्वैप हो जाते हैं। आप जाँच कर सकते हैं कि प्रोग्राम वास्तव में psRSS / topRES से / फ़ील्ड को देखकर स्वैप हो रहा है या नहीं । निवासी सेट आकार, एक गैर-स्वैप की गई भौतिक मेमोरी है जिसका उपयोग कोई कार्य कर रहा है (किलो में)।RSS

मुझे लगता है कि आपकी समस्या संभवतया अनुचित सीपीयू और आई / ओ शेड्यूलिंग और रिदमबॉक्स की थोड़ी अक्षमता के कारण है जो इसे उच्च सिस्टम लोड के प्रति संवेदनशील बनाता है। सीपीयू प्राथमिकता को कमांड को अच्छा और त्याग के साथ बदला जा सकता है । आयनिस कमांड के साथ I / O प्राथमिकता को बदला जा सकता है । केवल सुपर उपयोगकर्ता उच्च प्राथमिकताओं का उपयोग कर सकता है। आपको यह भी पता होना चाहिए कि लिनक्स कर्नेल लोग विभिन्न कम-विलंबता पैच के साथ डेस्कटॉप सिस्टम की जवाबदेही में सुधार करने की कोशिश कर रहे हैं, इसलिए आप उनका उपयोग करने पर विचार कर सकते हैं। उनमें से एक माइक गैलब्रेथ द्वारा लिखित ~ 200 लाइनों का पैच है जिसने लिनस को भी प्रभावित किया है। इस पैच का विकल्प Lennart Poettering का cgroups trick है जो मुझे लगता है कि फेडोरा 15 में डिफ़ॉल्ट होगा।

वैसे भी, उन पैच के बिना दो विकल्प हैं: कार्यक्रम को एक उच्च प्राथमिकता के साथ शुरू करें या बाद में इसे बदल दें। पहले विकल्प के लिए आप रिदमबॉक्स के चारों ओर एक आवरण लिपि का उपयोग कर सकते हैं:

#!/bin/sh
# Run Rhytmbox with high CPU and I/O priorities
nice -n -10 ionice -c 1 -n 1 su -l -c rhythmbox alexei

आपको इसे रूट के रूप में चलाने की आवश्यकता होगी। यदि आप इसे शुरू करने के लिए केवल रूट के रूप में लॉगिन नहीं करना चाहते हैं, तो आप suया तो उपयोग कर सकते हैं या sudo

प्राथमिकता को बदलने के लिए, यदि आप इसे बदलने के लिए रूट के रूप में लॉगिन करने के लिए बहुत आलसी हैं, तो आप क्रोन जॉब का उपयोग करने का प्रयास कर सकते हैं जो हर 5 मिनट में चलता है और rhythmboxप्रक्रिया की प्राथमिकता निर्धारित करता है, लेकिन मैं ऐसा करने की अनुशंसा नहीं करूंगा:

#!/bin/sh
renice -n -10 -p `pidof rhythmbox`
ionice -c 1 -n 1 -p `pidof rhythmbox`

5

संक्षिप्त उत्तर: आप नहीं कर सकते, और नहीं करना चाहिए।

एक लंबे समय से पहले निष्पादन योग्य फ़ाइलों ने चिपचिपा बिट का सम्मान किया था +tजो कर्नेल को स्वैप नहीं करने के लिए कहेंगे, लेकिन आज इसे अनदेखा किया गया है।

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

यदि आप वास्तव में स्वैप नहीं करना चाहते हैं, तो अधिक रैम प्राप्त करें, या बस # swapoff -a(पुनः नहीं, यदि आप पहले से ही समस्याएं हैं तो आपके सिस्टम को अनुपयोगी बना सकते हैं)।

Shouldn'tतब जाता है जब आप कुछ ऐप विकसित कर रहे होते हैं और यह नहीं चाहते कि यह बिल्कुल स्वैप हो। स्टैकओवरफ़्लो पर इस पोस्ट पर एक नज़र डालें ।


2
मुझे नहीं लगता कि लगभग 100 MiB को जला देने से मेरा सिस्टम ख़त्म हो जाएगा। शायद मेरी विशेष समस्या को हल करने का एक और तरीका है (संपादित प्रश्न देखें)?
अलेक्सी एवरचेंको

1
यदि आप अन्य प्रक्रियाओं पर उच्च स्तर की जवाबदेही पर एक प्रक्रिया रखने का इरादा रखते हैं, तो उत्तर अच्छा है (आपको ऐसा करने के लिए मूल होना चाहिए)। मेमोरी पेजिंग के साथ मैसेज करना आसान नहीं है यदि आप अपने हाथों को गंदा नहीं करना चाहते हैं (कोड, recompile, या यहां तक ​​कि LD_PRELOAD करने के लिए कस्टम लाइब्रेरी को प्रक्रिया को बेवकूफ बनाने और स्मृति को आवंटित करने के लिए उपयोग किए जाने वाले फ़ंक्शन को फिर से जोड़ना - फिर से अनुशंसित नहीं) । सलाह ? प्रक्रिया को दोबारा शुरू करें, अधिक रैम प्राप्त करें, या टैब खोलना बंद करें;)
टोरियन

5
"यदि कर्नेल यह तय करता है कि उसे स्वैप करना है, तो यह निश्चित रूप से एक वैध कारण है" यह सच नहीं है। आज मेरे पास 1,3G मुफ्त मेमोरी थी। लिनक्स कर्नेल ने मेरी httpd प्रक्रियाओं को स्वैपिंग (370M) में डाला।
bluszcz

@bluszcz (ठीक है, इसे पढ़ने वाले अन्य लोग उस टिप्पणी को कितना पुराना मानते हैं): ऐसा इसलिए हो सकता है क्योंकि यह निर्णय लिया गया है कि आपके httpd द्वारा सेव की गई फ़ाइलों के लिए डिस्क कैश आपके httpd के शायद ही कभी उपयोग किए जाने वाले भागों की तुलना में अधिक महत्वपूर्ण है - अन्य उत्तर देखें "स्वपन" का उल्लेख।
Jan Schejbal

@JanSchejbal thats क्योंकि linux, कम से कम किसी को यह बताए बिना, पता नहीं है कि क्या प्रक्रियाएं महत्वपूर्ण हैं या नहीं। एक सर्वर वातावरण में, आपको सिस्टम को यह बताने में सक्षम होना चाहिए कि कौन सी प्रक्रिया महत्वपूर्ण है और कौन सी नहीं। "मुझे अन्य चीजों की परवाह नहीं है, लेकिन ये प्रक्रियाएं इस सर्वर के संचालन के लिए सबसे महत्वपूर्ण हैं"
राही


3

ऐसा करने के कई तरीके हैं। आप कोशिश कर सकते हैं कि स्वैग के साथ कम (आमतौर पर) लिनक्स काम के लिए "कहते हैं" :

echo 10 > /proc/sys/vm/swappiness

से: https://www.kernel.org/doc/Documentation/sysctl/vm.txt

swappiness

इस नियंत्रण का उपयोग यह निर्धारित करने के लिए किया जाता है कि कर्नेल मेमोरी पेजों को कितना आक्रामक करेगा। उच्च मूल्यों से आक्रामकता बढ़ेगी, निचले मूल्यों में स्वैप की मात्रा में कमी होगी।

डिफ़ॉल्ट मान 60 है।

अन्य विकल्प cgroups कर्नेल प्रबंधक का उपयोग करें, यह प्रति-प्रक्रिया विशिष्ट है लेकिन आपके पास करने के लिए कुछ "काम" होगा: यहां उत्तर दिया गया: /unix/10214/per-process-swassiness-for -Linux # 10227


1
यह विश्व स्तर पर स्वैग को प्रभावित करता है, प्रक्रिया-विशेष को नहीं।
लोरेंजो वॉन मैटरहॉर्न

1
हाँ, आप नोटिस कर सकते हैं कि "(आम तौर पर)" मैंने लिखा था। प्रति-प्रक्रिया होने का विकल्प cgroups का उपयोग करके अन्य उत्तर के लिए लिंक है।
Ceinmart

फिर वह कोई मदद नहीं है, है ना?
केन शार्प

केन शार्प: यह उत्तर समस्या के सर्वोत्तम समाधान की तरह (कम से कम पहली नज़र में) लगता है कि सीधे जोड़ने वाला एकमात्र है। तो ... आपने जो कहा, उससे बहुत ज्यादा विपरीत।
फिल्स

@ आपको यह काम नहीं आता है।
केन शार्प

0

आप mlockall()syscall का उपयोग कर सकते हैं । mlockall () बल मेमोरी प्रोसेस रेजिडेंट होने के लिए (= कोई स्वैप नहीं, कोई ओवरकॉमिट नहीं है, आदि ...)। AFAIK, इसे करने के लिए कोई शेल कमांड नहीं है, लेकिन इसे बनाना आसान है। ऐसा लगेगा:

if (mlockall(MCL_FUTURE | MCL_CURRENT))
     perror("mlockall");
execvp(argv[0], argv);

ध्यान दें, आपको कॉल करने के लिए रूट होना चाहिए mlockall()

हालांकि, जैसा कि अन्य उत्तर में कहा गया है, मुझे नहीं लगता कि यह वास्तव में आप क्या चाहते हैं।


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