POSIX अतुल्यकालिक I / O (AIO) की स्थिति क्या है?


93

वेब के चारों ओर बिखरे हुए पृष्ठ हैं जो पोसिक्स एआईओ सुविधाओं का विस्तार से वर्णन करते हैं। उनमें से कोई भी हाल ही में नहीं है। यह स्पष्ट नहीं है कि वास्तव में, वे वर्णन कर रहे हैं। उदाहरण के लिए, लिनक्स कर्नेल अतुल्यकालिक I / O समर्थन के लिए "आधिकारिक" (?) वेब साइट यहां कहती है कि सॉकेट्स काम नहीं करते हैं, लेकिन मेरे Ubuntu 8.04.1 वर्कस्टेशन पर "aio.h" मैनुअल पेज सभी को नापसंद करते हैं यह मनमाने ढंग से फाइल डिस्क्रिप्टर के लिए काम करता है। तो फिर वहाँ है एक और परियोजना है जो लाइब्रेरी लेयर पर भी कम प्रलेखन के साथ काम करने लगती है

मैं जानना चाहता हूं:

  • POSIX AIO का उद्देश्य क्या है? यह देखते हुए कि कार्यान्वयन का सबसे स्पष्ट उदाहरण मैं कह सकता हूं कि यह सॉकेट्स का समर्थन नहीं करता है, पूरी बात मुझे अजीब लगती है। यह सिर्फ async डिस्क I / O के लिए है? यदि हां, तो हाइपर-जनरल एपीआई क्यों? यदि नहीं, तो डिस्क I / O पर पहली बार हमला क्यों हुआ?
  • जहां उदाहरण पूर्ण हैं POSIX AIO कार्यक्रमों है कि मैं देख सकते हैं?
  • क्या कोई वास्तव में इसका इस्तेमाल करता है, असली के लिए?
  • क्या प्लेटफॉर्म POSIX AIO को सपोर्ट करते हैं? वे इसके किन हिस्सों का समर्थन करते हैं? क्या कोई वास्तव में निहित "किसी भी एफडी / ओ से किसी भी एफडी" <aio.h>का वादा करता है जो वादा करता है?

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

जवाबों:


27

नेटवर्क I / O AIO के लिए प्राथमिकता नहीं है क्योंकि POSIX नेटवर्क सर्वर लिखने वाला हर व्यक्ति एक घटना आधारित, गैर-अवरुद्ध दृष्टिकोण का उपयोग करता है। पुराने शैली के जावा "अरबों अवरुद्ध धागे" दृष्टिकोण बुरी तरह से बेकार है।

डिस्क लिखना I / O पहले से ही बफ़र्ड है और डिस्क रीड I / O को पॉज़िक्स_फैडाइज़ जैसे फ़ंक्शन का उपयोग करके बफर में प्रीफ़ेट किया जा सकता है। यह AIO के लिए एकमात्र उपयोगी उद्देश्य के रूप में प्रत्यक्ष, अप्रभावित डिस्क I / O को छोड़ देता है।

प्रत्यक्ष, अप्रभावित I / O केवल ट्रांसेक्शनल डेटाबेस के लिए वास्तव में उपयोगी है, और वे अपनी डिस्क I / O को प्रबंधित करने के लिए अपने स्वयं के थ्रेड या प्रक्रियाएं लिखते हैं।

तो, अंत में जो किसी उपयोगी उद्देश्य की सेवा नहीं करने की स्थिति में पोसिक्स एआईओ को छोड़ देता है । इसका उपयोग न करें।


8
नेटवर्क (NFS, सांबा) फाइल सिस्टम से पढ़ने / लिखने के बारे में क्या?
एलेक्स बी

1
कुंआ। मेरे पास कई बड़े दबंग लेखक हैं, अगर मैं उन्हें कैश में जाने दूंगा, तो चोटियों पर गंदे_ब्रेट मारूंगा, बाकी सभी को ब्लॉक कर दूंगा। अगर मैं उन पर प्रत्यक्ष IO का उपयोग करता हूं, तो यह बहुत धीमा है। अगर मेरे पास सिर्फ 1 धागा था तो मैं अपने दम पर प्रबंधन कर सकता था, लेकिन 1 ट्रेड में विभिन्न IO प्राथमिकताओं का समर्थन करना कठिन होगा। AIO + CFQ वाउल्स वास्तव में एक अच्छा संयोजन प्रतीत होता है, अगर AIO काम करता है
n-अलेक्जेंडर

