2013-04-16 9 views
6

मैं रूबी (2.0.0 p39474) में बहुत तेजी से फ़ाइल पहुंच निष्पादित कर रहा हूँ, और अपवाद Too many open filesरूबी फ़ाइल हैंडल प्रबंधन (बहुत अधिक खुली फ़ाइलों)

this thread को देखा करने के बाद मिल रही है, here, और विभिन्न अन्य स्रोतों , मैं ओएस सीमाओं के बारे में अच्छी तरह से जानता हूं (मेरे सिस्टम पर 1024 पर सेट करें)।

मेरे कोड का हिस्सा है जो इस फ़ाइल का उपयोग mutexed है करता है, और रूप ले लेता है:

File.open(filename, 'w'){|f| Marshal.dump(value, f) } 

जहां filename तेजी से परिवर्तन के अधीन है, धागा खंड बुला के आधार पर। यह मेरी समझ है कि यह फ़ॉर्म ब्लॉक के बाद अपने फ़ाइल हैंडल को छोड़ देता है।

मैं ObjectSpace.each_object(File) का उपयोग कर खुले File वस्तुओं की संख्या को सत्यापित कर सकता हूं। यह रिपोर्ट करता है कि स्मृति में 100 निवासी हैं, लेकिन उम्मीद के अनुसार केवल एक ही खुला है।

आगे, अपवाद स्वयं को उस समय फेंक दिया जाता है जब ObjectSpace द्वारा रिपोर्ट की गई केवल 10-40 File वस्तुएं होती हैं। इसके अलावा, मैन्युअल रूप से कचरा संग्रहण इन गणनाओं में से किसी एक को सुधारने में विफल रहता है, क्योंकि sleep कॉल डालने से मेरी स्क्रिप्ट धीमा हो जाती है।

मेरा प्रश्न इसलिए है:

  • एम आई मौलिक ओएस सीमा की प्रकृति गलतफहमी --- यह एक प्रक्रिया के पूरे जीवनकाल को कवर करता है?
    • यदि हां, तो कैसे वेब सर्वर ulimit -n फ़ाइलों पर पहुँचने के बाद बाहर दुर्घटनाग्रस्त होने से बचने हो?
    • क्या रूबी अपनी ऑब्जेक्ट सिस्टम के बाहर अपनी फ़ाइल हैंडल को बरकरार रखता है, या कर्नेल 'समवर्ती' पहुंच की गणना करने में बस इतना धीमा है?

संपादित 20,130,417: strace इंगित करता है कि माणिक लौटने और ऐसा करने से पहले म्युटेक्स रिहा, फाइल करने के लिए अपने डेटा के सभी लिखना नहीं है। इस प्रकार, फ़ाइल ओएस सीमा तक ढेर हो जाती है।

इसे ठीक करने की कोशिश में, मैं syswrite/sysread, तुल्यकालिक मोड का इस्तेमाल किया है, और close से पहले flush कहा जाता है। इन तरीकों में से कोई भी काम नहीं किया।

मेरा प्रश्न इस प्रकार करने के लिए संशोधित किया गया है: क्यों माणिक अपनी फ़ाइल हैंडल बंद करने के लिए विफल हो रहा है, और कैसे मैं ऐसा करने के लिए यह मजबूर कर सकते हैं?

उत्तर

3

उपयोग dtrace या strace या जो कुछ भी बराबर अपने सिस्टम पर है, और वास्तव में क्या फ़ाइलों को खोला जा रहा है पता लगाना।

ध्यान दें कि ये सॉकेट हो सकते हैं।

मैं मानता हूं कि आपके द्वारा चिपकाया गया कोड कम से कम, अजीब समरूपता बग के बिना, इस समस्या को उत्पन्न करने में सक्षम नहीं प्रतीत होता है।

+0

'स्ट्रेस' इंगित करता है कि रूबी फ़ाइल खोलता है, फिर फ़ंक्शन से वापस आता है, डेटा लिखने से पहले म्यूटेक्स को छोड़ देता है। अपवाद के बाद संसाधन बंद करते समय कुछ मामलों में यह फ्लश भी नहीं करता है, और डिस्क पर लिखने को समाप्त करता है (यानी शटडाउन के दौरान)। –

संबंधित मुद्दे