एक विशिष्ट प्रक्रिया के ulimit (खुली फ़ाइलें) को संशोधित करें


27

क्या किसी विशिष्ट प्रक्रिया की नरम - और कठोर सीमा को बदलना संभव है ?

मेरे मामले में, मेरी प्रक्रिया है mongodऔर बहुत सारे वेब संसाधन मुझे केवल निष्पादित करने के लिए कहते हैं:

ulimit -n <my new value>

मेरे वर्तमान विचार:

  • कमांड को उस प्रक्रिया की सीमा कैसे पता चलेगी जिसे मैं संशोधित कर रहा हूं? क्या यह पूरे सिस्टम को फ़ाइल की सीमा को संशोधित नहीं करेगा?
  • मैं अनुमान लगा रहा हूं कि यह कमांड केवल नरम सीमा को बदलता है। तो क्या हार्ड लिमिट को बढ़ाने का भी कोई तरीका है?

क्या आपने इस बहुमूल्य जानकारी को पढ़ा है? docs.mongodb.org/manual/reference/ulimit
tink

हां, मैंने यह सब दिल से सीखा है .. मुझे यकीन नहीं है कि अगर मुझे कुछ याद आ रहा है, लेकिन यह पृष्ठ केवल आपको बताता है कि विवरण कैसे देखें। यह केवल आपको ulimit -n <value> लिखने के लिए कहता है ...
परीक्षण

जवाबों:


29

एक प्रक्रिया setrlimit(2)सिस्टम कॉल के माध्यम से अपनी सीमा बदल सकती है । जब आप दौड़ते हैं ulimit -nतो आपको एक नंबर देखना चाहिए। इस प्रक्रिया के लिए ओपन फाइल डिस्क्रिप्टर (जिसमें फाइलें, सॉकेट, पाइप आदि शामिल हैं) की वर्तमान सीमा है। ulimitआदेश निष्पादित getrlimit(2)सिस्टम कॉल करके पता लगाएं कि वर्तमान मूल्य है।

यहाँ मुख्य बिंदु है: एक प्रक्रिया अपनी मूल प्रक्रिया से अपनी वर्तमान सीमा प्राप्त करती है। इसलिए यदि आप भागते ulimit -n 64हैं तो आप उस शेल फाइल की ओपन फाइल डिस्क्रिप्टर की सीमा 64 पर सेट कर देंगे। शेल शुरू होने वाली किसी भी प्रक्रिया की एक ही सीमा होगी, जब तक कि नई प्रक्रिया setrlimit()उचित रूप से कॉल न करे ।

mongodb'sओपन फाइल डिस्क्रिप्टर सीमा को बदलने के लिए, आप ulimit -n 2048एक शेल में (या जो भी बड़ी संख्या में आपका कर्नेल अनुमति देता है) चलाएंगे । फिर आप उस शेल का उपयोग शुरू करने के लिए करेंगे mongodb। एक बच्चे की प्रक्रिया के रूप में, mongodbओपन फाइल डिस्क्रिप्टर पर (बड़ी) सीमा का वारिस होगा।

सिस्टम की खुली फाइल की सीमा को संशोधित करने के लिए, जो सभी प्रक्रियाओं के योग की तरह लगती है, फाइल डिस्क्रिप्टर की सीमा को खोलती है, आपको संशोधित /etc/sysctl.confऔर रन जैसी कुछ करना होगा sysctl -p। में fs.file-maxपैरामीटर के मूल्य को देखो /etc/sysctl.conf


क्या शानदार व्याख्या है! आपका बहुत बहुत धन्यवाद। मैं तुरंत इस कोशिश करेंगे!
परीक्षण करें

इस जवाब ने मुझे बहुत मदद की, फिर भी अब समस्या यह है कि मुश्किल सीमा 2048 है, और मेरे मामले में यह पर्याप्त नहीं है। 1) मैं अपनी कर्नेल की अनुमति की सीमा कैसे पा सकता हूं? 2) क्या अब HARD LIMIT को बदलना संभव है? एक बार फिर धन्यवाद!
परीक्षण करें

@test - मैंने कभी हार्ड लिमिट नहीं बढ़ाई है। यह पाया: blog.samat.org/2011/04/05/… और यह wiki.brekeke.com/wiki/Increase-File-Descriptor-Limit-on-Linux वे एक ही बात कहते हैं।
ब्रूस एडिगर