37
मैं असहमत हूं। डिस्क I / O को बफ़र किया जाता है लेकिन यह अवरुद्ध हो सकता है। जब पोल () फ़ाइल FD को आईएनजी करती है तो यह हमेशा रिपोर्ट करती है कि FD पठनीय है, तब भी जब यह ब्लॉक हो जाएगी। जब तक कोई थ्रेड्स या AIO का उपयोग नहीं करता है, तब तक डिस्क तरीके से डिस्क फ़ाइलों पर गैर-अवरुद्ध संचालन करना असंभव है।
होंग्ली

2
@ मैट: डेटाग्राम सॉकेट के लिए ऑर्डर महत्वपूर्ण नहीं है। @Zan: async I / O वास्तविक समय के स्ट्रीमिंग डेटा, जैसे मीडिया प्लेयर, के लिए बहुत अच्छा है।
बेन वोइगट

13
यह सच नहीं है कि AIO इवेंट-आधारित सिस्टम में बेकार है। आप वास्तव में उचित एआईओ के साथ शून्य-कॉपी नेटवर्किंग प्राप्त कर सकते हैं, जिसे आप पुनरावृत्ति () के लिए घटना-आधारित अधिसूचना के साथ नहीं कर सकते। अन्य चीजें इसे ज्यादातर सैद्धांतिक सीमा बनाने के लिए मान सकती हैं, लेकिन मुझे लगता है कि उचित AIO की कमी (विंडोज पर एक ला OVERLAPPED) लिनक्स में अंतिम बड़े छेदों में से एक है।
जॉन वाट

70

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

यदि आप सॉकेट I / O करने की तलाश कर रहे हैं, तो आप शायद उपरोक्त तंत्रों में से किसी एक का उपयोग करके बेहतर हैं।

AIO का मुख्य उद्देश्य अतुल्यकालिक डिस्क I / O की समस्या को हल करना है। यह सबसे अधिक संभावना है कि मैक ओएस एक्स केवल नियमित फ़ाइलों के लिए एआईओ का समर्थन करता है, न कि सॉकेट्स (क्योंकि केकेयू वैसे भी इतना बेहतर होता है)।

लिखने के संचालन को आमतौर पर कर्नेल द्वारा कैश किया जाता है और बाद में समय पर निकाल दिया जाता है। उदाहरण के लिए, जब ड्राइव का रीड हेड उस स्थान से होकर गुजरता है, जहां ब्लॉक लिखा जाना है।

हालाँकि, रीड ऑपरेशंस के लिए, यदि आप चाहते हैं कि कर्नेल आपके रीड्स को प्राथमिकता और ऑर्डर करे, तो AIO वास्तव में एकमात्र विकल्प है। यहां बताया गया है कि कर्नेल किसी भी उपयोगकर्ता स्तर के आवेदन से बेहतर (सैद्धांतिक रूप से) क्यों कर सकता है:

  • कर्नेल सभी डिस्क I / O को देखता है, न कि आपके एप्लिकेशन डिस्क जॉब्स को, और वैश्विक स्तर पर उन्हें ऑर्डर कर सकता है
  • कर्नेल (हो सकता है) यह जानता है कि डिस्क कहां पढ़ा गया है, और आप उस पर से गुजरने वाले पढ़े हुए कामों को चुन सकते हैं, ताकि सबसे कम दूरी तय की जा सके।
  • कर्नेल आपके रीड ऑपरेशंस को और बेहतर बनाने के लिए देशी कमांड कतार का लाभ उठा सकता है
  • आप रीडओव () की तुलना में lio_listio () का उपयोग करके प्रति सिस्टम कॉल पर अधिक रीड ऑपरेशंस जारी करने में सक्षम हो सकते हैं, खासकर यदि आपका रीड्स (तार्किक रूप से) संक्रामक नहीं है, तो सिस्टम कॉल ओवरहेड का एक छोटा सा बचत करना।
  • आपका कार्यक्रम AIO के साथ थोड़ा सरल हो सकता है क्योंकि आपको पढ़ने या लिखने के लिए कॉल करने के लिए अतिरिक्त थ्रेड की आवश्यकता नहीं है।

