स्थानीय डिस्क रीड के साथ नेटवर्क फाइल सिस्टम के लिए लिनक्स लिखो


17

सारांश

आप एक स्थानीय डिस्क / फाइल सिस्टम से पढ़े गए लिनक्स पर कैसे कॉन्फ़िगर कर सकते हैं और एक ही समय में एक नेटवर्क शेयर पर लिख सकते हैं, जैसा कि पढ़ने के लिए विरोध किया जाता है जबकि कोई डेटा नेटवर्क पर नहीं जा रहा है, फिर उस डेटा को नेटवर्क पर भेजते समय स्थानीय डिस्क है निष्क्रिय?

केवल एक ऑपरेशन करने और फिर एक दूसरे से बारी-बारी से काम करने के बजाय एक ही समय में पढ़ना और लिखना बहुत तेज़ है।

विवरण

मैं लिनक्स मशीन पर स्थानीय डिस्क से बड़ी मात्रा में डेटा को एनएएस डिवाइस पर ले जा रहा हूं।

मैं उपयोग कर रहा हूँ rsyncमूल रूप से कॉपी करने के लिए /srv/dataमें /mnt/nasहै, जो एक CIFS माउंट।

यह अच्छी तरह से शुरू हुआ, 100 एमबी / सेकंड में पढ़ना और एनएएस को 100 एमबी / सेकंड (गीगाबिट नेटवर्क की सीमा) पर पढ़ना, एक साथ पढ़ना और लिखना दोनों के साथ।

हालाँकि अब, कुछ घंटों बाद, मुझे पता चला है कि यह स्थानीय डिस्क से पढ़ रहा है, तब एनएएस को लिखते समय रीड को रोकना, फिर जब एनएएस को लिखने के लिए अधिक डेटा नहीं है, तो यह डिस्क से रीडिंग को फिर से शुरू करता है। फिर। डिस्क पढ़ने के दौरान नेटवर्क निष्क्रिय है, और नेटवर्क उपयोग में होने के दौरान डिस्क बेकार है।

कहने की जरूरत नहीं है कि 200 एमबी पढ़ना फिर 200 एमबी लिखना एक ही समय में उस 200 एमबी को पढ़ने और लिखने की तुलना में अधिक समय लेता है।

मैं कर्नेल को कैसे कॉन्फ़िगर कर सकता हूं, जो पढ़ने और लिखने के पहले के व्यवहार से चिपक जाता है, एक बार में केवल एक ही ऑपरेशन को पढ़ने, लिखने के बीच बारी-बारी से करने के बजाय?

कुछ अवलोकन: जब स्थानीय डिस्क 100 + एमबी / सेकेंड पर पढ़ती है, तो सब कुछ ठीक-ठीक समानांतर में होने लगता है, लेकिन एक बार जब डिस्क धीमा हो जाता है (किसी कारण से केवल 20 एमबी / सेकंड पर जा रहा है) तो ऐसा तब होता है जब यह पढ़ा / लिखा जाए स्विचिंग होने लगती है।

मैं भी चला सकते हैं syncराईट (कम गति पर स्पष्ट रूप से हालांकि) पढ़ता के साथ समानांतर में हो रहा प्राप्त करने के लिए तथापि डाल मैन्युअल हर कुछ सेकंड syncएक में whileपाश इतना है कि यह हर पांच सेकंड चलाता है सही समाधान की तरह प्रतीत नहीं होता ...

कर्नेल को लगभग 1GB डेटा कैशे लगता है और फिर इसे जितना संभव हो सके नेटवर्क पर लिखें - जो कि ठीक है - मुझे समझ में नहीं आ रहा है कि धीमे डिस्क को पढ़ने से रोकने की आवश्यकता क्यों है जबकि डेटा को बाहर भेजा जा रहा है नेटवर्क।


1
अधिकांश यूनिक्स उपकरण इस अर्थ में बैंडविड्थ के लिए बिल्कुल अनुकूलित नहीं हैं, rsync नहीं, एक साधारण सीपी भी नहीं। वे अवरुद्ध IO का उपयोग करते हुए एकल-थ्रेडेड एप्लिकेशन हैं।
पीटर -

1
कहीं-कहीं 100 एमबी / एस भी है जो आप आधुनिक आम 7200 आरपीएम घूर्णी एचडीडी पर पूरी तरह से अनुक्रमिक वर्कलोड में देखने की उम्मीद कर सकते हैं। जैसे ही आप मेटाडेटा अपडेट करना शुरू करते हैं या यदि फ़ाइल सिस्टम खंडित हो जाता है, तो यह नीचे चला जाता है, क्योंकि आप तब IOPS- बाउंड हो जाते हैं।
बजे एक CVn

आप NAS पर rsync स्थापित कर सकते हैं?
जसन

जवाबों:


27

कुछ और जांच के बाद, ऐसा लगता है कि यह मुद्दा कम कर्नेल संबंधी है rsyncऔर सीआईएफएस कैसे और किस तरह से संबंधित है ।

जहां तक ​​मैं यह बता सकता हूं कि यह क्या हो रहा है कि rsyncडेस्टिनेशन फाइल को बंद करते समय , CIFS (और शायद कोई भी नेटवर्क फाइलसिस्टम) यह सुनिश्चित करता है कि फाइल पूरी तरह से फ्लश हो जाए और closesyscall रिटर्न से पहले रिमोट डिस्क पर लिखी जाए । यह किसी भी एप्लिकेशन को आश्वस्त करने के लिए है कि एक बार जब करीबी ऑपरेशन सफलतापूर्वक पूरा हो जाता है, तो फ़ाइल को पूरी तरह से सहेज लिया गया है और आगे किसी भी त्रुटि का कोई खतरा नहीं है जिससे डेटा हानि हो सकती है।

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

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

