टी एल; डॉ
संक्षिप्त अस्थायी / उत्तर
- सबसे आसान : एक छोटा स्वैप विभाजन है और कर्नेल से झूठ को जीने की कोशिश कर रहा है कि धीमी भंडारण से प्रक्रियाओं को चलाने से कोई स्मृति सीमा नहीं है।
- एक बड़ी स्वैप के साथ, OOM (मेमोरी मैनेजर से बाहर) जल्द ही कार्रवाई नहीं करता है। आमतौर पर, यह वर्चुअल मेमोरी के अनुसार खाता है और मेरे पिछले अनुभव में, चीजों को तब तक नहीं मारता है जब तक कि पूरे स्वैप को भर नहीं जाता है, इसलिए थ्रैशिंग और क्रॉलिंग सिस्टम ...
- हाइबरनेट के लिए बड़ा स्वैप चाहिए?
- प्रयास / समस्याग्रस्त : कुछ ulimits (उदाहरण के लिए जाँच करें
ulimit -v
, और शायद as
विकल्प का उपयोग करके एक कठिन या नरम सीमा निर्धारित करें limits.conf
) सेट करें। यह काफी अच्छी तरह से काम करता था, लेकिन WebKit को शुरू करने के लिए धन्यवाद gigacage
, कई सूक्ति एप्लिकेशन अब असीमित पते रिक्त स्थान की उम्मीद करते हैं और चलाने में विफल रहते हैं!
- प्रयास / समस्याग्रस्त : यह ओवरकम नीति और अनुपात इसे प्रबंधित करने और इसे कम करने का प्रयास करने का एक और तरीका है (उदाहरण
sysctl vm.overcommit_memory
के लिए sysctl vm.overcommit_ratio
, लेकिन यह दृष्टिकोण मेरे लिए कारगर नहीं रहा।
- मुश्किल / जटिल : सबसे महत्वपूर्ण प्रक्रियाओं (जैसे ssh) के लिए एक cgroup प्राथमिकता लागू करने का प्रयास करें, लेकिन वर्तमान में यह cgroup v1 के लिए बोझिल लगता है (उम्मीद है कि v2 इसे आसान बना देगा) ...
मैंने भी पाया:
लंबे समय तक समाधान
प्रतीक्षा करें और कुछ अपस्ट्रीम पैच के लिए स्थिर डिस्ट्रो कर्नेल में आने की उम्मीद करें। इसके अलावा, आशा है कि डिस्ट्रो वेंडर बेहतर ट्यून कर्नेल डिफॉल्ट और बेहतर लीवरेज सिस्टमडग ग्रुप्स को डेस्कटॉप संस्करणों में जीयूआई जवाबदेही को प्राथमिकता देने के लिए।
ब्याज के कुछ पैच:
तो यह केवल खराब यूजर स्पेस कोड और डिस्ट्रो कॉन्फिगर / डिफॉल्ट नहीं है जो गलती पर है - कर्नेल इसे बेहतर तरीके से संभाल सकता है।
पहले से ही विचार किए गए विकल्पों पर टिप्पणियाँ
1) स्वैप को अक्षम करें
कम से कम एक छोटे स्वैप विभाजन प्रदान करने की सिफारिश की जाती है ( क्या हमें वास्तव में आधुनिक प्रणालियों पर स्वैप की आवश्यकता है? )। स्वैप को अक्षम करने से न केवल अप्रयुक्त पृष्ठों को स्वैप करने से रोका जा सकता है, बल्कि यह मेमोरी को आवंटित करने के लिए कर्नेल की डिफ़ॉल्ट हेयुरिस्टिक ओवरकम रणनीति को भी प्रभावित कर सकता है ( Overcommit_memory = 0 माध्य में हेयर्सिस्टिक्स क्या है? ), क्योंकि हेरास्टिक स्वैप पेजों की गणना करता है। स्वैप के बिना, ओवरकमिट अभी भी हेयुरिस्टिक (0) या हमेशा (1) मोड में काम कर सकता है, लेकिन बिना स्वैप और कभी नहीं (2) ओवरकमिटी रणनीति का संयोजन एक भयानक विचार है। इसलिए ज्यादातर मामलों में, कोई भी स्वैप प्रदर्शन की संभावना नहीं करेगा।
उदाहरण के लिए, एक लंबी चलने वाली प्रक्रिया के बारे में सोचें जो शुरू में एक बार के काम के लिए मेमोरी को छूती है, लेकिन फिर उस मेमोरी को जारी करने में विफल रहती है और पृष्ठभूमि को चालू रखती है। जब तक प्रक्रिया समाप्त नहीं होती तब तक कर्नेल को RAM का उपयोग करना होगा। किसी भी स्वैप के बिना, कर्नेल इसे कुछ और के लिए पृष्ठ नहीं दे सकता है जो वास्तव में रैम का सक्रिय रूप से उपयोग करना चाहता है। यह भी सोचें कि कितने देव आलसी हैं और उपयोग के बाद स्मृति को स्पष्ट रूप से मुक्त नहीं करते हैं।
3) अधिकतम मेमोरी अलिमेट सेट करें
यह केवल प्रति प्रक्रिया पर लागू होता है, और यह संभवतः एक उचित धारणा है कि एक प्रक्रिया को अधिक मेमोरी का अनुरोध नहीं करना चाहिए जो कि एक प्रणाली शारीरिक रूप से है! तो शायद यह एक उपयोगी पागल प्रक्रिया को रोकने के लिए उपयोगी है, जबकि अभी भी उदारता से सेट होने के दौरान थ्रैडिंग को ट्रिगर किया जा सकता है।
4) स्मृति में महत्वपूर्ण कार्यक्रम (X11, bash, किल, टॉप, ...) रखें और उन पर कभी स्वैप न करें
अच्छा विचार है, लेकिन तब वे कार्यक्रम स्मृति को सक्रिय रूप से उपयोग नहीं कर रहे हैं। यह स्वीकार्य हो सकता है यदि प्रोग्राम केवल मामूली मात्रा में मेमोरी का अनुरोध करता है।
systemd 232 रिलीज़ ने कुछ विकल्प जोड़े हैं जो इसे संभव बनाते हैं: मुझे लगता है कि एक यूनिट (सेवा) को रोकने के लिए 'मेमोरीस्वापमेक्स = 0' का उपयोग किया जा सकता है, जैसे कि इसमें से कोई भी मेमोरी को स्वैप किया गया हो।
फिर भी, मेमोरी एक्सेस को प्राथमिकता देने में सक्षम होना बेहतर होगा।
लंबी व्याख्या
लिनक्स कर्नेल सर्वर वर्कलोड के लिए अधिक ट्यून किया गया है, इसलिए GUI जवाबदेही दुखद रूप से एक माध्यमिक चिंता का विषय है ... उबंटू 16.04 एलटीएस के डेस्कटॉप संस्करण पर कर्नेल मेमोरी प्रबंधन सेटिंग्स अन्य सर्वर संस्करणों से अलग नहीं लगती थीं। यह भी RHEL / CentOS 7.2 में आमतौर पर सर्वर के रूप में उपयोग किए जाने वाले चूक से मेल खाता है।
OOM, ulimit और जवाबदेही के लिए ईमानदारी से व्यापार करना
स्वैप थ्रैशिंग (जब मेमोरी का वर्किंग सेट, अर्थात किसी दिए गए कम समय-सीमा में पठन और लेखन के पेज भौतिक RAM से अधिक हो जाते हैं) हमेशा I / O को लॉकअप स्टोरेज करेगा - कोई भी कर्नेल विजार्ड इस प्रक्रिया से मारे बिना किसी सिस्टम को नहीं बचा सकता है। या दो...
मैं उम्मीद कर रहा हूँ कि लिनक्स OOM ट्वीक अधिक साथ आने वाले कर्नेल को पहचानता है कि यह वर्किंग सेट भौतिक मेमोरी स्थिति से अधिक है और एक प्रक्रिया को मारता है। जब ऐसा नहीं होता है, तो थ्रशिंग की समस्या होती है। समस्या यह है कि एक बड़े स्वैप विभाजन के साथ, यह देख सकता है जैसे कि सिस्टम में अभी भी हेडरूम है, जबकि कर्नेल पूरी तरह से कमिट करता है और फिर भी मेमोरी अनुरोधों को पूरा करता है, लेकिन वर्किंग सेट स्वैप में खत्म हो सकता है, प्रभावी रूप से यदि स्टोरेज का इलाज करने की कोशिश कर रहा है, तो यह RAM है।
सर्वर पर, यह एक निर्धारित, धीमी गति से, डेटा खोना, व्यापार बंद करने के लिए प्रदर्शन के दंड को स्वीकार नहीं करता है। डेस्कटॉप पर, व्यापार बंद अलग होता है और उपयोगकर्ता चीजों को उत्तरदायी बनाए रखने के लिए डेटा हानि (प्रक्रिया बलिदान) को थोड़ा पसंद करेंगे।
यह OOM: oom_pardon, उर्फ मेरे xlock को मार नहीं है के बारे में एक अच्छा हास्यमय उपमा थी
संयोग से, OOMScoreAdjust
वजन को कम करने और अधिक महत्वपूर्ण मानी जाने वाली OOM हत्या प्रक्रियाओं से बचने के लिए एक और प्रणालीगत विकल्प है।
बफ़रेड राइटबैक
मुझे लगता है कि " बैकग्राउंड राइटबैक न हो चूसें " कुछ मुद्दों से बचने में मदद करेगा जहां एक प्रक्रिया हॉगिंग रैम एक और अदला-बदली का कारण बनता है (डिस्क को लिखें) और बल्क डिस्क को कुछ और लिखने के लिए आईओ चाहते हैं। यह स्वयं समस्या का कारण नहीं है, लेकिन यह जवाबदेही में समग्र गिरावट को जोड़ता है।
सीमा को समाप्त करता है
Ulimits के साथ एक समस्या यह है कि लेखांकन एक सीमा वर्चुअल मेमोरी एड्रेस स्पेस (जो भौतिक और स्वैप स्पेस दोनों के संयोजन का अर्थ है) पर लागू होती है। प्रति man limits.conf
:
rss
maximum resident set size (KB) (Ignored in Linux 2.4.30 and
higher)
इसलिए केवल भौतिक रैम उपयोग के लिए आवेदन करने के लिए एक उल्टी सेट करना अब उपयोगी नहीं दिखता है। इसलिये
as
address space limit (KB)
लगता है केवल सम्मानित ट्यूनबल है।
वेबआइट / ग्नोम के उदाहरण के अनुसार विस्तृत रूप में, Unfortunalty, वर्चुअल एड्रेस स्पेस आवंटन सीमित होने पर कुछ एप्लिकेशन नहीं चल सकते हैं।
cgroups को भविष्य में मदद करनी चाहिए?
वर्तमान में, यह बोझिल लगता है, लेकिन कुछ कर्नेल cgroup झंडे cgroup_enable=memory swapaccount=1
(उदाहरण के लिए ग्रब कॉन्फ़िगरेशन) को सक्षम करना संभव है और फिर मेमोरी उपयोग को सीमित करने के लिए cgroup मेमोरी कंट्रोलर का उपयोग करने का प्रयास करें।
cgroups में अधिक उन्नत मेमोरी लिमिट फीचर हैं, फिर 'ulimit' विकल्प। सीजीग्रुप v2 नोटों में सुधार के प्रयासों पर संकेत दिया गया है कि कैसे काम किया।
संयुक्त मेमोरी + स्वैप अकाउंटिंग और लिमिटिंग को स्वैप स्पेस पर वास्तविक नियंत्रण द्वारा प्रतिस्थापित किया जाता है।
सीजीग्रुप विकल्प सिस्टमड रिसोर्स कंट्रोल विकल्पों के माध्यम से सेट किए जा सकते हैं। उदाहरण के लिए:
अन्य उपयोगी विकल्प हो सकते हैं
इनमें कुछ कमियां हैं:
- ओवरहेड। वर्तमान डॉक्यूमेंट डॉक्यूमेंट में संक्षेप में 1% अतिरिक्त मेमोरी उपयोग और 10% प्रदर्शन में गिरावट (शायद स्मृति आवंटन संचालन के संबंध में - यह वास्तव में निर्दिष्ट नहीं है) का उल्लेख है।
- Cgroup / systemd सामान को हाल ही में फिर से काम किया गया है, इसलिए फ्लक्स अपस्ट्रीम का अर्थ है कि लिनक्स डिस्ट्रो वेंडर पहले सेटल होने का इंतजार कर रहे होंगे।
में cgroup वी 2 , वे बताते हैं कि memory.high
थ्रोटल के लिए एक अच्छा विकल्प होना चाहिए और एक प्रक्रिया समूह द्वारा स्मृति उपयोग का प्रबंधन। हालाँकि यह उद्धरण बताता है कि स्मृति दबाव स्थितियों की निगरानी के लिए और अधिक काम करने की आवश्यकता थी (2015 तक)।
मेमोरी प्रेशर का एक उपाय - मेमोरी की कमी के कारण वर्कलोड कितना प्रभावित हो रहा है - यह निर्धारित करना आवश्यक है कि वर्कलोड को अधिक मेमोरी की आवश्यकता है या नहीं; दुर्भाग्य से, स्मृति दबाव निगरानी तंत्र अभी तक लागू नहीं हुआ है।
यह देखते हुए कि systemd और cgroup उपयोगकर्ता अंतरिक्ष उपकरण जटिल हैं, मुझे कुछ उपयुक्त सेट करने और आगे इसका लाभ उठाने का एक सरल तरीका नहीं मिला है। Ubuntu के लिए cgroup और systemd प्रलेखन महान नहीं है। भविष्य का काम डेस्कटॉप एडिशन के साथ cgroups और systemd का लाभ उठाने के लिए होना चाहिए ताकि उच्च मेमोरी प्रेशर, ssh और X-Server / विंडो मैनेजर घटकों के तहत सीपीयू, फिजिकल रैम और स्टोरेज IO को उच्च प्राथमिकता प्राप्त हो, ताकि प्रक्रियाओं से मुकाबला न किया जा सके। स्वैपिंग में व्यस्त। कर्नेल का CPU और I / O प्राथमिकता सुविधाएँ कुछ समय के लिए आस-पास रहे हैं। ऐसा लगता है कि भौतिक रैम की प्राथमिकता में कमी है।
हालांकि, सीपीयू और आईओ प्राथमिकताएं भी उचित रूप से निर्धारित नहीं हैं !? जब मैंने systemd cgroup की सीमाएँ जाँची, cpu शेयर आदि को लागू किया, जहाँ तक मैं बता सकता था, उबंटू ने किसी भी पूर्व-परिभाषित प्राथमिकताओं में सेंकना नहीं किया था। जैसे मैं भागा:
systemctl show dev-mapper-Ubuntu\x2dswap.swap
मैंने ssh, samba, gdm और nginx के समान आउटपुट की तुलना की। GUI और रिमोट एडमिन कंसोल जैसी महत्वपूर्ण चीजों को थ्रेशिंग होने पर अन्य सभी प्रक्रियाओं के साथ समान रूप से लड़ना पड़ता है।
उदाहरण मेमोरी सीमा मेरे पास 16 जीबी रैम सिस्टम पर है
मैं हाइबरनेट सक्षम करना चाहता था, इसलिए मुझे एक बड़े स्वैप विभाजन की आवश्यकता थी। इसलिए अल्सर, आदि के साथ कम करने का प्रयास।
ulimit
मैं डाल * hard as 16777216
में /etc/security/limits.d/mem.conf
ऐसी है कि कोई भी प्रक्रिया को और अधिक स्मृति से शारीरिक रूप से संभव है अनुरोध करने के लिए अनुमति दी जाएगी। मैं सभी को एक साथ जोर देने से नहीं रोकूंगा, लेकिन बिना किसी लालच के स्मृति उपयोग, या स्मृति रिसाव के साथ एक ही प्रक्रिया, थ्रैशिंग का कारण बन सकती है। उदाहरण के लिए मैंने gnome-contacts
8GB + मेमोरी को चूसना देखा है जब एक एक्सचेंज सर्वर से वैश्विक पते की सूची को अपडेट करने जैसे सांसारिक चीजें कर रहा है ...
जैसा कि देखा गया है ulimit -S -v
, कई डिस्ट्रोस में इस कठिन और नरम सीमा को 'असीमित' के रूप में सेट किया गया है, सिद्धांत रूप में, एक प्रक्रिया बहुत सारी मेमोरी का अनुरोध कर सकती है, लेकिन केवल एक उपसमुच्चय का सक्रिय रूप से उपयोग कर सकती है, और खुशी से सोच सकती है कि इसे 24GB RAM कहा गया है। सिस्टम में केवल 16GB है। उपरोक्त हार्ड सीमा उन प्रक्रियाओं का कारण बनेगी जो कि कर्नेल को उनके लालची सट्टा मेमोरी अनुरोधों से इनकार करने पर ठीक से चलाने में सक्षम हो सकती है।
हालांकि, यह गनोम कॉन्टैक्ट्स जैसी पागल चीजों को भी पकड़ता है और अपने डेस्कटॉप जवाबदेही को खोने के बजाय, मुझे "पर्याप्त मुक्त मेमोरी नहीं" त्रुटि मिलती है:
पता स्थान (वर्चुअल मेमोरी) के लिए उल्टी सेट करने वाली जटिलताएं
दुर्भाग्य से, कुछ डेवलपर्स वर्चुअल मेमोरी का दिखावा करना पसंद करते हैं, एक अनंत संसाधन है और वर्चुअल मेमोरी पर एक उल्टी सेट करने से कुछ एप्लिकेशन टूट सकते हैं। उदाहरण के लिए WebKit (जो कुछ सूक्ति एप्लिकेशन पर निर्भर करता है) ने एक gigacage
सुरक्षा सुविधा जोड़ी है , जो FATAL: Could not allocate gigacage memory
एक अजीब संकेत के साथ वर्चुअल मेमोरी और त्रुटियों की पागल मात्रा आवंटित करने की कोशिश करता Make sure you have not set a virtual memory limit
है। काम के आसपास,GIGACAGE_ENABLED=no
सुरक्षा लाभों को माफ़ करता है, लेकिन इसी तरह, वर्चुअल मेमोरी आवंटन को सीमित करने की अनुमति नहीं दी जा रही है, यह एक सुरक्षा सुविधा भी है (जैसे संसाधन नियंत्रण जो सेवा से इनकार को रोक सकता है)। विडंबना यह है कि गिगास और गनोम देव के बीच, वे यह भूल जाते हैं कि स्मृति आवंटन को सीमित करना अपने आप में एक सुरक्षा नियंत्रण है। और दुख की बात यह है कि मैंने ऐसे गनोम ऐप पर गौर किया है जो गीगाज़ पर भरोसा करते हैं, स्पष्ट रूप से उच्च सीमा का अनुरोध करने से परेशान नहीं होते हैं, इसलिए इस मामले में एक नरम सीमा भी चीजों को तोड़ देती है।
निष्पक्ष होने के लिए, यदि कर्नेल ने वर्चुअल मेमोरी के बजाय निवासी मेमोरी उपयोग के आधार पर मेमोरी आवंटन से इनकार करने में सक्षम होने का बेहतर काम किया, तो वर्चुअल मेमोरी का दिखावा करना कम खतरनाक नहीं होगा।
ओवरकमिट
यदि आप अनुप्रयोगों को मेमोरी एक्सेस से वंचित करना पसंद करते हैं और ओवरकॉमिटिंग बंद करना चाहते हैं, तो नीचे दिए गए आदेशों का उपयोग करके परीक्षण करें कि उच्च मेमोरी दबाव के दौरान आपका सिस्टम कैसे व्यवहार करता है।
मेरे मामले में, डिफ़ॉल्ट प्रतिबद्ध अनुपात था:
$ sysctl vm.overcommit_ratio
vm.overcommit_ratio = 50
लेकिन यह केवल पूर्ण प्रभाव में आता है जब ओवरकमिटिंग को अक्षम करने और अनुपात को लागू करने के लिए नीति को बदलते हुए
sudo sysctl -w vm.overcommit_memory=2
केवल 24GB मेमोरी के अनुपात में कुल मिलाकर (16GB RAM * 0.5 + 16GB SWAP) आवंटित किया जा सकता है। इसलिए मैं शायद OOM को कभी नहीं दिखाऊंगा, और प्रभावी रूप से स्वैप में लगातार मेमोरी एक्सेस करने की प्रक्रियाएं होने की संभावना कम होगी। लेकिन मैं भी समग्र प्रणाली दक्षता का त्याग करूँगा।
यह कई अनुप्रयोगों को क्रैश करने का कारण बनेगा, यह देखते हुए कि देवों के लिए एक स्मृति आवंटन अनुरोध घटने वाले ओएस को सावधानीपूर्वक संभालना सामान्य नहीं है। यह अलग-अलग ऐप्स के दुर्घटनाग्रस्त होने के अधिक जोखिम वाले थ्रैशिंग (हार्ड रीसेट के बाद आपके सारे काम ढीले करने) के कारण कभी-कभी ड्रॉ आउट लॉकअप के जोखिम को रोक देता है। मेरे परीक्षण में, यह बहुत मदद नहीं करता था क्योंकि जब सिस्टम मेमोरी के दबाव में था तब डेस्कटॉप ही दुर्घटनाग्रस्त हो गया और यह मेमोरी आवंटित नहीं कर सका। हालांकि, कम से कम कंसोल और एसएसएच ने अभी भी काम किया है।
वीएम ओवरकमिट मेमोरी काम कैसे करता है अधिक जानकारी है।
मैंने इसके लिए डिफ़ॉल्ट रूप से रिवर्ट करने का विकल्प चुना, sudo sysctl -w vm.overcommit_memory=0
पूरे डेस्कटॉप ग्राफिकल स्टैक और इसमें दिए गए एप्लिकेशन को फिर भी क्रैश कर दिया।