2010-09-23 14 views
5

मैं कई मशीनों के साथ लिनक्स, एनएफएस पर हूं।क्या मैं सहयोग करने के लिए fcntl और पर्ल अलार्म प्राप्त कर सकता हूं?

मैं फ़ाइल लॉकिंग को लागू करने के लिए fcntl का उपयोग करने की कोशिश कर रहा हूं। मैं झुंड का उपयोग कर रहा था जब तक कि मुझे पता चला कि यह केवल उसी मशीन पर प्रक्रियाओं के बीच काम करता है।

अब जब मैं f_ntTLKW के साथ fcntl को कॉल करता हूं, perl alarms (टाइमआउट जोड़ने के लिए) पहले की तरह काम नहीं करते हैं। यह सामान्य रूप से ठीक होगा, लेकिन ctrl-c वास्तव में या तो काम नहीं करता है।

मुझे विश्वास है कि क्या हो रहा है, यह है कि fcntl केवल 30 सेकंड या उससे भी अधिक संकेतों की जांच कर रहा है। अलार्म अंततः वापस आ गया है। Ctrl-c पकड़ा गया है, ... अंततः।

क्या आवृत्ति समायोजित करने के लिए मैं कुछ भी कर सकता हूं जिसके साथ इन संकेतों के लिए fcntl जांचता है?

+4

एनएफएस पर लॉक करना मुश्किल है। 'फाइल :: एनएफएस लॉक' का उपयोग करने से शायद आपको एक समाधान मिलेगा जो बिना किसी कोड को लिखने के आपके काम करता है। – rafl

+0

फ़ाइल :: एनएफएस लॉक के अपने कुछ छेद हैं।यह हार्डलिंक्स और सामान के साथ कुछ चालें चलाने की कोशिश करता है, लेकिन यदि आपकी फाइल सिस्टम ओवरलोड हो गई है, तो आप आसानी से दौड़ की स्थिति ले सकते हैं जो दो प्रक्रियाओं को एक ही लॉक के साथ उत्पन्न करती है। – mmccoo

+2

इसमें कुछ दस्तावेज कमियां हैं, जिनमें अत्यधिक विवादास्पद स्थिति में प्रतीक्षा प्रक्रियाओं को भूखा करने की प्रवृत्ति शामिल है, हां। हालांकि, समस्या के लिए आप इसे हल करने की कोशिश कर रहे हैं, फिर भी यह सही व्यापार विकल्प हो सकता है। मैं वास्तव में नहीं बता सकता क्योंकि आपने अपनी परिस्थितियों का और वर्णन नहीं किया है। हालांकि मैं फ़ाइल :: एनएफएस लॉक का उपयोग करने के अनुभव से बात कर सकता हूं: मैंने कभी भी अपनी प्रक्रियाओं में से किसी भी प्रक्रिया को भूख नहीं देखा है, यहां तक ​​कि कई अन्य चीजों की तुलना में, कई विवादों की स्थिति में भी। इसके आधार पर मॉड्यूल की संख्या यह भी इंगित करती है कि अधिकांश लोगों के लिए यह काफी अच्छा है – rafl

उत्तर

1

मैं निश्चित रूप से इस मामले पर कोई विशेषज्ञ नहीं हूं, लेकिन मेरा ज्ञान यह है कि fcntl, जैसा कि आपने यह भी कहा है, आपके मामले में काम नहीं करेगा। fcntl सलाहकार ताले केवल उसी मशीन के भीतर समझ में आता है।

तो अगर मुझे ऑफ-विषय पर यह भूल जाए तो मुझे भूल जाओ। मैंने कैश तूफान/कुत्ते/मुद्रांकन की समस्या को हल करने के लिए File::NFSLock का उपयोग किया। एनएफएस वॉल्यूम पर कैश फाइलों को पढ़ने और लिखने के लिए कई एप्लिकेशन सर्वर थे (बहुत अच्छा विचार नहीं था, लेकिन यही वह था जिसे हमने शुरू किया था)।

मैं उप-वर्गीकृत/लपेटा गया फ़ाइल :: एनएफएस लॉक अपने व्यवहार को संशोधित करने के लिए। विशेष रूप से मैं की जरूरत:

  • लगातार ताले, कि दूर जाना नहीं है जब एक फ़ाइल :: NFSLock वस्तु क्षेत्र से बाहर चला जाता है। नियमित फ़ाइल :: NFSLock का उपयोग करके, ऑब्जेक्ट दायरे से बाहर होने पर आपका लॉक गायब हो जाएगा। यह मेरी जरूरत नहीं थी।
  • कि वास्तविक लॉक फ़ाइलों में मशीन का नाम भी लॉक प्राप्त हुआ है। प्रक्रिया आईडी स्पष्ट रूप से यह तय करने के लिए पर्याप्त नहीं है कि कोई प्रक्रिया समाप्त हो गई है, इसलिए मैं सुरक्षित रूप से लॉकफ़ाइल चुरा सकता हूं। तो मैंने pid के बजाय machine:pid के रूप में लॉकफ़ाइल लिखने के लिए कोड को संशोधित किया।

इसने कुछ सालों से अद्भुत काम किया है।

अनुरोधों की मात्रा में 10x की वृद्धि हुई थी। यही है, पिछले महीने मैंने पहली समस्याओं का अनुभव करना शुरू कर दिया था जहां वास्तव में व्यस्त कैश फ़ाइल पर दो बैकएंडों द्वारा लिखी जा रही थी, उसी समय, मृत ताले पीछे छोड़कर। यह मेरे लिए हुआ जब हम प्रति दिन लगभग 9-10 एम कुल पृष्ठदृश्य तक पहुंच गए, बस आपको एक विचार देने के लिए।

अंतिम टूटा कैश फ़ाइल देखा की तरह:

<!-- START OF CACHE FILE BY BACKEND b1 --> 
... cache file contents ... 
<!-- END OF CACHE FILE BY BACKEND b1 --> 
... more cache file contents ... wtf ... 
<!-- END OF CACHE FILE BY BACKEND b2 --> 

ऐसा तभी हो सकता है, अगर दो बैकेंड एक ही समय में एक ही फाइल को लिखने ... यह अभी भी स्पष्ट नहीं है, तो इस समस्या को फ़ाइल के कारण होता है बताया गया है: : एनएफएस लॉक + हमारे मोड या एप्लिकेशन में कुछ बग।

निष्कर्ष में, यदि आपका ऐप बहुत व्यस्त और तस्करी नहीं है, तो फ़ाइल :: एनएफएस लॉक के लिए जाएं, मुझे लगता है कि यह आपकी सबसे अच्छी शर्त है। आप सुनिश्चित हैं कि आप अभी भी एनएफएस का उपयोग करना चाहते हैं?

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

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