एक उच्च मात्रा प्रणाली के लिए व्यावहारिक अधिकतम खुले फ़ाइल डिस्क्रिप्टर (ulimit -n)


76

हमने हाल ही में अपने आवेदन का परीक्षण शुरू किया और देखा कि यह लगभग 24 घंटों के बाद फ़ाइल विवरणकों से बाहर निकल गया।

हम एक डेल 1955 पर RHEL 5 चला रहे हैं:

CPU: 2 x ड्यूल कोर 2.66GHz 4MB 5150 / 1333FSB RAM: 8GB RAM HDD: 2 x 160GB 2.5 "SATA हार्ड ड्राइव

मैंने फ़ाइल डिस्क्रिप्टर की सीमा की जाँच की और इसे 1024 पर सेट किया गया था। यह देखते हुए कि हमारे आवेदन में लगभग 1000 आवक कनेक्शन और साथ ही 1000 आउटगोइंग कनेक्शन हो सकते हैं, यह काफी कम लगता है। किसी भी वास्तविक फ़ाइलों का उल्लेख करने के लिए नहीं जिन्हें खोलने की आवश्यकता है।

मेरा पहला विचार था कि केवल परिमाण के कुछ आदेशों के द्वारा अलिमिट-एन पैरामीटर को बढ़ाया जाए और फिर परीक्षण को फिर से चलाया जाए लेकिन मैं इस चर को स्थापित करने के किसी भी संभावित प्रभाव को जानना चाहता था।

क्या यह पता लगाने के अलावा कोई अन्य सर्वोत्तम प्रथाएं हैं कि हमारे सॉफ़्टवेयर के कितने फ़ाइल वर्णनकर्ता सैद्धांतिक रूप से खोल सकते हैं?

जवाबों:


73

ये सीमाएं ऐसे समय से आईं, जहां कई "सामान्य" उपयोगकर्ता (ऐप नहीं) सर्वर साझा करते थे, और हमें कई अन्य संसाधनों का उपयोग करने से बचाने के तरीकों की आवश्यकता थी।

वे उच्च प्रदर्शन सर्वर के लिए बहुत कम हैं और हम आम तौर पर उन्हें बहुत अधिक संख्या में सेट करते हैं। (24k या तो) यदि आपको उच्च संख्या की आवश्यकता है, तो आपको sysctl फ़ाइल-अधिकतम विकल्प (आमतौर पर ubuntu और 40k पर rhel पर सीमित है) को बदलने की आवश्यकता है।

अलिमेट सेट करना:

# ulimit -n 99999

Sysctl अधिकतम फ़ाइलें:

#sysctl -w fs.file-max=100000

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


1
@sucuri धन्यवाद हम निश्चित रूप से संसाधन लीक के बारे में चिंतित हैं, लेकिन यह मामला प्रतीत नहीं होता है। हम lsof और netstat दोनों देख रहे हैं और जबकि संख्या अधिक है, वे बढ़ते नहीं रहते हैं, वे विस्तार और अनुबंध करते हैं। मुझे उम्मीद है कि अगर कोई रिसाव हुआ, तो समय के साथ खुले सॉकेट या डिस्क्रिप्टर की संख्या बढ़ती रहेगी।
केविन

2
ulimitसीमा प्रति उपयोगकर्ता नहीं है, लेकिन प्रक्रिया के अनुसार! Unix.stackexchange.com/questions/55319/… देखें और fs.file-maxसेटिंग एक पूरे (इसलिए सभी प्रक्रियाओं को एक साथ) सर्वर के लिए है।
टोनिन

15

आप हमेशा बस कर सकते हैं

cat /proc/sys/fs/file-nr

'हाई लोड' स्थिति के दौरान यह देखने के लिए कि कितने फ़ाइल डिस्क्रिप्टर उपयोग में हैं।

अधिकतम के रूप में - यह सिर्फ इस बात पर निर्भर करता है कि आप क्या कर रहे हैं।


यहाँ मैं सोच रहा था 143000 काफी अच्छा था जब उपरोक्त कमांड ने मुझे दिखाया 8288 0 793377!
श्रीधर सरनोबत

6

यदि फ़ाइल डिस्क्रिप्टर tcp सॉकेट आदि हैं, तो आप सॉकेट बफ़र्स और अन्य कर्नेल ऑब्जेक्ट्स के लिए बड़ी मात्रा में मेमोरी का उपयोग करने का जोखिम उठाते हैं; यह स्मृति स्वैच्छिक नहीं है।

लेकिन अन्यथा, नहीं, सिद्धांत रूप में कोई समस्या नहीं होनी चाहिए। कितना कर्नेल मेमोरी का उपयोग करेगा, और / या परीक्षण करने के लिए काम करने की कोशिश करने के लिए कर्नेल प्रलेखन से परामर्श करें।

हम एक बड़ी समस्या के बिना (ज्यादातर वास्तविक डिस्क फ़ाइलों पर) खुला 10k फ़ाइल डिस्क्रिप्टर के साथ डेटाबेस सर्वर चलाते हैं, लेकिन वे 64-बिट हैं और राम के भार हैं।

Ulimit सेटिंग प्रति-प्रक्रिया है, लेकिन साथ ही एक प्रणाली-व्यापी सीमा भी है (32k मुझे डिफ़ॉल्ट रूप से लगता है)


2

मैं किसी भी सर्वोत्तम प्रथाओं के बारे में व्यक्तिगत रूप से अवगत नहीं हूं। यह सिस्टम फ़ंक्शन के आधार पर कुछ व्यक्तिपरक है।

याद रखें कि आप जो 1024 देख रहे हैं वह एक प्रति-उपयोगकर्ता सीमा है और सिस्टम-वाइड सीमा नहीं है। विचार करें कि आप इस सिस्टम पर कितने एप्लिकेशन चलाते हैं। क्या यह एक ही है? क्या इस एप्लिकेशन को चलाने वाला उपयोगकर्ता कुछ और भी कर रहा है? (IE क्या आपके पास इस खाते का उपयोग करने वाले लोग हैं जो स्क्रिप्ट्स को लॉगिन और चला सकते हैं जो संभवतः भाग सकते हैं?)

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


@Grahamux सिस्टम इस एप्लिकेशन को समर्पित है और एप्लिकेशन चलाने वाला उपयोगकर्ता केवल इस एप्लिकेशन को चलाता है। मैं इन-हाउस देव टीम का हिस्सा हूं, इसलिए वहां कोई मदद नहीं करता।
केविन

सीमा प्रति उपयोगकर्ता नहीं है, लेकिन प्रति प्रक्रिया है। देखें unix.stackexchange.com/questions/55319/...
Tonin

1

यह मुझे उन सवालों में से एक लगता है, जिनका उत्तर "विकास के माहौल में परीक्षण" के साथ दिया जाता है। मुझे याद है कि सालों पहले जब आप इस से घबराए थे तो सूरज घबरा गया था, लेकिन वह नर्वस नहीं था। उस समय इसकी सीमा 1024 भी थी, इसलिए मुझे यह देखकर थोड़ा आश्चर्य हुआ कि यह अब लिनक्स के लिए समान है, ऐसा लगता है कि इसे अधिक होना चाहिए।

जब मैंने आपके प्रश्न के उत्तर के लिए मुझे देखा तो मुझे निम्न लिंक शैक्षिक मिला: http://www.netadmintools.com/art295.html

और यह भी एक: https://stackoverflow.com/questions/1212925/on-linux-set-maximum-open-files-to-unlimited-possible

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