उलिमित फ़ाइल विवरणक सीमा विशेष प्रक्रिया के लिए लागू नहीं की जा रही है


14

मैंने हाल ही में अपनी एक रेडिस प्रक्रिया की जाँच की जिसमें प्रयोग करके लागू किए गए क्या क्या

cat /proc/<redis-pid>/limits

और यह जानने के लिए आश्चर्यचकित था कि यह कम डिफ़ॉल्ट मूल्य पर है:

Limit                     Soft Limit           Hard Limit           
Max open files            4016                 4016 

मुझे आश्चर्य हुआ, क्योंकि हमारे पास निम्नलिखित कॉन्फ़िगर हैं:

# /etc/sysctl.conf 
fs.file-max = 100000

# /etc/security/limits.conf
* soft nofile 100000
* hard nofile 100000

# /etc/ssh/sshd_config
UsePAM yes

# /etc/pam.d/sshd
session required pam_limits.so

क्या कोई मुझे बता सकता है कि बढ़े हुए एमिट को रनिंग रेडिस प्रक्रिया पर लागू क्यों नहीं किया जा रहा है?

Redis प्रक्रिया उपयोगकर्ता 'redis' के रूप में चल रही है, सीमा बढ़ाए जाने के बाद से सर्वर को रिबूट किया गया है। हम डेबियन स्क्वीज पर हैं।

जवाबों:


19

लिनक्स में संसाधन की आवश्यकता के आधार पर विभिन्न स्थानों में सीमाएं निर्धारित की जा सकती हैं।

  1. /etc/security/limits.conf फ़ाइल।
  2. /etc/sysctl.conf फ़ाइल।
  3. ulimit आदेश

/etc/security/limits.confpam_limits का हिस्सा है और इसलिए इस फ़ाइल में जो सीमाएँ निर्धारित की गई हैं, उन्हें लॉगिन सत्रों के दौरान pam_limits मॉड्यूल द्वारा पढ़ा जाता है। लॉगिन सत्र के sshमाध्यम से या के माध्यम से हो सकता है terminal। और pam_limits डेमॉन प्रक्रियाओं को प्रभावित नहीं करेगा जैसा कि यहां बताया गया है

/etc/sysctl.confसिस्टम वाइड ग्लोबल कॉन्फ़िगरेशन है, हम यहां उपयोगकर्ता विशिष्ट कॉन्फ़िगरेशन सेट नहीं कर सकते। यह संसाधन की अधिकतम मात्रा निर्धारित करता है जिसका उपयोग सभी उपयोगकर्ताओं / प्रक्रियाओं द्वारा प्राप्त करने के लिए किया जा सकता है।

ulimitशेल की सीमा निर्धारित करने के लिए कमांड का उपयोग किया जाता है। और इसलिए जब एक सीमा को ulimitशेल पर सेट किया जाता है, तो शेल से जो प्रक्रिया होती है, उस मूल्य को भी उस नियम के कारण प्राप्त होता है जो कि गुणों को child processविरासत में मिलता है parent processes

और इसलिए आपके मामले के लिए, जैसा कि ऊपर redisके initकिसी भी भाग के रूप में शुरू किया गया है, आपको सीधे मदद करेगा। ऐसा करने का उचित तरीका यह है कि, आपको ulimitइनइट स्क्रिप्ट में नया मान सेट करने के लिए कमांड का उपयोग करना होगा । स्क्रिप्ट में नीचे की तरह,

ulimit -n 100000
if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGS.

सुविधा को जोड़ने के लिए इच्छा सूची में पहले से ही एक बग दर्ज कियाulimit गया है start-stop-daemon

redisअगर वहाँ सीमा प्रदान करने का कोई तरीका है, तो कॉन्फ़िगरेशन की भी जाँच करें ।


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

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

2

Sysctl fs.file- अधिकतम पैरामीटर विस्तृत वैश्विक सिस्टम सीमा है, मुझे नहीं लगता कि उसी मूल्य को समाप्त करने में एक अच्छा विचार सेटिंग है।

यदि आप ulimit में 100000 और sysctl.conf में भी 100000 सेट करते हैं, तो एक उपयोगकर्ता सिस्टम को ब्लॉक कर सकता है

किसी भी तरह से, अपनी समस्या के बारे में बात करते हुए, आप सुनिश्चित होना चाहते हैं, आपका सिस्टम pam_limits का उपयोग करता है

man pam_limits
grep -i limit /etc/pam.d/*

धन्यवाद - मैं तब fffile- अधिकतम मान बढ़ाने पर विचार करूँगा। पीएएम के बारे में - मेरा मानना ​​है कि हम इसका उपयोग कर रहे हैं (मैंने प्रश्न के लिए कुछ अतिरिक्त कॉन्फ़िगरेशन जोड़ा है)। मुझे वास्तव में यकीन नहीं है कि मैं पीएएम को समझता हूं, क्योंकि हमारी सेटिंग्स एसएसएच से संबंधित हैं, जिसका उपयोग इस उपयोगकर्ता द्वारा नहीं किया जाता है। क्या कोई अन्य फ़ाइल है जिसे मुझे कॉन्फ़िगर करने की आवश्यकता है? मैं हमेशा रेडियों के लिए init स्क्रिप्ट में एक ulimit सेटिंग डाल सकता था, लेकिन ऐसा नहीं करना होगा।
अप'क्रिक

2

आपने sshd के लिए pam_limits सक्षम किया है, लेकिन क्या यह आदेश SSH सत्र से निष्पादित किया जा रहा है? आप के लिए एक ही पंक्ति जोड़ने के लिए आवश्यकता हो सकती है /etc/pam.d/loginऔर / या /etc/pam.d/suऔर / या /etc/pam.d/sudo


धन्यवाद। मुझे संदेह था कि यह काफी सही नहीं था। इस लाइन को एक init.d स्क्रिप्ट में इस प्रक्रिया को शुरू किया जा रहा है if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGS:। इस मामले में कौन सा पेम उचित होगा?
उपराष्ट्रपति

अपनी स्क्रिप्ट में आप ulimit -n 100000
c4f4t0r

क्या init.d स्क्रिप्ट su [user] -cस्क्रिप्ट को किसी अन्य उपयोगकर्ता के रूप में शुरू करने के लिए एक कमांड का उपयोग करता है, या आपका प्रोग्राम रूट के रूप में चलता है? यदि यह उपयोग कर रहा है su, तो आप इसे अंदर डाल देंगे /etc/pam.d/su। यदि आप के रूप में चल रहे हैं root, तो आप शायद ulimitअपने init स्क्रिप्ट में कमांड जोड़ने के c4f4t0r के सुझाव से बेहतर हैं । rootयह किसी भी सीमा को निर्धारित करने की अनुमति देता है, इसलिए आपको वास्तव में उस मामले के लिए pam के बारे में चिंता करने की आवश्यकता नहीं है।
सर्वव्यापी

1
धन्यवाद। इस पर उपयोग करता --chuid redis:redisहै start-stop-daemon। मैंने अब स्टार्टअप स्क्रिप्ट में ulimit जोड़ दिया है।
6
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.