उदाहरण के लिए, पॉज़िक्स AIO में एक बहुत ही अजीब इंटरफ़ेस है:

  • ईवेंट कॉलबैक के एकमात्र कुशल और अच्छी तरह से समर्थित साधन सिग्नल के माध्यम से होते हैं, जो लाइब्रेरी में उपयोग करना कठिन बनाता है, क्योंकि इसका मतलब है प्रक्रिया-ग्लोबल सिग्नल नेमस्पेस से सिग्नल नंबर का उपयोग करना। यदि आपका ओएस रियलटाइम सिग्नल का समर्थन नहीं करता है, तो इसका मतलब यह भी है कि आपको अपने सभी बकाया अनुरोधों के माध्यम से यह पता लगाना होगा कि वास्तव में कौन समाप्त हुआ है (उदाहरण के लिए मैक ओएस एक्स के लिए यह मामला है, लिनक्स नहीं)। बहु-थ्रेडेड वातावरण में सिग्नल पकड़ना कुछ मुश्किल प्रतिबंधों के लिए भी बनाता है। आप आमतौर पर सिग्नल हैंडलर के अंदर की घटना पर प्रतिक्रिया नहीं दे सकते हैं, लेकिन आपको एक सिग्नल उठाना होगा, एक पाइप को लिखना होगा या सिग्नलफेड () (लिनक्स पर) का उपयोग करना होगा।
  • lio_suspend () में सेलेक्ट () के समान ही मुद्दे हैं, यह नौकरियों की संख्या के साथ बहुत अच्छा नहीं है।
  • lio_listio (), जैसा कि कार्यान्वित किया गया है काफी सीमित संख्या में नौकरियां हैं जो आप पास कर सकते हैं, और इस सीमा को पोर्टेबल तरीके से ढूंढना तुच्छ नहीं है। आपको sysconf (_SC_AIO_LISTIO_MAX) को कॉल करना होगा, जो विफल हो सकता है, इस स्थिति में आप AIO_LISTIO_MAX परिभाषित का उपयोग कर सकते हैं, जो आवश्यक रूप से परिभाषित नहीं हैं, लेकिन फिर आप 2 का उपयोग कर सकते हैं, जिसे समर्थित होने की गारंटी के रूप में परिभाषित किया गया है।

पॉज़िक्स एआईओ का उपयोग करके वास्तविक दुनिया के आवेदन के लिए, आप लाइटटैप (लाइटी) पर एक नज़र डाल सकते हैं, जिसने समर्थन शुरू करते समय एक प्रदर्शन माप भी पोस्ट किया ।

अधिकांश पॉज़िक्स प्लेटफ़ॉर्म अब तक पॉज़िक्स एआईओ (लिनक्स, बीएसडी, सोलारिस, एआईएक्स, ट्रू 64) का समर्थन करते हैं। विंडोज अपनी ओवरलैप की गई फ़ाइल I / O के माध्यम से इसका समर्थन करता है। मेरी समझ यह है कि केवल सोलारिस, विंडोज और लिनक्स वास्तव में एसिंक्स का समर्थन करते हैं। फ़ाइल I / O ड्राइवर के लिए नीचे सभी तरह से है, जबकि अन्य OSes async का अनुकरण करते हैं। कर्नेल थ्रेड्स के साथ I / O। लिनक्स अपवाद है, glibc में इसका पॉज़िक्स AIO कार्यान्वयन उपयोगकर्ता स्तर के थ्रेड्स के साथ async ऑपरेशंस का अनुकरण करता है, जबकि इसका मूल async I / O इंटरफ़ेस (io_submit () आदि) सही मायने में अतुल्यकालिक ड्राइवर के लिए नीचे है, यह मानते हुए कि ड्राइवर इसका समर्थन करता है। ।

मेरा मानना ​​है कि OSS में किसी भी fd के लिए posix AIO का समर्थन नहीं करना, लेकिन इसे नियमित फ़ाइलों तक सीमित रखना सामान्य है।


Win32 पहली बार सामने आने के बाद से विंडोज़ में OVERLAPPED I / O सपोर्टिंग डिस्क फाइल्स हैं। यह बिल्कुल भी नया नहीं है। और POSIX पर, सिग्नल नेमस्पेस प्रोसेस-ग्लोबल नहीं है, यह प्रति-धागा है। संकेतों को विशेष थ्रेड्स में वितरित किया जाता है (या यह एक अपवाद है कि कुछ के लिए याद नहीं कर सकते हैं?)।
बेन वोइगट

