2011-12-15 16 views
8

this tutorial के अनुसार एसिंक्रोनस डिस्क फ़ाइल io आसानी से प्रोग्रामिंग/एपीआई पॉइंट-ऑफ-व्यू से लिनक्स पर एआईओ का उपयोग करके हासिल किया जा सकता है। लेकिन इस ट्यूटोरियल से पहले और बाद में मैंने कई पदों और लेखों को पढ़ा था कि यह या तो नहीं किया जा सकता है या आपको पैच और कई अन्य मुद्दों के साथ libevent का उपयोग करना चाहिए। एक और चीज लूप थी जिसे मुझे सिग्नल के लिए इंतजार करना चाहिए था, लेकिन इस ट्यूटोरियल के आधार पर मैं एक कॉलबैक तंत्र का उपयोग कर सकता हूं, जो स्पष्ट रूप से उपयोग करने के लिए एआईओ को अधिक आसान बनाता है।लिनक्स डिस्क फ़ाइल एआईओ

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

SO, इस ट्यूटोरियल में वर्णित एआईओ के साथ क्या गलत है? क्या यह प्रदर्शन है? क्या ऑपरेशन पर कोई प्रतिबंध है जिसे एआईओ का उपयोग करके किया जा सकता है?

पेज। मुझे कोई परवाह नहीं है कि कोड अन्य POSIX- अनुरूप प्लेटफॉर्म पर पोर्टेबल नहीं होगा, जब तक यह प्रमुख लिनक्स वितरण पर काम करता है। और मुझे लगता है कि नियमित डिस्क फ़ाइल io है।

धन्यवाद।

+3

लिनक्स पर एआईओ समर्थन खराब है। वर्तमान में, एआईओ बफर कैश को बाईपास करेगा और सीधे डिस्क IO निष्पादित करेगा, जो प्रदर्शन को खराब तरीके से नुकसान पहुंचा सकता है। – lvella

+0

क्या यह कार्यकर्ता-धागे समाधान से भी बदतर हो सकता है? – p00ya00

+1

यह आपके उपयोग पर निर्भर करता है। यदि आप सब कुछ अनुक्रमिक रूप से एक बड़ी फ़ाइल को पढ़ने या लिखना है, तो यह अच्छा प्रदर्शन करेगा, लेकिन यदि आप यादृच्छिक रूप से छोटे हिस्सों तक पहुंचते हैं, तो यह निश्चित रूप से खराब होगा। वैसे, यदि आप POSIX इंटरफ़ेस 'aio_read() 'आदि का उपयोग करते हैं, तो यह कार्यकर्ता-थ्रेड समाधान आपको मिलता है। यह glibc द्वारा उपयोगकर्ता स्पेस पर थ्रेड्स को अवरुद्ध करने के साथ कार्यान्वित किया जाता है। – lvella

उत्तर

11

ट्यूटोरियल सामान्य रूप से एसिंक्रोनस I/O का एक अवलोकन देता है और इसके बारे में बात करता है कि इसके लिए कर्नेल समर्थन कैसा है। फिर यह पॉज़िक्स एआईओ (जो एसिंक्रोनस I/O तक पहुंचने के लिए मानकीकृत एपीआई है) के बारे में बात करने जा रहा है, जिसका मतलब है कि लिनक्स पर पॉज़िक्स एआईओ एपीआई का उपयोग करके, आपको एआईओ के लिए कर्नेल समर्थन तक पहुंच मिल जाएगी। यह मामला नहीं है।

linux पर, वहाँ वास्तव में दो अलग-अलग AIO कार्यान्वयन हैं:

  1. गिरी AIO जो io_submit() का उपयोग एट अल) जो केवल या कर्नेल 2.6 में समर्थित है (वास्तव में 2.5 और बैक-पोर्ट हो सकता है। 2.4 करने के लिए इसके बारे में संस्करणों।
  2. POSIX AIO जो एक glibc सुविधा, अनिवार्य रूप से गिरी से संबंधित नहीं है। यह डिस्क अवरुद्ध I/O कॉल करने के उपयोगकर्ता के स्तर धागे के मामले में POSIX एपीआई लागू करता है।

तो संक्षेप में, यदि आपके पास पहले से ही एक सामान्य कार्यान्वयन है डिस्क I/O के लिए एकाधिक थ्रेड, आप glibc के कार्यान्वयन का उपयोग करने के बजाय उस का उपयोग कर बेहतर हो सकते हैं (क्योंकि आप पर थोड़ा अधिक नियंत्रण हो सकता है)।

यदि आप वास्तव में कार्यों के io_submit() परिवार का उपयोग करने के लिए प्रतिबद्ध हैं, तो आपको उन कार्यों पर प्रतिबंधों को रोकने के लिए बहुत सारे काम करना पड़ सकता है।

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

यदि आप कर्नेल एआईओ को एक शॉट देने का अंत करते हैं, तो मैं आपके आईओसीबीएस में एक या एक से अधिक ईवेंटफड्स को जोड़ने की सलाह देता हूं ताकि आप io_getevents() में अवरुद्ध होने के बजाय एपोल/चयन का उपयोग करके पूरा होने पर प्रतीक्षा कर सकें।

2

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

+0

कर्नेल एआईओ ऐसा नहीं करता है, लेकिन कम उपयोगी है क्योंकि यह बफर कैश इत्यादि को छोड़ देता है (जो निश्चित रूप से डेटाबेस चाहता है) – MarkR

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