लिनक्स में बड़ी संख्या में खुली फ़ाइलों की अनुमति है


10

क्या लिनक्स में अधिकतम कितनी खुली फ़ाइलों को कॉन्फ़िगर करने की तकनीकी (व्यावहारिक या व्यावहारिक) सीमा है? क्या कुछ प्रतिकूल प्रभाव हैं यदि आप इसे बहुत बड़ी संख्या में कॉन्फ़िगर करते हैं (1-100M कहते हैं)?

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


सिद्धांत रूप में, आप गणना कर सकते हैं कि आपका सिस्टम कितने फ़ाइल-डिस्क्रिप्टर को उपलब्ध मेमोरी और उस दावे के आधार पर संभाल सकता है जो प्रत्येक fd में 1K मेमोरी की खपत करता है: serverfault.com/questions/330795/…
Alastair मैककैकैक

जवाबों:


10

मुझे संदेह है कि सीमा का मुख्य कारण अतिरिक्त मेमोरी खपत (प्रत्येक ओपन फाइल डिस्क्रिप्टर कर्नेल मेमोरी का उपयोग करता है) से बचने के लिए है। यह फाइल डिस्क्रिप्टर और उपभोग संसाधन संसाधनों को लीक करने वाले छोटी गाड़ी के अनुप्रयोगों के खिलाफ सुरक्षा के रूप में भी कार्य करता है।

लेकिन यह देखते हुए कि 10 साल पहले की प्रणालियों की तुलना में बेतुका कितना रैम आधुनिक सिस्टम है, मुझे लगता है कि आज चूक बहुत कम हैं।

2011 में लिनक्स पर फ़ाइल डिस्क्रिप्टर के लिए डिफ़ॉल्ट हार्ड लिमिट 1024 से बढ़ाकर 4096 कर दी गई थी

कुछ सॉफ़्टवेयर (जैसे MongoDB) डिफ़ॉल्ट सीमा की तुलना में कई अधिक फ़ाइल विवरणकों का उपयोग करता है। MongoDB लोग इस सीमा को बढ़ाकर 64,000 करने की सलाह देते हैं । मैंने rlimit_nofileकुछ अनुप्रयोगों के लिए 300,000 का उपयोग किया है ।

जब तक आप डिफॉल्ट (1024) पर सॉफ्ट लिमिट रखते हैं, हार्ड लिमिट बढ़ाने के लिए यह काफी सुरक्षित है। setrlimit()सॉफ्ट लिमिट से ऊपर की सीमा बढ़ाने के लिए प्रोग्राम्स को कॉल करना पड़ता है, और हार्ड लिमिट के द्वारा अभी भी कैप किया जाता है।

कुछ संबंधित प्रश्न भी देखें:


6
यह वास्तव में सवाल का जवाब नहीं दिया है, हालांकि, जो पूछा गया कि तकनीकी या व्यावहारिक सीमा थी कि कोई व्यक्ति उच्च सीमा को कैसे निर्धारित कर सकता है । वहाँ है, लेकिन इस जवाब में इसका उल्लेख नहीं है।
JdeBP

मुझे लगभग 1 मिलियन से अधिक की सीमा को उठाना असंभव लग रहा है। मुझे लगता है कि यह कर्नेल में हार्ड-कोड हो सकता है, क्योंकि कई कॉन्फ़िगरेशन बदलने के बावजूद, मैं इससे आगे नहीं बढ़ सकता। superuser.com/questions/1468436/…
Pavel Komarov

3

प्रभाव सामान्य रूप से देखने योग्य नहीं होगा, लेकिन कर्नेल के IO मॉड्यूल को उन सभी ओपन फ़ाइल डिस्क्रिप्टर का ध्यान रखना होगा और वे कैशे दक्षता पर भी प्रभाव डाल सकते हैं।

ऐसी सीमाओं से उपयोगकर्ता को अपनी (या तीसरे पक्ष की) गलतियों से बचाने का फायदा होता है। उदाहरण के लिए, यदि आप एक छोटा प्रोग्राम या स्क्रिप्ट चलाते हैं, जो अनिश्चित काल तक चलती है, तो यह अंततः ulimits में से एक पर ब्लॉक हो जाएगी और इसलिए अधिक तीव्र (संभवतः अप्राप्य) कंप्यूटर फ्रीज को रोक सकती है।

जब तक आपके पास उन सीमाओं को बढ़ाने के सटीक कारण नहीं हैं, तब तक आपको इससे बचना चाहिए और बेहतर नींद लेनी चाहिए।


2

यह तकनीकी रूप से अहस्ताक्षरित लंबे (सी लैंग) के अधिकतम मूल्य यानी 4,294,967,295 तक सीमित है

संदर्भ: fs.hफाइल

/* And dynamically-tunable limits and defaults: */
struct files_stat_struct {
  unsigned long nr_files;   /* read only */
  unsigned long nr_free_files;  /* read only */
  unsigned long max_files;    /* tunable THIS IS OUR VALUE */
};

2
क्या आपके पास इसके लिए कोई संदर्भ है?
टिम

इसके अलावा 32-बिट के लिए अधिकतम मूल्य है कि हस्ताक्षर किए पूर्णांक, 32-बिट अहस्ताक्षरित पूर्णांक अधिकतम मूल्य ४२९४९६७२९५ है।
संपो

तुम सही हो, सांपो। मेरी गलती।
लियोनार्ड टी

0

मुझे लगता है कि आपकी चिंता समझ में आती है, लेकिन सबसे अधिक संभावना है कि लिनक्स कॉन्फ़िगर के लिए बहुत मेमोरी का उपभोग नहीं करेगा (लेकिन फ़ाइल डिस्क्रिप्टर का उपयोग नहीं किया गया) :)

मैं पिछले 10 वर्षों से अपने पेशेवर करियर में इस तरह की समस्या को याद नहीं कर सकता।

सादर।


0

देर से ही सही लेकिन इस सवाल का जवाब पाने में हर किसी की मदद करनी चाहिए। लिनक्स में खुली फाइलों की संख्या के लिए व्यावहारिक सीमा को भी अधिकतम संख्या में फाइल डिस्क्रिप्शन के उपयोग से गिना जा सकता है जो एक प्रक्रिया खोल सकती है।

मैंने व्यवस्था से व्यवस्था में परिवर्तन की सीमाएँ देखी हैं। से getlimit आदमी पेज आप देख सकते हैं कि RLIMIT_NOFILE-1आंतरिक रूप से निर्दिष्ट सीमा।

RLIMIT_NOFILE मूल्य की जांच करने के लिए आप एक टुपल प्राप्त करने के लिए नीचे दिए गए कथन का उपयोग कर सकते हैं

python -c "import resource; print(resource.getrlimit(resource.RLIMIT_NOFILE))"

टपल रिटर्न परिणाम (सोफ्लिमेट, हार्डलिमिट) के रूप में। मेरे लिए कई सिस्टम पर चल रहे परिणाम नीचे दिए गए हैं

(1024, 1048576) # on UBUNTU linux 
(65536, 65536)  # on amazon linux 
(1024, 9223372036854775807) # on macos 

नोट: 922337203685474780807 इस संख्या का अर्थ है अनंत। इसे हिट करने से पहले आप हमेशा अन्य संसाधन सीमाओं तक पहुंचेंगे। यदि आपने हार्डलिमिट को किसी सिस्टम पर संशोधित किया है जो कि यह है, तो आपको कर्नेल पारम को संशोधित करना होगा।

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