18

किसी चल रही प्रक्रिया की सीमा को बदलने के लिए, आप उपयोगिता कमांड का उपयोग कर सकते हैं prlimit

prlimit --pid 12345 --nofile=1024:1024

जो आंतरिक रूप से कॉल करने के लिए है setrlimit(2)। प्रारुप के पुरुष पृष्ठ में कुछ उपयोगी मंगलाचरण उदाहरण होने चाहिए।

स्रोत: https://sig-io.nl/posts/run-time-editing-of-limits-in-lin//


इसने मेरा दिन बचाया, धन्यवाद। मेरे पास एक लंबी चलने वाली पायथन प्रक्रिया थी जो too many files openत्रुटियों का उत्पादन कर रही थी । आपके उत्तर ने प्रक्रिया को रोक दिए बिना मेरे मुद्दे को हल कर दिया।
विस्कैस्पर

1

लिनक्स पर कम से कम, अधिकांश डिस्ट्रोफ प्रमाणीकरण के लिए पाम का उपयोग करने लगते हैं। एक मॉड्यूल जो पाम के साथ आता है वह सीमा मॉड्यूल है। PAM_limits के लिए README से उद्धरण:

The pam_limits PAM module sets limits on the system resources that can be obtained in a user-session. Users of uid=0 are affected by this limits, too.

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

आपके मामले में, यदि आप नियमित उपयोगकर्ता के रूप में रन की सीमा बढ़ाना चाहते हैं, तो आप उस उपयोगकर्ता या समूह के लिए सीमा बढ़ा सकते हैं। एक उदाहरण के रूप में, मेरे पास कुछ सर्वरों पर कुछ mysql क्रॉन जॉब्स हैं जिन्हें खोलने के लिए अतिरिक्त फ़ाइल हैंडल की आवश्यकता होती है, इसलिए मैंने इसे सेट किया:

$ cat /etc/security/limits.d/mysql.conf
@mysql           soft    nofile          100000
@mysql           hard    nofile          200000

ऐसा कुछ भी नहीं है जिसे फिर से शुरू करने की आवश्यकता है; जब आप उस उपयोगकर्ता पर मुकदमा करते हैं, तो आप तुरंत देख सकते हैं कि नई सीमा प्रभावी हो गई है।

एक और चीज जो आप कर सकते हैं यदि आप एक विशिष्ट रेडहैट व्युत्पन्न प्रणाली पर हैं, तो उस ulimit कॉल को डाल दिया जाए जिसे आप / etc / sysconfig / $ SERVICE स्क्रिप्ट में चाहते हैं। एक उदाहरण के रूप में, अपाचे की init स्क्रिप्ट का नाम /etc/init.d/httpd है, और यह / etc / sysconfig / httpd विन्यास फाइल को स्रोत करता है यदि यह पाया जाता है। मैंने स्वयं इनिट स्क्रिप्ट को संपादित करने के बजाय इसे प्रबंधित करना आसान पाया है क्योंकि आरपीएम के अपग्रेड होने पर इनइट स्क्रिप्ट अपडेट हो जाती हैं, लेकिन sysconfig फाइलें केवल तभी अपडेट की जाती हैं जब वे डिफ़ॉल्ट से बदली नहीं जाती हैं।


सबसे अच्छा और सबसे व्यावहारिक समाधान।
नालारो

0

कमांड को उस प्रक्रिया की सीमा कैसे पता चलेगी जिसे मैं संशोधित कर रहा हूं? क्या यह पूरे सिस्टम को फ़ाइल की सीमा को संशोधित नहीं करेगा?

कमांड वर्तमान प्रक्रिया (आपके शेल) और किसी भी चाइल्ड प्रोसेस (बाद में शेल से चलने वाली कुछ भी) के लिए सीमा को बदल देगी।

एक पेड़ में प्रक्रियाओं का आयोजन किया जाता है। हर प्रक्रिया में एक अभिभावक होता है (जिसने इसे लागू किया है)। प्रक्रिया संख्या 1, init, एक विशेष प्रक्रिया है जिसमें यह अपना स्वयं का अभिभावक है। Htop या top जैसे उपकरण आपको माता-पिता और बच्चों के पेड़ के रूप में प्रदर्शित होने वाली प्रक्रियाओं को दिखा सकते हैं।

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