2015-03-12 8 views
15

मैं कच्चे ब्लॉक डिवाइस फ़ाइल से सीधे पढ़कर एक एसएसडी ड्राइव से डेटा पढ़ने के लिए एक सी प्रोग्राम लिख रहा हूं।लिनक्स कर्नेल असीमित I/O (एआईओ) अनुरोधों को कैसे संभालता है?

मैं लिनक्स एआईओ (मैं लिनक्स एआईओ एपीआई के बारे में बात कर रहा हूं, यानी linuxaio.h, io_submit(...) आदि द्वारा प्रदान किए गए कार्यों, POSIX एआईओ एपीआई नहीं) की कोशिश कर रहा हूं। मैं O_DIRECT ध्वज का उपयोग कर ब्लॉक डिवाइस फ़ाइल खोलता हूं और मैं सुनिश्चित करता हूं कि मैं बफर को लिखने के लिए ब्लॉक आकार के साथ गठबंधन कर रहा हूं।

मैंने देखा कि लिनक्स एआईओ यह O_DIRECT ध्वज के साथ सिंक्रोनस आईओ का उपयोग करने से काफी तेज है।

जो चीज़ मुझे सबसे ज्यादा हैरान करती है वह यह है कि लिनक्स एआईओ के साथ प्रत्येक केबी के कई छोटे यादृच्छिक पढ़ने को प्राप्त करने वाले थ्रूपुट को सिंक्रोनस I का उपयोग करके कुछ एमबी के बड़े (क्रमिक) पढ़ने के माध्यम से उल्लेखनीय रूप से अधिक होता है।/ओ और O_DIRECT

तो, मैं जानना चाहता हूं: लिनक्स एआईओ कैसे सिंक्रोनस I/O से बेहतर है? जब एआईओ का उपयोग किया जाता है तो कर्नेल क्या करता है? क्या कर्नेल अनुरोध को पुन: व्यवस्थित करता है? क्या लिनक्स एआईओ का उपयोग सिंक्रोनस I/O का उपयोग करने से अधिक CPU उपयोग में होता है?

धन्यवाद अग्रिम में एक बहुत

+0

एआईओ तेज़ है क्योंकि इसका नाम है। इसके असीमित, मूल रूप से सभी आईओ स्मृति के लिए किया जाता है और अंतर्निहित डिस्क नहीं। –

+4

@ मिलिने: यह बिल्कुल बिल्कुल समझ में नहीं आता है। डिस्क से यादृच्छिक पढ़ने के लिए पूरी तरह से डिस्क से भौतिक I/O की आवश्यकता होती है। डिस्क से स्मृति में उन बाइट्स को जादू करने का कोई तरीका नहीं है। – MSalters

+0

मेरा मतलब था कि आईओ ज्यादातर स्मृति से किया जाता है जहां डेटा कैश किया जाता है। लिखा जाने वाला डेटा स्मृति में लोड किया गया है और फिर io को एप्लिकेशन में वापस कर दिया गया है। और स्मृति में वह पृष्ठ गंदा चिह्नित है। तो इसकी फाइल सिस्टम को उस पृष्ठ को डिस्क पर फ़्लश करने के लिए .. डायरेक्टियो के मामले में .. io तब तक वापस नहीं किया जाता है जब तक डेटा डिस्क पर लिखा नहीं जाता है –

उत्तर

20

लघु जवाब: सबसे अधिक संभावना AIO कार्यान्वयन "तेजी" क्योंकि यह समानांतर में कई IOS प्रस्तुत है, तुल्यकालिक कार्यान्वयन है, जबकि या तो शून्य या एक मैं/उड़ान में हे । इसमें स्मृति के साथ या सिंक्रोनस I/O के लिए अतिरिक्त ओवरहेड वाले कर्नेल I/O पथ के साथ लिखने के लिए कुछ भी नहीं है।

आप इसे iostat -x -d 1 का उपयोग करके देख सकते हैं। avgqu-sz (औसत कतार आकार = इन-फ्लाइट I/Os की औसत संख्या) और % उपयोग (उपयोग = उस डिवाइस का प्रतिशत जिस पर डिवाइस को कम से कम एक I/O जारी किया गया था) देखें ।

