लिनक्स पर O_DIRECT का उपयोग


23

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

अधिक जानकारी: मैं जिस एप्लिकेशन का उपयोग कर रहा हूं, वह अपना स्वयं का कैश बनाए रखता है, और ऐसा करने पर औसतन 5x या उससे अधिक की गति प्राप्त होती है। फाइल करते समय, कैश की सामग्री को फाइलसिस्टम कैश के लिए लिखा जाना चाहिए, जो अनावश्यक और एक प्रदर्शन चिंता का विषय है।

जवाबों:


17

ठीक है, आप अनुभवों के लिए पूछते हैं, यह प्रश्न को थोड़ा व्यक्तिपरक और तर्कपूर्ण बनाता है, लेकिन निष्क्रिय।

लिनस ने कहा कि उन उपयोगों का जिक्र करते हैं जो आमतौर पर लोग O_DIRECT के लिए विशेषता रखते हैं, और उन उपयोगों के लिए, IMO Linus अधिकतर सही होते हैं। यहां तक ​​कि अगर आप प्रत्यक्ष I / O करते हैं, तो आप अपने प्रोग्राम स्टेटमेंट में सीधे डिवाइस से / से डेटा ट्रांसफर नहीं कर सकते, आपको एक बफर की आवश्यकता होती है जो प्रोग्राम (डिवाइस या डिवाइस द्वारा) भरा हो और सिस्टम कॉल के माध्यम से दूसरे छोर पर स्थानांतरित हो। इसके अलावा, इसे कुशल बनाने के लिए, आप उस चीज़ को दोबारा पढ़ना नहीं चाहेंगे, जिसे आप पहले से ही पढ़ चुके हैं, अगर आपको फिर से इसकी आवश्यकता है। तो आपको किसी प्रकार के कैश की आवश्यकता है ... और यह ठीक है कि कर्नेल O_DIRECT, एक पेज कैश के बिना प्रदान करता है! उसका उपयोग क्यों नहीं करते? यह भी लाभ के साथ आता है यदि अधिक प्रक्रियाएं समान फ़ाइल को समवर्ती रूप से एक्सेस करना चाहती हैं, तो यह O_DIRECT के साथ एक आपदा होगी।

यह कहने के बाद कि, O_DIRECT के इसके उपयोग हैं: यदि किसी कारण से आपको सीधे ब्लॉक डिवाइस से डेटा प्राप्त करना है। इसका प्रदर्शन से कोई लेना-देना नहीं है।

प्रदर्शन के लिए O_DIRECT का उपयोग करने वाले लोग आमतौर पर खराब पृष्ठ कैश एल्गोरिदम के साथ सिस्टम से आते हैं, या बिना POSIX सलाह तंत्र के, या यहां तक ​​कि लोग जो भी दूसरे लोगों ने कहा है, उसे बिना किसी दोहराव के दोहराते हैं। इन समस्याओं से बचने के लिए, O_DIRECT एक समाधान था। लिनक्स, ओटीओएच, का दर्शन है कि आपको वास्तविक अंतर्निहित समस्या को ठीक करना चाहिए, और अंतर्निहित समस्या ओएस थी जिसने पृष्ठ कोचिंग के साथ एक बुरा काम किया।

मैंने अपनी मशीन में मेमोरी त्रुटि खोजने के लिए बिल्ली के एक सरल कार्यान्वयन के लिए O_DIRECT का उपयोग किया । यह O_DIRECT के लिए एक मान्य उपयोग है। इसका प्रदर्शन से कोई लेना-देना नहीं था।


जानकारी के लिए धन्यवाद, यह सराहना की है। मैंने अपने प्रश्न को ऐप की विशिष्ट स्थितियों के साथ अपडेट किया है जिसने इस प्रश्न को प्रेरित किया है। यदि आपके पास फ़ाइलों को लिखने के लिए POSIX सलाह तंत्र पर अधिक जानकारी है, तो इसकी सराहना की जाएगी।
आकस्मिक ५।

4
o_direct एक ऐसी प्रणाली में भी उपयोगी हो सकता है जहां डेवलपर एप्लिकेशन परत (डेटाबेस पर विचार करें) में एक कैशिंग तंत्र प्रदान करना चाहता है।
Jmoney38

इसका प्रदर्शन से कोई लेना-देना नहीं है। यह हमेशा सच नहीं होता है, विशेष रूप से एक उच्च गति वाले डिवाइस तक पहुंचने के लिए जहां IO दरों में प्रतिद्वंद्वी मेमोरी बैंडविड्थ, या यहां तक ​​कि मेमोरी बैंडविड्थ का केवल एक महत्वपूर्ण प्रतिशत होता है। उस स्थिति में, पृष्ठ कैश से / के लिए अतिरिक्त प्रतिलिपि को छोड़ देने से महत्वपूर्ण प्रदर्शन लाभ हो सकते हैं।
एंड्रयू हेनल

13