वैकल्पिक हल CIFS साझा को माउंट करने के विकल्प के साथ है cache=noneजो इस सुविधा को निष्क्रिय करता है, और सभी I / O को सर्वर पर सीधे जाने का कारण बनता है। यह समस्या को समाप्त करता है और समानांतर में निष्पादित करने के लिए पढ़ता और लिखता है, हालांकि इस समाधान का एक दोष यह है कि प्रदर्शन कुछ कम है। मेरे मामले में, नेटवर्क ट्रांसफर गति 110MB / सेकंड से 80MB / सेकंड तक चली जाती है।

इसका मतलब यह हो सकता है कि यदि आप बड़ी फ़ाइलों की प्रतिलिपि बना रहे हैं, तो वैकल्पिक रूप से पढ़ने / लिखने के व्यवहार के साथ प्रदर्शन बेहतर हो सकता है। कई छोटी फ़ाइलों के साथ, कैश को अक्षम करने से हर बार कम कैश फ्लश हो जाएगा क्योंकि फ़ाइल बंद हो गई है इसलिए प्रदर्शन में वृद्धि हो सकती है।

ऐसा लगता rsyncहै कि इसके फ़ाइल हैंडल को किसी अन्य थ्रेड में बंद करने के लिए एक विकल्प की आवश्यकता होती है, इसलिए यह अगली फ़ाइल को पढ़ना शुरू कर सकता है जबकि अंतिम अभी भी फ्लश हो रहा है।

संपादित करें: मैंने पुष्टि की है कि cache=noneनिश्चित रूप से बहुत सी छोटी फ़ाइलों को स्थानांतरित करने में मदद करता है (इसे 10 एमबी / सेकंड से 80 एमबी / सेकंड तक लाता है) लेकिन बड़ी फ़ाइलों (1 जीबी +) cache=noneको स्थानांतरित करते समय 110 एमबी / सेकंड से उसी 80 एमबी / सेकंड तक स्थानांतरण को छोड़ देता है। इससे पता चलता है कि कई छोटी फ़ाइलों से धीमी गति से स्रोत डिस्क की मांग के बारे में कम है, और सभी छोटी फ़ाइलों से इतने सारे कैश फ्लश होने के बारे में अधिक है।


2
यह एक बहुत ही दिलचस्प समस्या है, और स्पष्टीकरण पोस्ट करने के लिए धन्यवाद। rsyncकरता है पढ़ने के लिए एक अलग धागा (वास्तव में, अलग प्रक्रिया), क्योंकि यह बनाया गया है में फ़ाइल है कि एक की कॉपी rsyncएक ही तरफ नेटवर्क के प्रत्येक पक्ष पर चल रहा है, भले ही अपने मामले में दोनों प्रतियों हैं (और फाइल सिस्टम छिपा है तथ्य यह है कि एक नेटवर्क है)। मुझे लगता है कि यह मदद नहीं करता है, क्योंकि पाठक प्रक्रिया बहुत जल्दी पाइप को भर देती है जबकि लेखक प्रक्रिया एक पर रोक रही है close()rsyncयदि आप rsyncतार पर उपयोग कर रहे थे तो बेहतर प्रदर्शन करेंगे , CIFS नहीं।
सेलडा

1
मुझे लगता है कि एक और समाधान है कि आप rsyncएनएएस पर नहीं चल सकते हैं rsyncनेटवर्क पर उपयोग करना होगा (जैसे rsync -a files localhost:/dest/path) जबकि किसी तरह कृत्रिम रूप से नेटवर्क कनेक्शन में एक विशाल बफर (जैसे, मल्टी मेगाबाइट, कम से कम) का परिचय होगा। यकीन नहीं है कि ऐसा करने के लिए सबसे अच्छा हैक क्या लगेगा।
सेलडा

@Celada: धन्यवाद! हां, मैं कल्पना करता हूं कि rsyncNAS बॉक्स पर चलने के साथ ही इस मुद्दे पर भी काम किया जाएगा। हालांकि थोड़ा और अधिक जटिल (अजीब NAS अनुमतियाँ, सहानुभूति को छोड़ना होगा, आदि) लेकिन अगर मेरे पास इसे कॉपी करने के लिए थोड़ा और डेटा होता तो यह उस समय के निवेश के लायक होगा जो मुझे लगता है।
माल्विनस

2
संभवतः आपके मामले से असंबंधित है: मुझे कुछ साल पहले इसी तरह की समस्या थी जो dump(8)एनएफएस पर आरएएस एनएएस के उत्पादन को लिखते थे । जिस समय मैंने NFS सर्वर के संयुक्त प्रभाव और NAS पर चलने वाले फ़ायरवॉल (बॉक्स को रूट नहीं किया गया था, और फ़ायरवॉल को पूरी तरह से अक्षम नहीं किया जा सका) के कारण, समस्या का निदान NAS पर CPU को अधिकतम करने के रूप में किया। वेब इंटरफेस)। समस्या तब दूर हुई जब हमने NAS को एक पुराने पीसी के साथ बदल दिया। FWIW।
सातु कटुरा

@SatoKatsura: निश्चित रूप से पुराने NAS उपकरणों के लिए एक संभावना है, हालांकि उस मामले में मुझे लगता है कि आप इस तरह से एक धमाकेदार के बजाय एक धीमी समग्र हस्तांतरण देखेंगे? मेरा NAS एक डुअल-कोर एटम (~ 2GHz) है, जो लगभग 30% सीपीयू के उपयोग के लिए बैठता है जब जंबो फ्रेम के बिना एक गीगाबिट एनआईसी को अधिकतम किया जाता है तो वहां ठीक होना चाहिए।
माल्विनस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.