लांग जवाब:

  • "तेजी" की अवधारणा को मुश्किल जब मैं के बारे में बात कर रही है/हे। क्या "तेज" का मतलब उच्च बैंडविड्थ है? या यह कम विलंबता है? या किसी दिए गए अनुरोध आकार पर बैंडविड्थ? या किसी दिए गए कतार गहराई पर विलंबता? या विलंबता, बैंडविड्थ, अनुरोध आकार, कतार गहराई, और कई अन्य पैरामीटर या वर्कलोड का संयोजन? मुझे लगता है कि आप थ्रूपुट/बैंडविड्थ ले रहे हैं, हालांकि, यह याद रखना अच्छा है कि स्टोरेज डिवाइस का प्रदर्शन एकल आयाम मीट्रिक नहीं है।

  • एसएसडी अत्यधिक समानांतर डिवाइस हैं। एक एसएसडी कई फ्लैश चिप्स से बना होता है, प्रत्येक चिप में गुणक मर जाते हैं जो स्वतंत्र रूप से पढ़/लिख सकते हैं। एसएसडी इसका लाभ उठाते हैं और प्रतिक्रिया समय में उल्लेखनीय वृद्धि के बिना समानांतर में कई I/Os निष्पादित करते हैं। इसलिए, थ्रूपुट के मामले में, यह बहुत मायने रखता है कि एसएसडी कितने समवर्ती I/Os को देखता है।

  • आइए समझें कि थ्रेड एक सिंक्रोनस I/O सबमिट करते समय क्या होता है: ए) धागा कुछ CPU चक्र I/O अनुरोध तैयार करता है (डेटा उत्पन्न करता है, गणना उत्पन्न करता है, डेटा को बफर में कॉपी करता है, आदि) बी) सिस्टम कॉल किया जाता है (उदाहरण के लिए प्रीड()), निष्पादन कर्नेल स्पेस, और थ्रेड ब्लॉक को पास करता है, सी) I/O अनुरोध कर्नेल & द्वारा संसाधित किया जाता है, विभिन्न कर्नेल I/O परतों को ट्रैवर करता है, डी) I/O अनुरोध डिवाइस पर सबमिट किया गया है और इंटरकनेक्ट (जैसेपीसीआईई), ई) आई/ओ अनुरोध एसएसडी फर्मवेयर द्वारा संसाधित किया जाता है, एफ) वास्तविक पठन कमांड उचित फ्लैश चिप को भेजता है, जी) एसएसडी नियंत्रक डेटा के लिए इंतजार कर रहा है, एच) एसएसडी नियंत्रक से डेटा प्राप्त होता है फ्लैश चिप और इंटरकनेक्ट के माध्यम से भेजता है। इस बिंदु पर डेटा एसएसडी छोड़ देता है और चरण ई-ए) विपरीत में होता है।

  • जैसा कि आप देख सकते हैं, सिंक्रोनस I/O प्रक्रिया एसएसडी के साथ अनुरोध पिंग-पोंग खेल रही है। ऊपर वर्णित कई चरणों के दौरान फ्लैश चिप्स से वास्तव में कोई डेटा नहीं पढ़ा जाता है। इसके शीर्ष पर, हालांकि आपका एसएसडी समानांतर में सैकड़ों अनुरोधों को दसियों तक संसाधित कर सकता है, लेकिन यह किसी भी समय के किसी भी समय अनुरोध पर देखता है। इसलिए, थ्रूपुट बहुत कम है क्योंकि आप वास्तव में वास्तव में एसएसडी का उपयोग नहीं कर रहे हैं।

  • असिंक्रोनस I/O दो तरीकों से मदद करता है: ए) यह प्रक्रिया को समानांतर में एकाधिक I/O अनुरोध सबमिट करने की अनुमति देता है (एसएसडी में व्यस्त रखने के लिए पर्याप्त काम है), और बी) यह पाइपलाइनिंग I/Os के माध्यम से विभिन्न प्रसंस्करण चरणों (इसलिए थ्रूपुट से चरण विलंबता decoupling)।

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

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

    एसिंक्रोनस और सिंक्रोनस I/O के बीच मुख्य अंतर I/O & प्रक्रियाओं को शेड्यूलिंग और प्रोग्रामिंग मॉडल पर कैसे आते हैं। Async & दोनों सिंक I/O एक ही आईओपीएस/थ्रूपुट को स्टोरेज डिवाइस से सही कर सकते हैं यदि सही हो।

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