वास्तव में, O_DIRECT है या तो के बचने की जरूरत

  • कैश प्रदूषण - कभी-कभी आप जानते हैं कि कैशिंग के साथ ओवरहेड में कोई समझदारी नहीं है, उदाहरण के लिए जब वास्तव में बड़ी फ़ाइलों के साथ काम करते हैं, तो कहें कि 64 GiB है जब केवल 2 GiB RAM है। 32 GiB की टोरेंट फ़ाइल जिसे एक उपयोगकर्ता ने सत्यापित करने का निर्णय लिया है वह कैशिंग के लिए एक अच्छा उम्मीदवार नहीं है। यह अपने स्वयं के उपरि के साथ सिर्फ अतिरिक्त गतिविधि है। और यह कुछ वास्तव में उपयोगी डेटा को कैश से छंटनी का कारण बन सकता है।
  • डबल कैशिंग - उदाहरण के लिए कुछ RDBMSes (MySQL का उल्लेख करने के लिए) अपने स्वयं के कैश को परिभाषित करने की अनुमति देता है। डेटाबेस को माना जाता है कि कर्नेल की वर्चुअल मेमोरी की तुलना में कैश कैसे और क्या बेहतर है, जो एसक्यूएल प्लानिंग आदि के बारे में कोई बात नहीं जानता है।

- जो अच्छा नहीं है, जैसा लगता है। और O_DIRECTतेज होने का मतलब यह नहीं है, अक्सर यह नहीं है


10
posix_fadviseकैश प्रदूषण की समस्या का ध्यान रख सकते हैं।
Psusi

मुझे नहीं लगता कि वर्चुअल मेमोरी का इससे कोई लेना-देना है, यह केवल मेमोरी एड्रेस को मैप करता है। बफर कैश / पेज कैश का मतलब है।
आरकेबुलस्की

कैश / कैचिंग UNIX में VM सबसिस्टम का हिस्सा है, जहां तक ​​मैं बता सकता हूं, इसीलिए मैंने इस शब्द का इस्तेमाल किया। संपादन के लिए धन्यवाद। :)
प्रात

6

ध्यान दें कि O_DIRECTनए फ़ाइल सिस्टम के साथ नए कर्नेल में विफल होने के लिए उपयोग करना उत्तरदायी है। उदाहरण के लिए यह बग रिपोर्ट देखें । इतना ही नहीं उपयोग अक्सर संदिग्ध है, यह संभवतः लिनक्स वितरण की आने वाली पीढ़ी में काम नहीं करेगा। इसलिए मैं इस पर अपने कोड के प्रदर्शन को दांव पर नहीं लगाऊंगा, भले ही आप यह साबित करने में सक्षम हों कि इसका एक फायदा हो सकता है।


1
बग रिपोर्ट वास्तव में जर्नल = डेटा विकल्प के साथ फाइल सिस्टम के उपयोग पर चर्चा करती है। यह विकल्प O_DIRECT ध्वज के प्रभाव में सीधे विपरीत है। अधिकांश ext3 और ext4 फाइल सिस्टम में यह ध्वज सेट नहीं है और यदि वे करते हैं, तो इसे बंद करने से O_DIRECT के साथ फ़ाइल खोलने की अनुमति होगी।
कैजुअलिक्सर

3

यह प्रदर्शन के साथ बहुत कुछ करना है।

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

O_DIRECT की एक अन्य महत्वपूर्ण विशेषता यह है कि यह लिखने के अनुक्रम पर अधिक नियंत्रण प्रदान करता है । फिर से यह लिखने के आदेश की गारंटी नहीं देता है (जब तक कि आपके पास एक गैर-वाष्पशील कैशिंग डिस्क नियंत्रक नहीं है और पेंडो अनुसूचक का उपयोग कर रहे हैं, लेकिन इनकी अपनी जटिलताएं हैं)। इसलिए हालांकि mysql अपने डेटा / इंडेक्स के साथ-साथ पत्रिकाओं के लिए O_DIRECT का उपयोग करता है, यह उम्मीद कर सकता है कि बाद वाला आमतौर पर पहले प्रतिबद्ध होगा।

लेकिन यह याद रखना महत्वपूर्ण है कि O_DIRECT संसाधन आवंटन में निष्पक्षता को तोड़ता है। आपके आवेदन को गति देने का एक कारण यह है कि यह अन्य सामान को धीमा कर रहा है।


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

क्या यह अनुचित होने पर आपको और अधिक संदर्भ प्रदान कर सकता है?
ACIClic

3

@ जूलियानो से जो पहले ही कहा जा चुका है।

चेकआउट posix_fadviseअगर वास्तविक समस्या अंतर्निहित फाइल सिस्टम के कैश एल्गोरिथ्म का दुर्व्यवहार है, तो आप इसे सलाह देने की कोशिश कर सकते हैं कि आप फाइल सिस्टम का उपयोग कैसे करने जा रहे हैं। अच्छी तरह से कार्यान्वित एफएस के लिए, इसे प्रदर्शन को बढ़ावा देना चाहिए। (यहां समान विचारधारा को छूने वाले एक अन्य विषय पर लिंक दिया गया है /programming//a/3755818/544721 )


1
ऐसा लगता है कि कर्नेल द्वारा उपयोग किए जाने वाले रीडहेड एल्गोरिदम में पॉज़िक्स_फैडविज़ बदलता है। प्रश्न में कोड के साथ महत्वपूर्ण कारक लेखन प्रदर्शन है। समस्या यह है कि बफ़र लिखने से पहले लिनक्स कैश भरता है, जिसे कर्नेल को मेमोरी से बाहर चलाने पर डंप करना पड़ता है। यह प्रयास की बर्बादी है, इस मामले में आउटपुट डिस्क के रास्ते पर न्यूनतम बफर होना चाहिए।
आकस्मिक 2
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.