1
यह निर्दिष्ट करने का कोई तरीका नहीं है कि कौन सा धागा AIO इसके संकेतों को वितरित करता है। Linux पर यह ज्यादातर उस थ्रेड को डिलीवर करने के लिए लगता है जो aio _ * () कमांड जारी करता है, लेकिन हमेशा नहीं (केवल इसका एक ही उपाय जो मैंने पाया है वह है कई सिग्नलफॉड बनाना)। कुछ साल पहले कर्नेल मेलिंग सूची में एक लिनक्स पैच अप था जो इसे जोड़ देगा, लेकिन इसने इसे कभी नहीं बनाया, और यह POSIX के लिए एक एक्सटेंशन होता। मैक ओएस एक्स पर, संकेत मुख्य रूप से मुख्य थ्रेड (मेरे अनुभव में) को वितरित किए जाते हैं। मुझे नहीं लगता कि पोसिक्स को एक विशिष्ट व्यवहार की आवश्यकता है, अगर ऐसा होता है, तो मैं कल्पना का हिस्सा देखना पसंद करूंगा।
अरविद

5
aio_read / लिखने के glibc के कार्यान्वयन से यूजरलैंड में थ्रेड्स का उपयोग होता है, इसलिए यहां कर्नेल थ्रेड्स का भी उपयोग नहीं किया जाता है।
मार्जेन

"हमेशा आम तौर पर" का क्या अर्थ है? किसी भी विधि के लिए कर्नेल द्वारा लिखित या AIO का उपयोग करते समय लिखा जाता है? ऐसा लगता है कि सॉफ्टवेयर का एक तरीका होना चाहिए निश्चित रूप से लिखना सफलतापूर्वक पूरा किया गया था; अन्यथा, अखंडता और लेन-देन के लक्ष्यों को पूरा नहीं किया जा सकता है।
20

एक और जीवंत उदाहरण जहां आप AIO का उपयोग कर सकते हैं nginx है। सभी मोड समर्थित हैं। यदि आप उपयोगकर्ता के थ्रेड्स को लोड करना पसंद करते हैं, तो आप सामान्य रूप से इसे प्रत्यक्ष IO से बहुत खराब पाएंगे, लेकिन लिनक्स के मूल AIO प्रत्यक्ष IO के बराबर है। स्थिति जब AIO काफी फायदेमंद हो सकती है गंभीर पृष्ठ कैश दबाव है। Async और Direct IOs के बीच वैचारिक अंतर को यहाँ ftp.dei.uc.pt/pub/linux/kernel/people/suparna/aio-linux.pdf पर
wick

11

एक libtorrent डेवलपर इस पर एक रिपोर्ट प्रदान करता है: http://blog.libtorrent.org/2012/10/asynchronous-dit-//


5
वह अरविद होगा, जिसने ऊपर भी जवाब दिया :)
dpn

बहुत बढ़िया रिपोर्ट। बहुत शिक्षाप्रद। साझा करने के लिए धन्यवाद।
चामिक

2

Aio_write है - glibc में कार्यान्वित किया गया; aio_read या aio_write फ़ंक्शन की पहली कॉल उस थ्रेड के लिए कई उपयोगकर्ता मोड थ्रेड्स, aio_write या aio_read पोस्ट अनुरोधों को बताती है, थ्रेड pread / pwrite करता है और जब यह समाप्त हो जाता है तो उत्तर को अवरुद्ध कॉलिंग थ्रेड पर वापस पोस्ट किया जाता है।

वहाँ भी 'असली' aio है - कर्नेल स्तर द्वारा समर्थित (इसके लिए लाइबियो की आवश्यकता है, देखें io_suber कॉल http://linux.die.net/man/2/io_submit ); इसके लिए O_DIRECT की भी आवश्यकता है (सभी फ़ाइल सिस्टम द्वारा समर्थित नहीं किया जा सकता है, लेकिन प्रमुख इसका समर्थन करते हैं)

यहाँ देखें:

http://lse.sourceforge.net/io/aio.html

http://linux.die.net/man/2/io_submit

लिनक्स पर POSIX AIO और लाइबियो के बीच अंतर?


ढेरों कमियों में से कई aio_writeऊपर कवर की गई हैं, stackoverflow.com/a/5307557/13564 में
ग्लिफ़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.