डॉक्टर डॉक में धारा 9.6 "ओवरकॉमिट और ओओएम" का कहना है कि @dunxd उल्लेख विशेष रूप से ओवरकमिटी को अनुमति देने के खतरों पर ग्राफिक है। हालांकि, 80
मेरे लिए भी दिलचस्प लग रहा था, इसलिए मैंने कुछ परीक्षण किए।
मैंने पाया कि overcommit_ratio
सभी प्रक्रियाओं के लिए उपलब्ध कुल रैम को प्रभावित करता है। रूट प्रक्रियाओं को सामान्य उपयोगकर्ता प्रक्रियाओं से भिन्न नहीं माना जाता है।
अनुपात को 100
या उससे कम करने के लिए क्लासिक शब्दार्थ प्रदान करना चाहिए जहां से वापसी मान malloc/sbrk
विश्वसनीय हैं। इसे अनुपात से कम सेट करना 100
गैर-प्रक्रिया गतिविधियों जैसे कैशिंग और आगे के लिए अधिक रैम आरक्षित करने का एक तरीका हो सकता है।
इसलिए, मेरे कंप्यूटर पर 24 जीएबी रैम के साथ, स्वैप अक्षम के साथ, 9 जीएबी उपयोग में, top
दिखाने के साथ
Mem: 24683652k total, 9207532k used, 15476120k free, 19668k buffers
Swap: 0k total, 0k used, 0k free, 241804k cached
यहाँ कुछ overcommit_ratio
सेटिंग्स हैं और कितना RAM मेरा राम-उपभोक्ता कार्यक्रम हड़प सकता है (प्रत्येक पृष्ठ को छूना) - प्रत्येक मामले में कार्यक्रम एक बार malloc
विफल होने पर सफाई से बाहर निकल जाता है ।
50 ~680 MiB
60 ~2900 MiB
70 ~5200 MiB
100 ~12000 MiB
रूट उपयोगकर्ता के रूप में कुछ के साथ एक बार में कई चल रहे हैं, कुल राशि का एक साथ उपभोग नहीं किया। यह दिलचस्प है कि यह पिछले 3+ GiB या तो उपभोग करने में असमर्थ था; free
बहुत यहाँ क्या दिखाया गया है नीचे ड्रॉप नहीं किया:
Mem: 24683652k total, 20968212k used, 3715440k free, 20828k buffers
प्रयोग गड़बड़ थे - कुछ भी जो इस समय मॉलोक का उपयोग करता है सभी रैम दुर्घटना में उपयोग में है, क्योंकि कई प्रोग्रामर सी में मॉलोक विफलताओं की जाँच के बारे में भयानक हैं, कुछ लोकप्रिय संग्रह पुस्तकालय इसे पूरी तरह से अनदेखा करते हैं, और सी ++ और विभिन्न अन्य भाषाएँ भी हैं और भी बुरा।
काल्पनिक रैम के अधिकांश शुरुआती कार्यान्वयन मैंने बहुत ही विशिष्ट मामले को संभालने के लिए किए थे, जहां एक बड़ी प्रक्रिया - उपलब्ध स्मृति का 51% + कहती है - कुछ समर्थन कार्यक्रम के fork()
क्रम में आवश्यक exec()
, आमतौर पर एक बहुत, बहुत छोटा। कॉपी-ऑन-राइट सेमेटिक्स के साथ ओएस की अनुमति होगी fork()
, लेकिन अगर यह साबित हो जाए कि कांटे की प्रक्रिया ने वास्तव में बहुत सारे मेमोरी पेजों को संशोधित करने की कोशिश की है (जिनमें से प्रत्येक को फिर से प्रारंभिक प्रक्रिया से स्वतंत्र एक नए पेज के रूप में इंस्टेंट करना होगा) यह अंत में मार डाला जाएगा। अधिक मेमोरी आवंटित करने पर अभिभावक प्रक्रिया केवल खतरे में थी, और कुछ अन्य प्रक्रिया के मरने के लिए थोड़ा इंतजार करके, और फिर जारी रखने के लिए कुछ मामलों में, बाहर चल रहा है। बच्चे की प्रक्रिया आमतौर पर केवल (आमतौर पर छोटे) कार्यक्रम के माध्यम से खुद को प्रतिस्थापित करती हैexec()
और फिर अनंतिम से मुक्त था।
लिनक्स की ओवरकमिट अवधारणा एक चरम दृष्टिकोण है जो दोनों fork()
को होने देता है और साथ ही एकल प्रक्रियाओं को व्यापक रूप से समग्र करने की अनुमति देता है। OOM-हत्यारा-कारण होने वाली मौतों एसिंक्रोनस हो भी प्रोग्राम हैं जो करने के लिए करते हैं संभाल स्मृति आवंटन जिम्मेदारी से। मैं व्यक्तिगत रूप से सिस्टम-वाइड ओवरकमिट से सामान्य रूप से नफरत करता हूं और विशेष रूप से ऊम-किलर - यह एक शैतान को बढ़ावा देता है, जो स्मृति प्रबंधन के लिए दृष्टिकोण की देखभाल करता है जो पुस्तकालयों को संक्रमित करता है और उनके माध्यम से हर ऐप जो उनका उपयोग करता है।
मैं 100 के अनुपात को सेट करने का सुझाव दूंगा, और एक स्वैप विभाजन होने के साथ-साथ आम तौर पर केवल बड़ी प्रक्रियाओं द्वारा उपयोग किया जा रहा समाप्त होगा - जो अक्सर केवल स्वयं के हिस्से के एक छोटे से हिस्से का उपयोग कर रहे हैं जो स्वैप में भर जाता है, और इस प्रकार। OOM किलर मिसफिट्योर से प्रक्रियाओं के विशाल बहुमत की रक्षा करें। यह आपके वेबसर्वर को बेतरतीब मौत से सुरक्षित रखना चाहिए, और अगर यह malloc
जिम्मेदारी से संभालने के लिए लिखा गया था , यहां तक कि खुद को मारने से भी सुरक्षित है (लेकिन बाद में दांव न लगाएं)।
इसका मतलब है कि मैं इसमें प्रयोग कर रहा हूं /etc/sysctl.d/10-no-overcommit.conf
vm.overcommit_memory = 2
vm.overcommit_ratio = 100